AVR УРОК 37. Модуль LCD 16×2. МЕНЮ. Часть 2

 

 

 

    Урок 37

Часть 2

Модуль LCD 16×2 .МЕНЮ

 

В предыдущей части нашего занятия мы создали проект, добавили ряд функций, а также написали уже немало кода. Но так как нам ещё писать очень много, то давайте продолжим.

Заполним кодом следующий кейс

case MAIN_MENU_STATE_WAIT: //Ожидаем выбора меню

  if(button_state[Button_Right]&ST_UNPRESSURE)

  {

    SetButtonState(Button_Right,ST_LOCKED);

    ResetButtonState(Button_Right,ST_UNPRESSURE);

    SetButtonState(Button_Right,ST_PRESSURE);

    //обработка нажатия кнопки

    _delay_ms(50);

    ResetButtonState(Button_Right,ST_LOCKED);

    main_menu_state = MAIN_MENU_STATE_MM1_WAIT;

  }

break;

Напишем ещё одну функцию, заставляющую мигать пункт меню

//——————————————————

//мигание пункта меню

void BlinkItem(unsigned char ind)

{

if(ind<3) setpos(ind*5,0);

else setpos((ind-3)*5,1);

if(tim_cnt<500) str_lcd(str1[ind]);

else str_lcd(» «);

}

//——————————————————

Добавим для неё прототип вверху файла

void MainMenuProcess(void);

void BlinkItem(unsigned char ind);

//————————————————————

Вставляем код в следующий кейс

case MAIN_MENU_STATE_MM1_WAIT: //ожидание выбора 1 пункта

  BlinkItem(0);

  //правая клавиша

  if(button_state[Button_Right]&ST_UNPRESSURE)

  {

    SetButtonState(Button_Right,ST_LOCKED);

    ResetButtonState(Button_Right,ST_UNPRESSURE);

    SetButtonState(Button_Right,ST_PRESSURE);

    //обработка нажатия кнопки

    _delay_ms(50);

    ResetButtonState(Button_Right,ST_LOCKED);

    main_menu_state = MAIN_MENU_STATE_MM2_WAIT;

    setpos(0,0);

    str_lcd(str1[0]); //зажжем 1 пункт, а то вдруг он в потухшем состоянии

  }

  //левая клавиша

  if(button_state[Button_Left]&ST_UNPRESSURE)

  {

    SetButtonState(Button_Left,ST_LOCKED);

    ResetButtonState(Button_Left,ST_UNPRESSURE);

    SetButtonState(Button_Left,ST_PRESSURE);

    //обработка нажатия кнопки

    _delay_ms(50);

    ResetButtonState(Button_Left,ST_LOCKED);

    main_menu_state = MAIN_MENU_STATE_EXIT_WAIT;

    setpos(0,0);

    str_lcd(str1[0]); //зажжем 1 пункт, а то вдруг он в потухшем состоянии

  }

  //клавиша вниз

  if(button_state[Button_Down]&ST_UNPRESSURE)

  {

    SetButtonState(Button_Down,ST_LOCKED);

    ResetButtonState(Button_Down,ST_UNPRESSURE);

    SetButtonState(Button_Down,ST_PRESSURE);

    //обработка нажатия кнопки

    _delay_ms(50);

    ResetButtonState(Button_Down,ST_LOCKED);

    main_menu_state = MAIN_MENU_STATE_MM4_WAIT;

    setpos(0,0);

    str_lcd(str1[0]); //зажжем 1 пункт, а то вдруг он в потухшем состоянии

  }

  //клавиша SELECT

  if(button_state[Button_Select]&ST_UNPRESSURE)

  {

    SetButtonState(Button_Select,ST_LOCKED);

    ResetButtonState(Button_Select,ST_UNPRESSURE);

    SetButtonState(Button_Select,ST_PRESSURE);

    //обработка нажатия кнопки

    _delay_ms(50);

    ResetButtonState(Button_Select,ST_LOCKED);

    main_menu_state = MAIN_MENU_STATE_MM1;

    setpos(0,0);

    str_lcd(str1[0]); //зажжем 1 пункт, а то вдруг он в потухшем состоянии

  }

  break;

 

 

Добавим код в следующие четыре подобных кейса

MAIN_MENU_STATE_MM2_WAIT

case MAIN_MENU_STATE_MM2_WAIT: //ожидание выбора 2 пункта

  BlinkItem(1);

  //правая клавиша

  if(button_state[Button_Right]&ST_UNPRESSURE)

  {

    SetButtonState(Button_Right,ST_LOCKED);

    ResetButtonState(Button_Right,ST_UNPRESSURE);

    SetButtonState(Button_Right,ST_PRESSURE);

    //обработка нажатия кнопки

    _delay_ms(50);

    ResetButtonState(Button_Right,ST_LOCKED);

    main_menu_state = MAIN_MENU_STATE_MM3_WAIT;

    setpos(5,0);

    str_lcd(str1[1]); //зажжем 2 пункт, а то вдруг он в потухшем состоянии

  }

  //левая клавиша

  if(button_state[Button_Left]&ST_UNPRESSURE)

  {

    SetButtonState(Button_Left,ST_LOCKED);

    ResetButtonState(Button_Left,ST_UNPRESSURE);

    SetButtonState(Button_Left,ST_PRESSURE);

    //обработка нажатия кнопки

    _delay_ms(50);

    ResetButtonState(Button_Left,ST_LOCKED);

    main_menu_state = MAIN_MENU_STATE_MM1_WAIT;

    setpos(5,0);

    str_lcd(str1[1]); //зажжем 2 пункт, а то вдруг он в потухшем состоянии

  }

  //клавиша вниз

  if(button_state[Button_Down]&ST_UNPRESSURE)

  {

    SetButtonState(Button_Down,ST_LOCKED);

    ResetButtonState(Button_Down,ST_UNPRESSURE);

    SetButtonState(Button_Down,ST_PRESSURE);

    //обработка нажатия кнопки

    _delay_ms(50);

    ResetButtonState(Button_Down,ST_LOCKED);

    main_menu_state = MAIN_MENU_STATE_MM5_WAIT;

    setpos(5,0);

    str_lcd(str1[1]); //зажжем 2 пункт, а то вдруг он в потухшем состоянии

  }

  //клавиша SELECT

  if(button_state[Button_Select]&ST_UNPRESSURE)

  {

    SetButtonState(Button_Select,ST_LOCKED);

    ResetButtonState(Button_Select,ST_UNPRESSURE);

    SetButtonState(Button_Select,ST_PRESSURE);

    //обработка нажатия кнопки

    _delay_ms(50);

    ResetButtonState(Button_Select,ST_LOCKED);

    main_menu_state = MAIN_MENU_STATE_MM2;

    setpos(5,0);

    str_lcd(str1[1]); //зажжем 2 пункт, а то вдруг он в потухшем состоянии

  }

  break;

MAIN_MENU_STATE_MM3_WAIT

case MAIN_MENU_STATE_MM3_WAIT: //ожидание выбора 3 пункта

  BlinkItem(2);

  //правая клавиша

  if(button_state[Button_Right]&ST_UNPRESSURE)

  {

    SetButtonState(Button_Right,ST_LOCKED);

    ResetButtonState(Button_Right,ST_UNPRESSURE);

    SetButtonState(Button_Right,ST_PRESSURE);

    //обработка нажатия кнопки

    _delay_ms(50);

    ResetButtonState(Button_Right,ST_LOCKED);

    main_menu_state = MAIN_MENU_STATE_MM4_WAIT;

    setpos(10,0);

    str_lcd(str1[2]); //зажжем 3 пункт, а то вдруг он в потухшем состоянии

  }

  //левая клавиша

  if(button_state[Button_Left]&ST_UNPRESSURE)

  {

    SetButtonState(Button_Left,ST_LOCKED);

    ResetButtonState(Button_Left,ST_UNPRESSURE);

    SetButtonState(Button_Left,ST_PRESSURE);

    //обработка нажатия кнопки

    _delay_ms(50);

    ResetButtonState(Button_Left,ST_LOCKED);

    main_menu_state = MAIN_MENU_STATE_MM2_WAIT;

    setpos(10,0);

    str_lcd(str1[2]); //зажжем 3 пункт, а то вдруг он в потухшем состоянии

  }

  //клавиша вниз

  if(button_state[Button_Down]&ST_UNPRESSURE)

  {

    SetButtonState(Button_Down,ST_LOCKED);

    ResetButtonState(Button_Down,ST_UNPRESSURE);

    SetButtonState(Button_Down,ST_PRESSURE);

    //обработка нажатия кнопки

    _delay_ms(50);

    ResetButtonState(Button_Down,ST_LOCKED);

    main_menu_state = MAIN_MENU_STATE_EXIT_WAIT;

    setpos(10,0);

    str_lcd(str1[2]); //зажжем 3 пункт, а то вдруг он в потухшем состоянии

  }

  //клавиша SELECT

  if(button_state[Button_Select]&ST_UNPRESSURE)

  {

    SetButtonState(Button_Select,ST_LOCKED);

    ResetButtonState(Button_Select,ST_UNPRESSURE);

    SetButtonState(Button_Select,ST_PRESSURE);

    //обработка нажатия кнопки

    _delay_ms(50);

    ResetButtonState(Button_Select,ST_LOCKED);

    main_menu_state = MAIN_MENU_STATE_MM3;

    setpos(10,0);

    str_lcd(str1[2]); //зажжем 3 пункт, а то вдруг он в потухшем состоянии

  }

  break;

MAIN_MENU_STATE_MM4_WAIT

case MAIN_MENU_STATE_MM4_WAIT: //ожидание выбора 4 пункта

  BlinkItem(3);

  //правая клавиша

  if(button_state[Button_Right]&ST_UNPRESSURE)

  {

    SetButtonState(Button_Right,ST_LOCKED);

    ResetButtonState(Button_Right,ST_UNPRESSURE);

    SetButtonState(Button_Right,ST_PRESSURE);

    //обработка нажатия кнопки

    _delay_ms(50);

    ResetButtonState(Button_Right,ST_LOCKED);

    main_menu_state = MAIN_MENU_STATE_MM5_WAIT;

    setpos(0,1);

    str_lcd(str1[3]); //зажжем 4 пункт, а то вдруг он в потухшем состоянии

  }

  //левая клавиша

  if(button_state[Button_Left]&ST_UNPRESSURE)

  {

    SetButtonState(Button_Left,ST_LOCKED);

    ResetButtonState(Button_Left,ST_UNPRESSURE);

    SetButtonState(Button_Left,ST_PRESSURE);

    //обработка нажатия кнопки

    _delay_ms(50);

    ResetButtonState(Button_Left,ST_LOCKED);

    main_menu_state = MAIN_MENU_STATE_MM3_WAIT;

    setpos(0,1);

    str_lcd(str1[3]); //зажжем 4 пункт, а то вдруг он в потухшем состоянии

  }

  //клавиша вверх

  if(button_state[Button_Up]&ST_UNPRESSURE)

  {

    SetButtonState(Button_Up,ST_LOCKED);

    ResetButtonState(Button_Up,ST_UNPRESSURE);

    SetButtonState(Button_Up,ST_PRESSURE);

    //обработка нажатия кнопки

    _delay_ms(50);

    ResetButtonState(Button_Up,ST_LOCKED);

    main_menu_state = MAIN_MENU_STATE_MM1_WAIT;

    setpos(0,1);

    str_lcd(str1[3]); //зажжем 4 пункт, а то вдруг он в потухшем состоянии

  }

  //клавиша SELECT

  if(button_state[Button_Select]&ST_UNPRESSURE)

  {

    SetButtonState(Button_Select,ST_LOCKED);

    ResetButtonState(Button_Select,ST_UNPRESSURE);

    SetButtonState(Button_Select,ST_PRESSURE);

    //обработка нажатия кнопки

    _delay_ms(50);

    ResetButtonState(Button_Select,ST_LOCKED);

    main_menu_state = MAIN_MENU_STATE_MM4;

    setpos(0,1);

    str_lcd(str1[3]); //зажжем 4 пункт, а то вдруг он в потухшем состоянии

  }

  break;

MAIN_MENU_STATE_MM5_WAIT

case MAIN_MENU_STATE_MM5_WAIT: //ожидание выбора 5 пункта

  BlinkItem(4);

  //правая клавиша

  if(button_state[Button_Right]&ST_UNPRESSURE)

  {

    SetButtonState(Button_Right,ST_LOCKED);

    ResetButtonState(Button_Right,ST_UNPRESSURE);

    SetButtonState(Button_Right,ST_PRESSURE);

    //обработка нажатия кнопки

    _delay_ms(50);

    ResetButtonState(Button_Right,ST_LOCKED);

    main_menu_state = MAIN_MENU_STATE_EXIT_WAIT;

    setpos(5,1);

    str_lcd(str1[4]); //зажжем 5 пункт, а то вдруг он в потухшем состоянии

  }

  //левая клавиша

  if(button_state[Button_Left]&ST_UNPRESSURE)

  {

    SetButtonState(Button_Left,ST_LOCKED);

    ResetButtonState(Button_Left,ST_UNPRESSURE);

    SetButtonState(Button_Left,ST_PRESSURE);

    //обработка нажатия кнопки

    _delay_ms(50);

    ResetButtonState(Button_Left,ST_LOCKED);

    main_menu_state = MAIN_MENU_STATE_MM4_WAIT;

    setpos(5,1);

    str_lcd(str1[4]); //зажжем 5 пункт, а то вдруг он в потухшем состоянии

  }

  //клавиша вверх

  if(button_state[Button_Up]&ST_UNPRESSURE)

  {

    SetButtonState(Button_Up,ST_LOCKED);

    ResetButtonState(Button_Up,ST_UNPRESSURE);

    SetButtonState(Button_Up,ST_PRESSURE);

    //обработка нажатия кнопки

    _delay_ms(50);

    ResetButtonState(Button_Up,ST_LOCKED);

    main_menu_state = MAIN_MENU_STATE_MM2_WAIT;

    setpos(5,1);

    str_lcd(str1[4]); //зажжем 5 пункт, а то вдруг он в потухшем состоянии

  }

  //клавиша SELECT

  if(button_state[Button_Select]&ST_UNPRESSURE)

  {

    SetButtonState(Button_Select,ST_LOCKED);

    ResetButtonState(Button_Select,ST_UNPRESSURE);

    SetButtonState(Button_Select,ST_PRESSURE);

    //обработка нажатия кнопки

    _delay_ms(50);

    ResetButtonState(Button_Select,ST_LOCKED);

    main_menu_state = MAIN_MENU_STATE_MM5;

    setpos(5,1);

    str_lcd(str1[4]); //зажжем 5 пункт, а то вдруг он в потухшем состоянии

}

break;

Соберём проект и посмотрим результат в протеусе

003

В следующей части занятия мы продолжим писать дальнейший исходный код.

 

Предыдущая часть Программирование МК AVR Следующая часть

Программатор и дисплей можно приобрести здесь:

Программатор (продавец надёжный) USBASP USBISP 2.0

Дисплей LCD 16×2 с кнопками

Смотреть ВИДЕОУРОК

AVR Модуль LCD 16x2. МЕНЮ

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*