Урок 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;
Добавим код в следующие четыре подобных кейса
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;
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;
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;
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;
Соберём проект и посмотрим результат в протеусе
В следующей части занятия мы продолжим писать дальнейший исходный код.
Предыдущая часть Программирование МК AVR Следующая часть
Приобрести программатор USBASP USBISP с адаптером можно здесь USBASP USBISP 3.3 с адаптером
Смотреть ВИДЕОУРОК в RuTube (нажмите на картинку)
Смотреть ВИДЕОУРОК в YouTube (нажмите на картинку)
Добавить комментарий