📄 lock_main.c
字号:
(*menu_card[user_choose].subs)();
}
WDR(); //喂狗
if(menu_card[user_choose].children_menus != null)
{
choose_temp=user_choose;
menu_card = menu_card[user_choose].children_menus; //把结构指针还指向子菜单
user_choose = 0;
}
break;
case 7: //返回
key=0;
menu_card= card_main_menu;
auto_return=88; //随便赋一个比OVER_FLOW大的数字,目的是退出子菜单,进入主屏
break;
case 8: //说明
key=0;
break;
default:
key=0;
break;
}
card_menu_show();
GICR|=(1<<INT1); //打开外部中断1***********************
key=0;
kk=0;
}
}
scan_en=0; //主菜单调用允许标志位
return_en=0; //菜单自动计时返回允许标志位
auto_return=0; //菜单自动计时返回变量
key=0; //按键值清0
return_temp=0; //返回临时变量清0
user_choose = 0;
choose_temp=0;
inc_card_en=0;
menu_card = card_main_menu; //把结构指针还指向主菜单
clear_screen(); //清除DDRAM--显示资料寄存器
GICR=((1<<INT1)|(1<<INT0)); //开外部中断0、1
}
//*********************************************字符消隐************************************************************
void char_twinkling(uchar data_1)
{
write_com(data_1);
write_com(data_1);
write_data(0x20); //设置时间时,字符闪动
write_data(0x20);
}
//**********************************************管理操作时的菜单***************************************************
void card_menu_show(void)
{
uchar n = 0;
WDR(); //喂狗
max_items = menu_card[0].menu_count;
if (max_items >= 3)
{
for (n = 0;n<3;n++)
{
switch(n)
{
case 0:
write_com(0x80);
break;
case 1:
write_com(0x90);
break;
case 2:
write_com(0x88);
break;
default:
break;
}
han_zi_display(menu_card[n].display_string);
if (n == user_choose)
{
switch(n)
{
case 0:
select_menu(0x80);
break;
case 1:
select_menu(0x90);
break;
case 2:
select_menu(0x88);
break;
default:
break;
}
}
}
}
else //子菜单选择
{
clear_screen();
for (n = 0;n<max_items;n++)
{
write_com(0x80);
switch(choose_temp)
{
case 0:
han_zi_display(" 1.添加新卡?");
break;
case 1:
han_zi_display(" 2.删除全部卡?");
break;
case 2:
han_zi_display(" 3.查询卡记录?");
break;
default:
break;
}
if(n==0)
{
write_com(0x88);
}
else if(n==1)
{
write_com(0x98);
}
han_zi_display(menu_card[n].display_string);
if (n == user_choose)
{
if(n==0)
{
select_menu(0x89);
}
else if(n==1)
{
select_menu(0x99);
}
}
}
}
}
//**********************************************UART初始化*********************************************************
void send_initial(void)
{
UBRRL= (F_CPU/BAUDRATE/16-1)%256;
UBRRH= (F_CPU/BAUDRATE/16-1)/256;
UCSRB=(1<<TXEN); //发送使能,
UCSRC=(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0); //无奇偶校验,设置帧格式: 8 个数据位, 1 个停止位
}
//*********************************************EEPROM 操作*********************************************************
//*********************************************写----EEPROM 操作***************************************************
void eeprom_write(uint eeprom_address, uchar eeprom_data)
{
CLI();
while(EECR & (1<<EEWE)); //等待上一次写操作结束
EEAR = eeprom_address; //设置地址和数据寄存器
EEDR = eeprom_data;
EECR |= (1<<EEMWE); //置位EEMWE
EECR |= (1<<EEWE); //置位EEWE 以启动写操作
SEI();
}
//********************************************读----EEPROM 操作****************************************************
uchar eeprom_read(uint eeprom_address)
{
CLI();
while(EECR & (1<<EEWE)); //等待上一次写操作结束
EEAR = eeprom_address; //设置地址寄存器
EECR |= (1<<EERE); //设置EERE 以启动读操作
SEI();
return EEDR; //自数据寄存器返回数据
}
//***********************************************LCD菜单设置*******************************************************
//说明:如果进入菜单在30秒内没有动作,将自动反回主画面
//*****************************************************************************************************************
void lcd_menu_set(void)
{
uchar tem_2[7]={0,0,0,0,0,0,0}; //日期、时间、星期数组备份
// 年/月/日/H/M/S/W
key=0;
menu_point = main_menu; //把结构指针还指向主菜单
user_choose=0;
clear_screen();
WDR();
show_menu(); //显示菜单
return_en=1; //打开菜单自动返回变量
GICR|=(1<<INT1); //打开外部中断1
while(auto_return<OVER_FLOW)
{
WDR(); //喂狗
if(kk)
{
kk=0;
auto_return=0; //清除菜单自动返回累计时间变量
read_adc();
buzzer_pro(1); //峰鸣器指示
LCD_BACK_ON; //打开LCD背光
lcd_back_en=0xaa; //打开计时变量
lcd_back_time=0; //计时变量清0
WDR(); //喂狗
switch(key)
{
case 0: //没有按下按键
break;
case 1: //设置
break;
case 2: //向上
key=0;
if (user_choose == 0)
{
user_choose = max_items;
}
user_choose --;
return_temp=0; //返回临时变量清0
break;
case 3: //向下
key=0;
user_choose ++;
if (user_choose == max_items)
{
user_choose = 0;
}
return_temp=0; //返回临时变量清0
break;
case 4: //向左
key=0;
if(left_right==0)
{
left_right=6;
}
left_right--;
twinkling_addr_pro(); //调用闪动地址选择
break;
case 5: //向右
key=0;
left_right++;
if(left_right>=6)
{
left_right=0;
}
twinkling_addr_pro(); //调用闪动地址选择
break;
case 6: //确认
key=0;
if(set_time_temp==1)
{
auto_return=88; //随便赋一个比OVER_FLOW大的数字,目的是退出子菜单,进入主屏
set_time_temp=0;
clear_screen();
write_com(0x90);
han_zi_display(" 时间设置完成");
delay_ms(2000);
break;
}
if (menu_point[user_choose].subs != nullsubs)
{
left_right=0;
tem_2[0]=tem[0]; //把日期、时间变量做个备份
tem_2[1]=tem[1];
tem_2[2]=tem[2];
tem_2[3]=tem[3];
tem_2[4]=tem[4];
tem_2[5]=tem[5];
tem_2[6]=tem[6];
(*menu_point[user_choose].subs)();
}
else if(menu_point[user_choose].children_menus != null)
{
choose_temp=user_choose;
menu_point = menu_point[user_choose].children_menus; //把结构指针还指向子菜单
user_choose = 0;
}
break;
case 7: //返回
key=0;
return_temp++;
if(return_temp==1)
{
menu_point = main_menu;
user_choose = 0;
left_right=0;
if(set_time_temp==1)
{
clear_screen();
set_time_temp=0;
tem[0]=tem_2[0]; //还原设置前的日期、时间数据
tem[1]=tem_2[1];
tem[2]=tem_2[2];
tem[3]=tem_2[3];
tem[4]=tem_2[4];
tem[5]=tem_2[5];
tem[6]=tem_2[6];
auto_return=88; //随便赋一个比OVER_FLOW大的数字,目的是退出子菜单,进入主屏
break;
}
}
else
{
return_temp=0;
auto_return=88; //随便赋一个比OVER_FLOW大的数字,目的是退出子菜单,进入主屏
}
break;
case 8: //说明
key=0;
break;
default:
key=0;
break;
}
if(set_time_temp==0)
{
show_menu();
}
else //!=0表示菜单处在修改日期一栏
{
date_time_set();
}
key=0;
kk=0;
GICR|=(1<<INT1); //打开外部中断1
}
if(set_time_temp==1)
{
GICR&=~(1<<INT1); //关闭按键中断
key_inc_dec(); //按键+、-处理
GICR|=(1<<INT1); //打开按键中断
time_set_display();
delay_ms(100);
char_twinkling(twinkling_addr);
delay_ms(100);
}
}
clear_screen(); //清除DDRAM--显示资料寄存器
scan_en=0; //主菜单调用允许标志位
return_en=0; //菜单自动计时返回允许标志位
auto_return=0; //菜单自动计时返回变量
key=0; //按键值清0
return_temp=0; //返回临时变量清0
user_choose = 0;
menu_point = main_menu; //把结构指针还指向主菜单
set_time_temp=0; //日期、时间设置菜单变量
twinkling_addr=0x91;
left_right=0;
}
//***************************************************按键+、-处理**************************************************
void key_inc_dec(void)
{
if(key_inc==0)
{
delay_ms(5);
if(key_inc==0)
{
buzzer_pro(1); //峰鸣器指示
LCD_BACK_ON; //打开LCD背光
lcd_back_time=0; //计时变量清0
lcd_back_en=0xaa; //打开计时变量
auto_return=0; //清除菜单自动返回累计时间变量
switch(twinkling_addr)
{
case 0x88: //小时选项
do
{
tem[3]++;
if(tem[3]>=24)
{
tem[3]=0;
}
time_set_display(); //更新显示
delay_ms(200);
auto_return=0;
}
while(key_inc==0);
break;
case 0x8a: //分钟选项
do
{
tem[4]++;
if(tem[4]>=60)
{
tem[4]=0;
}
time_set_display(); //更新显示
delay_ms(120);
auto_return=0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -