/****************************************************************************************
简单菜单程序,八个按键.使用AVR单片机.2008/3/24--2008/3/29
编译器为ICCAVR7.14.晶振7.3728M,单片机为ATmega16(用ATmega32在proteus中仿真不成功!)
*****************************************************************************************/
#include
#include
#include
#include "menu.h" //所有变量定义以及函数声明均放在这个头文件里.
#include "delay.h"
#include "lcd_12864.h"
#include "get_key.h"
#define blueon PORTB|=(1<
#define blueoff PORTB&=~(1<
#define greenon PORTB|=(1<
#define greenoff PORTB&=~(1<
#define redon PORTB|=(1<
#define redoff PORTB&=~(1<
//SFR初始化.
void main_init(void)
{
DDRA=0xff; //A口设置为输出.
PORTA=0x00;
DDRB=0xff; //B口设置为输出.
PORTB=0x00;
// ASSR&=~(1<
DDRC=0x00; //C口设置为输入.
PORTC=0xff; //AVR没有上拉寄存器,在PORTC中写1即表示打开上拉了.
DDRD=0x00; //D口设置为输入.
PORTD=0xff; //打开D口上拉.
}
void main_menu_initial(void) //LED主菜单初始化.
{
main_menu[0].menu_count=3; //有三个菜单项.
main_menu[0].display=blue;
main_menu[0].subs=NULL; //点亮兰灯
main_menu[0].children_menus=blue_menu;
main_menu[0].parent_menus=NULL;
main_menu[1].menu_count=3;
main_menu[1].display=green; //点亮绿灯
main_menu[1].subs=NULL;
main_menu[1].children_menus=green_menu;
main_menu[1].parent_menus=NULL;
main_menu[2].menu_count=3;
main_menu[2].display=red; //点亮红灯.
main_menu[2].subs=openred;
main_menu[2].children_menus=NULL;
main_menu[2].parent_menus=NULL;
}
void blue_menu_initial(void)
{
blue_menu[0].menu_count=2;
blue_menu[0].display=qr; //点亮兰灯,确认.
blue_menu[0].subs=openblue;
blue_menu[0].children_menus=NULL;
blue_menu[0].parent_menus=main_menu;
blue_menu[1].menu_count=2;
blue_menu[1].display=qx; //取消.
blue_menu[1].subs=closeblue;
blue_menu[1].children_menus=NULL;
blue_menu[1].parent_menus=main_menu;
}
void green_menu_initial(void)
{
green_menu[0].menu_count=2;
green_menu[0].display=qr; //点亮绿灯---确认.
green_menu[0].subs=opengreen;
green_menu[0].children_menus=NULL;
green_menu[0].parent_menus=main_menu;
green_menu[1].menu_count=2;
green_menu[1].display=qx; //----取消.
green_menu[1].subs=closegreen;
green_menu[1].children_menus=NULL;
green_menu[1].parent_menus=main_menu;
}
void led_menu_pro(void)
{
max_item=menu_led->menu_count;
switch(keyval)
{
case 0: break;
case 1: //向上键.
if(user_choosen==0)
{
user_choosen=max_item;
}
refresh=1;
user_choosen--;
break;
case 2: //向下键.
user_choosen++;
if(user_choosen==max_item)
{
user_choosen=0;
}
refresh=1;
break;
case 3: //确认键.
if(menu_led[user_choosen].subs!=NULL)
{
(*menu_led[user_choosen].subs)(); //执行函数.
}
if(menu_led[user_choosen].children_menus!=NULL)
{
temp_choosen=user_choosen;
menu_led=menu_led[user_choosen].children_menus;
user_choosen=0;
}
refresh=1;
break;
case 4: //返回键.
if(menu_led[user_choosen].parent_menus!=NULL)
{
menu_led=menu_led[user_choosen].parent_menus;
}
refresh=1;
break;
default:
『本文转载自网络,版权归原作者所有,如有侵权请联系删除』