?? 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; //把結(jié)構(gòu)指針還指向子菜單
user_choose = 0;
}
break;
case 7: //返回
key=0;
menu_card= card_main_menu;
auto_return=88; //隨便賦一個比OVER_FLOW大的數(shù)字,目的是退出子菜單,進(jìn)入主屏
break;
case 8: //說明
key=0;
break;
default:
key=0;
break;
}
card_menu_show();
GICR|=(1<<INT1); //打開外部中斷1***********************
key=0;
kk=0;
}
}
scan_en=0; //主菜單調(diào)用允許標(biāo)志位
return_en=0; //菜單自動計時返回允許標(biāo)志位
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; //把結(jié)構(gòu)指針還指向主菜單
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); //設(shè)置時間時,字符閃動
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); //發(fā)送使能,
UCSRC=(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0); //無奇偶校驗,設(shè)置幀格式: 8 個數(shù)據(jù)位, 1 個停止位
}
//*********************************************EEPROM 操作*********************************************************
//*********************************************寫----EEPROM 操作***************************************************
void eeprom_write(uint eeprom_address, uchar eeprom_data)
{
CLI();
while(EECR & (1<<EEWE)); //等待上一次寫操作結(jié)束
EEAR = eeprom_address; //設(shè)置地址和數(shù)據(jù)寄存器
EEDR = eeprom_data;
EECR |= (1<<EEMWE); //置位EEMWE
EECR |= (1<<EEWE); //置位EEWE 以啟動寫操作
SEI();
}
//********************************************讀----EEPROM 操作****************************************************
uchar eeprom_read(uint eeprom_address)
{
CLI();
while(EECR & (1<<EEWE)); //等待上一次寫操作結(jié)束
EEAR = eeprom_address; //設(shè)置地址寄存器
EECR |= (1<<EERE); //設(shè)置EERE 以啟動讀操作
SEI();
return EEDR; //自數(shù)據(jù)寄存器返回數(shù)據(jù)
}
//***********************************************LCD菜單設(shè)置*******************************************************
//說明:如果進(jìn)入菜單在30秒內(nèi)沒有動作,將自動反回主畫面
//*****************************************************************************************************************
void lcd_menu_set(void)
{
uchar tem_2[7]={0,0,0,0,0,0,0}; //日期、時間、星期數(shù)組備份
// 年/月/日/H/M/S/W
key=0;
menu_point = main_menu; //把結(jié)構(gòu)指針還指向主菜單
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: //設(shè)置
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(); //調(diào)用閃動地址選擇
break;
case 5: //向右
key=0;
left_right++;
if(left_right>=6)
{
left_right=0;
}
twinkling_addr_pro(); //調(diào)用閃動地址選擇
break;
case 6: //確認(rèn)
key=0;
if(set_time_temp==1)
{
auto_return=88; //隨便賦一個比OVER_FLOW大的數(shù)字,目的是退出子菜單,進(jìn)入主屏
set_time_temp=0;
clear_screen();
write_com(0x90);
han_zi_display(" 時間設(shè)置完成");
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; //把結(jié)構(gòu)指針還指向子菜單
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]; //還原設(shè)置前的日期、時間數(shù)據(jù)
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大的數(shù)字,目的是退出子菜單,進(jìn)入主屏
break;
}
}
else
{
return_temp=0;
auto_return=88; //隨便賦一個比OVER_FLOW大的數(shù)字,目的是退出子菜單,進(jìn)入主屏
}
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); //關(guān)閉按鍵中斷
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; //主菜單調(diào)用允許標(biāo)志位
return_en=0; //菜單自動計時返回允許標(biāo)志位
auto_return=0; //菜單自動計時返回變量
key=0; //按鍵值清0
return_temp=0; //返回臨時變量清0
user_choose = 0;
menu_point = main_menu; //把結(jié)構(gòu)指針還指向主菜單
set_time_temp=0; //日期、時間設(shè)置菜單變量
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;
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -