|
門禁系統(tǒng)原理圖:
1.png (120.46 KB, 下載次數(shù): 428)
下載附件
2016-3-30 14:10 上傳
0.png (50.85 KB, 下載次數(shù): 326)
下載附件
2016-3-30 14:08 上傳
全部資料下載:
一套完整的門禁系統(tǒng)(原理圖 源程序),包括電源充電.rar
(168.5 KB, 下載次數(shù): 1128)
2016-3-30 14:09 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
門禁系統(tǒng)源碼預(yù)覽(部分):
- /******************************************************************************************************************
- 程序名: 射頻卡門禁系統(tǒng)
- 功能概述:
- 1、 點(diǎn)陣LCD(128*64)顯示。在正常、設(shè)置情況下LCD顯示系統(tǒng)各個(gè)時(shí)期的菜單以供選擇。
- 2、 射頻卡開鎖,開鎖時(shí)用射頻卡放在讀卡器上(距離<15CM)即可開鎖,如果用非法卡連續(xù)刷寫次數(shù)超過3
- 次則報(bào)警(報(bào)警功能沒有添加),這時(shí)系統(tǒng)將關(guān)閉刷卡器30分鐘,在30分鐘后再允許刷卡。
- 3 本系統(tǒng)分為:
- 1)、1個(gè)主機(jī)。
- 2)、2個(gè)讀卡頭(一個(gè)在門外供刷卡用、一個(gè)在主機(jī)旁用于管理操作)
- 4、 本鎖開鎖時(shí)供電,平時(shí)斷電(12V)。
- 5、 8個(gè)按鍵(AD轉(zhuǎn)換采樣取值)(設(shè)置、+、-、↑、↓、確認(rèn)、返回、說明)
- 6、 每次按下鍵、刷卡時(shí)有峰鳴器指示
- 7、 LCD背光在有按鍵按下時(shí)、或刷卡時(shí)自動(dòng)點(diǎn)亮,延時(shí)30秒關(guān)閉
- 8、 門外有人體紅外傳感器探頭,發(fā)現(xiàn)2米內(nèi)有人,自動(dòng)進(jìn)入預(yù)警狀態(tài),如果是在晚上超過7點(diǎn)鐘,則點(diǎn)亮門前的燈泡照明,
- 如果此時(shí)有人破壞(比如取下燈泡、剪斷燈炮的線、打爛燈泡)也要報(bào)警。否則、連續(xù)在門前超過1分鐘,就開始報(bào)警。
- (此功能沒有添加)
- 9、 開門時(shí)發(fā)出“歡迎光臨”,并提示關(guān)門(此功能沒有添加)
- 10、 本機(jī)帶有門鈴,并能記錄前10天門鈴按下的次數(shù)。(此功能沒有添加)
- 11、 LCD顯示日期、星期、時(shí)間、室內(nèi)溫度、鎖的狀態(tài)、功能設(shè)置(菜單顯示)等
- 12、 可以查詢過去10天內(nèi)的開門記錄并由LCD顯示出來(此功能沒有添加)
- 13、 可以于電腦通過RS-232接口連接進(jìn)行通信,監(jiān)看門的狀態(tài)、開門記錄等,方便打印(此功能沒有添加)
- 14、 要求鎖誤判率小于1PPM
- 15、 系統(tǒng)配有UPS(12V) 平時(shí)用UPS電能,只有當(dāng)主機(jī)檢測(cè)到電壓低于11.5V時(shí),自動(dòng)接入火電進(jìn)行充電。
- 電瓶充滿時(shí)(大約5小時(shí))自動(dòng)斷電。
- 16、 電壓:12V
- 17、 電流:待機(jī)時(shí)<50MA
- 射頻卡類型: 4001、EM4100和含E2PROM的RF卡。如E5550。
- MCU類型: ATmega16
- 晶振頻率: 7.3728MHZ
- 版本: V0.1
- 編程: 于軍峰
- 編譯日期: 2007-05-01
- ******************************************************************************************************************/
- #include<iom16v.h>
- #include<macros.h>
- #include<stdio.h>
- #include"LCD_12864.H" //LCD頭文件
- #include"read_card.H" //讀卡頭文件
- #define key_inc (PINC&(1<<PC0)) //按鍵+,選擇日期、時(shí)間時(shí)用
- #define key_dec (PINC&(1<<PC1)) //按鍵-,選擇日期、時(shí)間時(shí)用
- #define BAUDRATE 9600 //波特率
- #define F_CPU 7372800 //晶振頻率
- #define LCD_LAMP 60 //LCD默認(rèn)30S后關(guān)閉
- #define BATTERY_TIME 5 //每十分鐘檢測(cè)一次電池電量
- #define ADC_PINA0 0x00 //ADC0 按鍵AD 單端通道,不放大
- #define ADC_PINA1 0x01 //ADC1 溫度采樣
- #define ADC_PINA2 0x02 //ADC2 電平電量檢測(cè)
- #define LCD_BACK_ON PORTC&=~(1<<PC5)
- #define LCD_BACK_OFF PORTC|=(1<<PC5)
- #define buzzer_on PORTD&=~(1<<PD7)
- #define buzzer_off PORTD|=(1<<PD7)
- #define charge_on PORTC&=~(1<<PC6)
- #define charge_off PORTC|=(1<<PC6)
- #define LOCK_ON PORTC&=~(1<<PC3)
- #define LOCK_OFF PORTC|=(1<<PC3)
- #define CHARGE_STATUS (PINC&(1<<PC2))
- #define null 0
- #define vref 5000 //AD轉(zhuǎn)換參考電壓
- #define OVER_FLOW 10 //進(jìn)入菜單設(shè)置時(shí),如果在10S內(nèi)沒有按下任何鍵,則自動(dòng)退出
- #pragma data:code
- //const uchar manage_card[5]={0x0b,0,0x2d,0x23,0x5f}; //住房卡-----當(dāng)作管理卡
- const uchar manage_card[5]={0x33,0,0x7c,0x09,0xb1}; //000 8128945-----當(dāng)作管理卡
- //*************************************************溫度測(cè)定查表****************************************************
- //******************************************溫度范圍是:-30度----+99度*********************************************
- const uint temp_1[130]={
- 4304,4270,4235,4198,4161,4122,4083,4042,4001,3958,
- 3914,3870,3824,3778,3731,3683,3635,3585,3535,3484,
- 3433,3381,3329,3276,3223,3169,3116,3062,3008,2953,
- 2899,2844,2789,2733,2678,2622,2568,2514,2459,2405,
- 2353,2299,2248,2196,2145,2095,2045,1996,1948,1901,
- 1854,1808,1763,1719,1676,1599,1590,1549,1508,1468,
- 1429,1391,1354,1318,1282,1247,1214,1181,1149,1117,
- 1087,1057,1028,1000,973 ,946 ,920 ,895 ,870 ,846 ,
- 823 ,800 ,777 ,755 ,755 ,713 ,692 ,673 ,654 ,632 ,
- 617 ,600 ,583 ,567 ,551 ,536 ,521 ,506 ,491 ,478 ,
- 465 ,452 ,440 ,428 ,417 ,405 ,394 ,384 ,373 ,364 ,
- 354 ,345 ,335 ,326 ,318 ,310 ,302 ,294 ,286 ,279 ,
- 271 ,265 ,258 ,252 ,245 ,239 ,233 ,227 ,222 ,216 ,
- };
- //*****************************************************************************************************************
- #pragma data:data
- uchar card_data[5][5]={
- {0,0,0,0,0}, //卡1
- {0,0,0,0,0}, //卡2
- {0,0,0,0,0}, //卡3
- {0,0,0,0,0}, //卡4
- {0,0,0,0,0}, //卡5
- };
- uchar tem[7]={7, 5, 1, 8, 0, 0, 6}; //日期、時(shí)間、星期數(shù)組
- // 年/月/日 /H /M /S /W
- //********************************************目錄結(jié)構(gòu)體定義*******************************************************
- struct menu_item
- {
- short menu_count;
- char *display_string;
- void (*subs)();
- struct menu_item *children_menus;
- struct menu_item *parent_menus;
- };
- //**********************************************結(jié)構(gòu)數(shù)組聲明*******************************************************
- struct menu_item main_menu[4];
- struct menu_item alarm_menu[2];
- struct menu_item infrared_menu[2];
- struct menu_item lamp_menu[2];
- struct menu_item (*menu_point) = main_menu;
- struct menu_item card_main_menu[4];
- struct menu_item card_inc_menu[2];
- struct menu_item card_dec_menu[2];
- struct menu_item (*menu_card) = card_main_menu;
- uchar user_choose = 0;
- uchar max_items=0;
- uint temp_value=0; //溫度檢測(cè)AD值
- //********************************************變量定義*************************************************************
- uchar second_temp=0; //秒變量
- uchar scan_en=0; //主屏掃描標(biāo)志位
- uchar key=0; //按鍵變量
- uchar kk=0; //按鍵按下標(biāo)志位
- uchar auto_return=0; //菜單自動(dòng)返回變量
- uchar return_en=0; //菜單自動(dòng)返回標(biāo)志位
- uchar left_right=0; //左右鍵變量
- uchar choose_temp=0; //子菜單標(biāo)題變量
- uchar return_temp=0; //返回臨時(shí)變量
- uchar set_time_temp=0; //設(shè)置時(shí)間時(shí)菜單變量,如果=1表示屏顯在設(shè)置時(shí)間菜單
- uchar twinkling_addr=0x91; //設(shè)置時(shí)間時(shí)閃動(dòng)顯示位置變量
- uchar inc_card_en=0; //添加新卡允許變量
- uchar manage_card_inc_en=0; //管理卡
- uchar cold=0; //溫度正負(fù)極標(biāo)志位
- uchar temp0=0; //溫度值變量
- uchar xx=88; //溫度更新變量,開機(jī)賦一個(gè)比較大的數(shù),目的是開機(jī)就顯示溫度
- uchar close_read=0;
- lcd_back_en=0; //LCD背光計(jì)時(shí)變量允許
- lcd_back_time=0; //LCD背光計(jì)時(shí)變量
- //*****************************************************************************************************************
- void delay_ms (unsigned int m); //延時(shí)
- void read_adc(void); //按鍵ADC處理
- void date_time_display(void); //時(shí)間日期顯示
- void root_directory(void); //引導(dǎo)主畫面
- void set_menu(void); //設(shè)置菜單
- void clear_screen(void); //清屏
- void clear_gdram(void); //清全部GDRAM
- void select_menu(uchar data1); //選擇菜單時(shí),標(biāo)志
- void time_set_display(void); //時(shí)間、日期設(shè)置顯示
- uint adc_sampling(uchar adc_input); //ADC采樣
- uchar get_degree(void); //溫度查表
- uchar temperature_check(void); //室溫檢測(cè)
- uchar charge_tem=0; //每十分鐘,檢測(cè)一次電池電量,此變量主要是計(jì)時(shí)
- uint battery_temp=0; //電平電壓變量
- //************************************************函 數(shù) 聲 明 區(qū)***************************************************
- void main_menu_initial(void); //主菜單初始化
- void alarm_menu_initial(void); //報(bào)警菜單初始化
- void infrared_menu_initial(void);
- void lamp_menu_initial(void);
- void menu_initial(void);
- void card_main_menu_initial(void);
- void card_inc_menu_initial(void);
- void card_dec_menu_initial(void);
- void show_menu(void);
- void date_time_set(void);
- void alarm_set(void);
- void infrared_set(void);
- void lamp_set(void);
- void nullsubs(void);
- void twinkling_addr_pro(void);
- void lcd_week_pro(void);
- void key_inc_dec(void);
- void lcd_menu_set(void);
- void card_pro(void);
- void buzzer_pro(uchar p);
- //*****************************************************************************************************************
- void inc_new_card(void); //添加新卡的處理函數(shù)
- void query_card(void); //查詢卡函數(shù)
- void save_card(void); //保存卡時(shí)處理函數(shù)
- void no_save_card(void); //取消保存卡時(shí)處理函數(shù)
- void clear_card(void); //刪除全部卡
- void no_clear_card(void); //取消刪除卡
- void card_menu_show(void); //管理卡菜單顯示
- void card_menu_pro(void); //管理卡菜單處理
- void char_twinkling(uchar data_1); //字符消隱
- //*****************************************************************************************************************
- void eeprom_write(uint eeprom_address, uchar eeprom_data); //寫----EEPROM 操作
- uchar eeprom_read(uint eeprom_address); //讀----EEPROM 操作
- //*************************************************主程序**********************************************************
- void main(void)
- {
- PORTA=0XF8; //PA0---按鍵AD;PA1---室內(nèi)溫度AD;PA2---電平電量檢測(cè)
- PORTB=0XFF;
- PORTC=0XFF;
- PORTD=0XFF;
- DDRA =0XF8; //AD轉(zhuǎn)換時(shí)要設(shè)為輸入、且端口要清0
- DDRB =0XFF;
- DDRC =0b11111000;
- DDRD =0b11110010; //INT0、INT1、RXD設(shè)成輸入;TXD設(shè)成輸出
- TIMSK=(1<<OCIE1A); //輸出比較A 匹配中斷使能
- TCCR1A=0;
- TCCR1B=0X0D; //CTC模式,1024分頻
- OCR1A=7200; //定時(shí)1S
- GICR=(1<<INT1)|(1<<INT0); //打開外部中斷0、1
- MCUCR=(1<<ISC00); //INT0 引腳上任意的邏輯電平變化都將引發(fā)中斷
- ADCSRA=(1<<ADEN)|0x06; //使能ADC,時(shí)鐘64分頻 125KHz@8MHz system clock
- WDTCR=0x0f; //(1<<WDE)|(1<<WDP2)|(1<<WDP1); //打開看門狗,溢出時(shí)間為2.1S
- write_com(0x01); //清除顯示,并且設(shè)定地址指針為00H
- menu_initial(); //菜單數(shù)組初始化
- send_initial(); //串口初始化
- WDR(); //喂狗
- card_pro(); //讀EEPROM,到RAM中
- lcd_reset(); //LCD初始化
- write_com(0x90);
- buzzer_on;
- LCD_BACK_ON; //打開LCD背光
- han_zi_display(" 系統(tǒng)正在啟動(dòng) ");
- write_com(0x88);
- han_zi_display(" 請(qǐng)稍后......");
- delay_ms(500);
- clear_gdram(); //清除GDRAM--繪圖RAM
- clear_screen(); //清屏
- buzzer_off; //峰鳴器指示
- lcd_back_en=0xaa; //打開計(jì)時(shí)變量
- lcd_back_time=0; //計(jì)時(shí)變量清0
- SEI(); //使能全局中斷
- while(1)
- {
- WDR(); //喂狗
- if(scan_en==0) //只有在scan_en=0的時(shí)候掃描主屏,平時(shí)只更新時(shí)間
- {
- scan_en=~scan_en;
- clear_screen();
- temp0=temperature_check(); //溫度檢測(cè)
- root_directory();
- }
- if(second_temp!=tem[5]) //每秒鐘掃描一次
- {
- second_temp=tem[5];
- date_time_display();
- }
- if(close_read==1)
- {
- if(xx>=5)
- {
- xx=0;
- close_read=0;
- second_temp=0;
- GICR=((1<<INT1)|(1<<INT0)); //開外部中斷0、1
- }
- }
- if(kk) //=1表示有按鍵按下
- {
- kk=0;
- read_adc(); //AD轉(zhuǎn)換,取得鍵值
- buzzer_pro(1); //峰鳴器指示
- LCD_BACK_ON; //打開LCD背光
- lcd_back_en=0xaa; //打開計(jì)時(shí)變量
- lcd_back_time=0; //計(jì)時(shí)變量清0
- if(key==1)
- {
- GICR&=~(1<<INT0); //關(guān)閉讀卡外部中斷0
- lcd_menu_set(); //LCD菜單設(shè)置
- GICR=((1<<INT1)|(1<<INT0)); //開外部中斷0、1
- }
- else if(key==8)
- {
- GICR&=~((1<<INT1)|(1<<INT0)); //關(guān)閉部中斷0、1
- key=0;
- clear_screen(); //清屏
- write_com(0x80);
- han_zi_display(" 警 告 ");
- write_com(0x88);
- han_zi_display("版權(quán)歸于軍峰所有");
- write_com(0x98);
- han_zi_display(" 拷貝必究!!!");
- delay_ms(6000);
- scan_en=0; //主菜單調(diào)用允許標(biāo)志位
- clear_screen(); //**************
- GICR=((1<<INT1)|(1<<INT0)); //開外部中斷0、1
- }
- else
- {
- key=0;
- GICR=((1<<INT1)|(1<<INT0)); //開外部中斷0、1
- }
- }
- WDR(); //喂狗
- if(inc_card_en==0xaa) //=0xaa表示調(diào)用管理菜單允許
- {
- inc_card_en=0;
- rev_dat[0]=rev_dat[1]=rev_dat[2]=rev_dat[3]=rev_dat[4]=0xff;
- lcd_dis_num=0;
- card_menu_pro();
- GICR=((1<<INT1)|(1<<INT0)); //開外部中斷0、1
- }
- if(charge_tem>=BATTERY_TIME)
- {
- charge_tem=0;
- battery_temp=0;
- WDR(); //喂狗
- battery_temp=adc_sampling(ADC_PINA2); //AD采樣電平電量
- if(battery_temp<=3750) //3750=12V,當(dāng)電平電壓小于12V時(shí),開始充電
- {
- charge_on;
- if(CHARGE_STATUS!=0)
- {
- buzzer_pro(10); //峰鳴器指示
- }
- }
- else if((CHARGE_STATUS==1)||(battery_temp>=4375)) //如果大于4375=14V,表示要關(guān)閉充電器
- {
- charge_off;
- }
- }
- }
- }
- //************************************************管理卡主菜單操作*************************************************
- void card_menu_pro(void)
- {
- clear_screen();
- menu_card= card_main_menu;
- user_choose=0;
- card_menu_show();
- return_en=1; //打開菜單自動(dòng)返回變量
- GICR|=(1<<INT1); //打開外部中斷1***********************
- while(auto_return<OVER_FLOW)
- {
- WDR(); //喂狗
- if(kk)
- {
- kk=0;
- auto_return=0; //清除菜單自動(dòng)返回累計(jì)時(shí)間變量
- read_adc();
- buzzer_pro(1); //峰鳴器指示
- LCD_BACK_ON; //打開LCD背光
- lcd_back_en=0xaa; //打開計(jì)時(shí)變量
- lcd_back_time=0; //計(jì)時(shí)變量清0
- WDR();
- switch(key)
- {
- case 0: //沒有按下按鍵
- break;
- case 1: //設(shè)置
- key=0;
- break;
- case 2: //向上
- key=0;
- if (user_choose == 0)
- {
- user_choose = max_items;
- }
- user_choose --;
- break;
- case 3: //向下
- key=0;
- user_choose ++;
- if (user_choose == max_items)
- {
- user_choose = 0;
- }
- break;
- case 4: //向左
- key=0;
- break;
- case 5: //向右
- key=0;
- break;
- case 6: //確認(rèn)
- key=0;
- if (menu_card[user_choose].subs != nullsubs)
- {
-
- (*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; //隨便賦一個(gè)比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; //菜單自動(dòng)計(jì)時(shí)返回允許標(biāo)志位
- auto_return=0; //菜單自動(dòng)計(jì)時(shí)返回變量
- key=0; //按鍵值清0
- return_temp=0; //返回臨時(shí)變量清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è)置時(shí)間時(shí),字符閃動(dòng)
- write_data(0x20);
- }
- //**********************************************管理操作時(shí)的菜單***************************************************
- 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); //無奇偶校驗(yàn),設(shè)置幀格式: 8 個(gè)數(shù)據(jù)位, 1 個(gè)停止位
- }
- //*********************************************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 以啟動(dòng)寫操作
- SEI();
- }
- //********************************************讀----EEPROM 操作****************************************************
- uchar eeprom_read(uint eeprom_address)
- {
- CLI();
- while(EECR & (1<<EEWE)); //等待上一次寫操作結(jié)束
- EEAR = eeprom_address; //設(shè)置地址寄存器
- EECR |= (1<<EERE); //設(shè)置EERE 以啟動(dòng)讀操作
- SEI();
- return EEDR; //自數(shù)據(jù)寄存器返回?cái)?shù)據(jù)
- }
- //***********************************************LCD菜單設(shè)置*******************************************************
- //說明:如果進(jìn)入菜單在30秒內(nèi)沒有動(dòng)作,將自動(dòng)反回主畫面
- //*****************************************************************************************************************
- void lcd_menu_set(void)
- {
- uchar tem_2[7]={0,0,0,0,0,0,0}; //日期、時(shí)間、星期數(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; //打開菜單自動(dòng)返回變量
- GICR|=(1<<INT1); //打開外部中斷1
- while(auto_return<OVER_FLOW)
- {
- WDR(); //喂狗
- if(kk)
- {
- kk=0;
- auto_return=0; //清除菜單自動(dòng)返回累計(jì)時(shí)間變量
- read_adc();
- buzzer_pro(1); //峰鳴器指示
- LCD_BACK_ON; //打開LCD背光
- lcd_back_en=0xaa; //打開計(jì)時(shí)變量
- lcd_back_time=0; //計(jì)時(shí)變量清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; //返回臨時(shí)變量清0
- break;
- case 3: //向下
- key=0;
- user_choose ++;
- if (user_choose == max_items)
- {
- user_choose = 0;
- }
- return_temp=0; //返回臨時(shí)變量清0
- break;
- case 4: //向左
- key=0;
- if(left_right==0)
- {
- left_right=6;
- }
- left_right--;
- twinkling_addr_pro(); //調(diào)用閃動(dòng)地址選擇
- break;
- case 5: //向右
- key=0;
- left_right++;
- if(left_right>=6)
- {
- left_right=0;
- }
- twinkling_addr_pro(); //調(diào)用閃動(dòng)地址選擇
- break;
- case 6: //確認(rèn)
- key=0;
- if(set_time_temp==1)
- {
- auto_return=88; //隨便賦一個(gè)比OVER_FLOW大的數(shù)字,目的是退出子菜單,進(jìn)入主屏
- set_time_temp=0;
- clear_screen();
- write_com(0x90);
- han_zi_display(" 時(shí)間設(shè)置完成");
- delay_ms(2000);
- break;
- }
- if (menu_point[user_choose].subs != nullsubs)
- {
- left_right=0;
- tem_2[0]=tem[0]; //把日期、時(shí)間變量做個(gè)備份
- 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í)間數(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; //隨便賦一個(gè)比OVER_FLOW大的數(shù)字,目的是退出子菜單,進(jìn)入主屏
- break;
- }
- }
- else
- {
- return_temp=0;
- auto_return=88; //隨便賦一個(gè)比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; //菜單自動(dòng)計(jì)時(shí)返回允許標(biāo)志位
- auto_return=0; //菜單自動(dòng)計(jì)時(shí)返回變量
- key=0; //按鍵值清0
- return_temp=0; //返回臨時(shí)變量清0
- user_choose = 0;
- menu_point = main_menu; //把結(jié)構(gòu)指針還指向主菜單
- set_time_temp=0; //日期、時(shí)間設(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; //計(jì)時(shí)變量清0
- lcd_back_en=0xaa; //打開計(jì)時(shí)變量
- auto_return=0; //清除菜單自動(dòng)返回累計(jì)時(shí)間變量
- switch(twinkling_addr)
- {
- case 0x88: //小時(shí)選項(xiàng)
- 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: //分鐘選項(xiàng)
- do
- {
- tem[4]++;
- if(tem[4]>=60)
- {
- tem[4]=0;
- }
- time_set_display(); //更新顯示
- delay_ms(120);
- auto_return=0;
- }
- while(key_inc==0);
- break;
- case 0x8f: //星期選項(xiàng)
- do
- {
- tem[6]++;
- if(tem[6]>=7)
- {
- tem[6]=0;
- }
- time_set_display(); //更新顯示
- delay_ms(200);
- auto_return=0;
- }
- while(key_inc==0);
- break;
- case 0x91: //年選項(xiàng)
- do
- {
- tem[0]++;
- if(tem[0]>=29)
- {
- tem[0]=7;
- }
- time_set_display(); //更新顯示
- delay_ms(200);
- auto_return=0;
- }
- while(key_inc==0);
- break;
- case 0x93: //月選項(xiàng)
- do
- {
- tem[1]++;
- if(tem[1]>=13)
- {
- tem[1]=1;
- }
- time_set_display(); //更新顯示
- delay_ms(200);
- auto_return=0;
- }
- while(key_inc==0);
- break;
- case 0x95: //日選項(xiàng)
- do
- {
- tem[2]++;
- if(tem[2]>=32)
- {
- tem[2]=1;
- }
- time_set_display(); //更新顯示
- delay_ms(150);
- auto_return=0;
- }
- while(key_inc==0);
- break;
- default:
- break;
- }
- }
- }
- if(key_dec==0)
- {
- delay_ms(5);
- if(key_dec==0)
- {
- buzzer_pro(1); //峰鳴器指示
- LCD_BACK_ON; //打開LCD背光
- lcd_back_time=0; //計(jì)時(shí)變量清0
- lcd_back_en=0xaa; //打開計(jì)時(shí)變量
- auto_return=0; //清除菜單自動(dòng)返回累計(jì)時(shí)間變量
- switch(twinkling_addr)
- {
- case 0x88: //小時(shí)選項(xiàng)
- do
- {
- if(tem[3]==0)
- {
- tem[3]=24;
- }
- tem[3]--;
- time_set_display(); //更新顯示
- delay_ms(200);
- auto_return=0;
- }
- while(key_dec==0);
- break;
- case 0x8a: //分鐘選項(xiàng)
- do
- {
- if(tem[4]==0)
- {
- tem[4]=60;
- }
- tem[4]--;
- time_set_display(); //更新顯示
- delay_ms(120);
- auto_return=0;
- }
- while(key_dec==0);
- break;
- case 0x8f: //星期選項(xiàng)
- do
- {
- if(tem[6]==0)
- {
- tem[6]=7;
- }
- tem[6]--;
- time_set_display(); //更新顯示
- delay_ms(200);
- auto_return=0;
- }
- while(key_dec==0);
- break;
- case 0x91: //年選項(xiàng)
- do
- {
- if(tem[0]==7)
- {
- tem[0]=29;
- }
- tem[0]--;
- time_set_display(); //更新顯示
- delay_ms(200);
- auto_return=0;
- }
- while(key_dec==0);
- break;
- case 0x93: //月選項(xiàng)
- do
- {
- if(tem[1]==1)
- {
- tem[1]=13;
- }
- tem[1]--;
- time_set_display(); //更新顯示
- delay_ms(200);
- auto_return=0;
- }
- while(key_dec==0);
- break;
- case 0x95: //日選項(xiàng)
- do
- {
- if(tem[2]==1)
- {
- tem[2]=32;
- }
- tem[2]--;
- time_set_display(); //更新顯示
- delay_ms(150);
- auto_return=0;
- }
- while(key_dec==0);
- break;
- default:
- break;
- }
- }
- }
- }
- //**************************************************字符閃動(dòng)地址選擇***********************************************
- void twinkling_addr_pro(void)
- {
- switch(left_right)
- {
- case 0:
- twinkling_addr=0x91;
- break;
- case 1:
- twinkling_addr=0x93;
- break;
- case 2:
- twinkling_addr=0x95;
- break;
- case 3:
- twinkling_addr=0x88;
- break;
- case 4:
- twinkling_addr=0x8a;
- break;
- case 5:
- twinkling_addr=0x8f;
- break;
- default:
- break;
- }
- clear_screen();
- return_temp=0; //返回臨時(shí)變量清0
- }
- //*************************************************顯示菜單********************************************************
- void show_menu(void)
- {
- uchar n = 0;
- max_items = menu_point[0].menu_count;
- WDR(); //喂狗
- if (max_items >= 4)
- {
- for (n = 0;n<4;n++)
- {
- switch(n)
- {
- case 0:
- write_com(0x80);
- break;
- case 1:
- write_com(0x90);
- break;
- case 2:
- write_com(0x88);
- break;
- case 3:
- write_com(0x98);
- break;
- default:
- break;
- }
- han_zi_display(menu_point[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;
- case 3:
- select_menu(0x98);
- break;
- default:
- break;
- }
- }
- }
- }
- else //子菜單選擇
- {
- WDR(); //喂狗
- clear_screen();
- for (n = 0;n<max_items;n++)
- {
- write_com(0x80);
- switch(choose_temp)
- {
- case 0:
- han_zi_display(" 1.時(shí)間日期設(shè)置");
- break;
- case 1:
- han_zi_display(" 2.報(bào)警開關(guān)設(shè)置");
- break;
- case 2:
- han_zi_display(" 3.人體紅外設(shè)置");
- break;
- case 3:
- han_zi_display(" 4.路燈開關(guān)設(shè)置");
- break;
- default:
- break;
- }
- if(n==0)
- {
- write_com(0x88);
- }
- else if(n==1)
- {
- write_com(0x98);
- }
- han_zi_display(menu_point[n].display_string);
- if (n== user_choose)
- {
- if(n==0)
- {
- select_menu(0x89);
- }
- else if(n==1)
- {
- select_menu(0x99);
- }
- }
- }
- }
- }
- //******************************************************初始化菜單目錄*********************************************
- void menu_initial(void)
- {
- main_menu_initial();
- alarm_menu_initial();
- infrared_menu_initial();
- lamp_menu_initial();
- card_main_menu_initial();
- card_inc_menu_initial();
- card_dec_menu_initial();
- }
- //******************************************************主目錄初始化函數(shù)*******************************************
- void main_menu_initial(void)
- {
- main_menu[0].menu_count = 4;
- main_menu[0].display_string = " 1.時(shí)間日期設(shè)置";
- main_menu[0].subs = date_time_set;
- main_menu[0].children_menus =null;
- main_menu[0].parent_menus = null;
-
- main_menu[1].menu_count = 4;
- main_menu[1].display_string = " 2.報(bào)警開關(guān)設(shè)置";
- main_menu[1].subs = nullsubs;
- main_menu[1].children_menus = alarm_menu;
- main_menu[1].parent_menus = null;
-
- main_menu[2].menu_count = 4;
- main_menu[2].display_string = " 3.人體紅外設(shè)置";
- main_menu[2].subs = nullsubs;
- main_menu[2].children_menus = infrared_menu;
- main_menu[2].parent_menus = null;
- main_menu[3].menu_count = 4;
- main_menu[3].display_string = " 4.路燈開關(guān)設(shè)置";
- main_menu[3].subs = nullsubs;
- main_menu[3].children_menus = lamp_menu;
- main_menu[3].parent_menus = null;
- }
- //**************************************************報(bào)警開關(guān)設(shè)置目錄初始化函數(shù)*************************************
- void alarm_menu_initial(void)
- {
- alarm_menu[0].menu_count = 2;
- alarm_menu[0].display_string = " 1. 打開 ";
- alarm_menu[0].subs = alarm_set;
- alarm_menu[0].children_menus = null; //&null
- alarm_menu[0].parent_menus = main_menu;
-
- alarm_menu[1].menu_count = 2;
- alarm_menu[1].display_string = " 2. 關(guān)閉 ";
- alarm_menu[1].subs = alarm_set;
- alarm_menu[1].children_menus = null; //&null
- alarm_menu[1].parent_menus = main_menu;
- }
- //*************************************************人體紅外開關(guān)設(shè)置目錄初始化函數(shù)**********************************
- void infrared_menu_initial(void)
- {
- infrared_menu[0].menu_count = 2;
- infrared_menu[0].display_string = " 1. 打開 ";
- infrared_menu[0].subs = infrared_set;
- infrared_menu[0].children_menus = null; //&null
- infrared_menu[0].parent_menus = main_menu;
-
- infrared_menu[1].menu_count = 2;
- infrared_menu[1].display_string = " 2. 關(guān)閉 ";
- infrared_menu[1].subs = infrared_set;
- infrared_menu[1].children_menus = null; //&null
- infrared_menu[1].parent_menus = main_menu;
- }
- //*************************************************路燈開關(guān)設(shè)置目錄初始化函數(shù)**************************************
- void lamp_menu_initial(void)
- {
- lamp_menu[0].menu_count = 2;
- lamp_menu[0].display_string = " 1. 打開 ";
- lamp_menu[0].subs = lamp_set;
- lamp_menu[0].children_menus = null;
- lamp_menu[0].parent_menus = main_menu;
-
- lamp_menu[1].menu_count = 2;
- lamp_menu[1].display_string = " 2. 關(guān)閉 ";
- lamp_menu[1].subs = lamp_set;
- lamp_menu[1].children_menus = null;
- lamp_menu[1].parent_menus = main_menu;
- }
- //**********************************************管理卡操作主菜單***************************************************
- void card_main_menu_initial(void)
- {
- card_main_menu[0].menu_count = 3;
- card_main_menu[0].display_string = " 1.添加新卡?";
- card_main_menu[0].subs =inc_new_card;
- card_main_menu[0].children_menus =card_inc_menu;
- card_main_menu[0].parent_menus = null;
-
- card_main_menu[1].menu_count = 3;
- card_main_menu[1].display_string = " 2.刪除全部卡?";
- card_main_menu[1].subs = nullsubs;
- card_main_menu[1].children_menus = card_dec_menu;
- card_main_menu[1].parent_menus = null;
-
- card_main_menu[2].menu_count = 3;
- card_main_menu[2].display_string = " 3.查詢卡記錄?";
- card_main_menu[2].subs = query_card;
- card_main_menu[2].children_menus = null;
- card_main_menu[2].parent_menus = null;
- }
- //************************************************添加新卡子菜單***************************************************
- void card_inc_menu_initial(void)
- {
- card_inc_menu[0].menu_count = 2;
- card_inc_menu[0].display_string = " 1. 確認(rèn) ";
- card_inc_menu[0].subs = save_card;
- card_inc_menu[0].children_menus = null;
- card_inc_menu[0].parent_menus = main_menu;
-
- card_inc_menu[1].menu_count = 2;
- card_inc_menu[1].display_string = " 2. 取消 ";
- card_inc_menu[1].subs = no_save_card;
- card_inc_menu[1].children_menus = null;
- card_inc_menu[1].parent_menus = main_menu;
- }
- //************************************************刪除全部卡子菜單*************************************************
- void card_dec_menu_initial(void)
- {
- card_dec_menu[0].menu_count = 2;
- card_dec_menu[0].display_string = " 1. 確認(rèn) ";
- card_dec_menu[0].subs = clear_card;
- card_dec_menu[0].children_menus = null;
- card_dec_menu[0].parent_menus = main_menu;
-
- card_dec_menu[1].menu_count = 2;
- card_dec_menu[1].display_string = " 2. 取消 ";
- card_dec_menu[1].subs =no_clear_card;
- card_dec_menu[1].children_menus = null;
- card_dec_menu[1].parent_menus = main_menu;
- }
- //**************************************************增加新卡*******************************************************
- void inc_new_card(void)
- {
- uchar eeprom_addr=0;
- uchar uu=0;
- if(user_choose==0)
- {
- manage_card_inc_en=0xaa; //準(zhǔn)備接收新卡號(hào)碼
- clear_screen();
- auto_return=0; //菜單自動(dòng)返回變量清0
- write_com(0x80);
- han_zi_display(" 請(qǐng)刷卡!");
- GICR|=(1<<INT0); //開外部中斷0
- while((manage_card_inc_en==0xaa)&&(auto_return<OVER_FLOW))
- {
- WDR(); //喂狗
- }
- if(manage_card_inc_en==0)
- {
- GICR&=~((1<<INT1)|(1<<INT0)); //關(guān)閉外部中斷0、1
- write_com(0x90);
- han_zi_display("卡號(hào):");
- write_com(0x93);
- write_data(lcd_dis_num/10000000+0x30);
- write_data(lcd_dis_num%10000000/1000000+0x30);
- write_data(lcd_dis_num%10000000%1000000/100000+0x30);
- write_data(lcd_dis_num%10000000%1000000%100000/10000+0x30);
- write_data(lcd_dis_num%10000000%1000000%100000%10000/1000+0x30);
- write_data(lcd_dis_num%10000000%1000000%100000%10000%1000/100+0x30);
- write_data(lcd_dis_num%10000000%1000000%100000%10000%1000%100/10+0x30);
- write_data(lcd_dis_num%10000000%1000000%100000%10000%1000%100%10+0x30);
- write_com(0x88);
- han_zi_display(" 請(qǐng)核對(duì)!");
- delay_ms(3000);
- }
- else
- {
- manage_card_inc_en=0; //在請(qǐng)刷卡界面,如果沒有刷卡,自動(dòng)返回后要清0此變量
- lcd_dis_num=0;
- auto_return=88; //隨便賦一個(gè)比OVER_FLOW大的數(shù)字,目的是退出子菜單,進(jìn)入主屏
- }
- GICR|=(1<<INT1); //打開外部中斷1
- auto_return=0; //菜單自動(dòng)返回變量清0
- WDR(); //喂狗
- }
- }
- //***************************************************卡數(shù)量查詢****************************************************
- void query_card(void)
- {
- ulong tem_1=0;
- uchar hh;
- card_pro(); //把EEPROM數(shù)據(jù)讀出來
- GICR&=~((1<<INT1)|(1<<INT0)); //關(guān)閉外部中斷0、1
- clear_screen();
- WDR(); //喂狗
- write_com(0x80);
- han_zi_display("卡記錄: 共五張卡");
- for(hh=0;hh<3;hh++)
- {
- if(card_data[hh][4]==0xff)
- {
- tem_1=0;
- }
- else
- {
- tem_1=card_data[hh][1];
- tem_1<<=8;
- tem_1+=card_data[hh][2];
- tem_1<<=8;
- tem_1+=card_data[hh][3];
- tem_1<<=8;
- tem_1+=card_data[hh][4];
- }
- switch(hh)
- {
- case 0:
- write_com(0x90);
- han_zi_display("1.");
- break;
- case 1:
- write_com(0x88);
- han_zi_display("2.");
- break;
- case 2:
- write_com(0x98);
- han_zi_display("3.");
- break;
- default:
- break;
- }
- WDR(); //喂狗
- write_data(tem_1/10000000+0x30); //顯示卡號(hào)
- write_data(tem_1%10000000/1000000+0x30);
- write_data(tem_1%10000000%1000000/100000+0x30);
- write_data(tem_1%10000000%1000000%100000/10000+0x30);
- write_data(tem_1%10000000%1000000%100000%10000/1000+0x30);
- write_data(tem_1%10000000%1000000%100000%10000%1000/100+0x30);
- write_data(tem_1%10000000%1000000%100000%10000%1000%100/10+0x30);
- write_data(tem_1%10000000%1000000%100000%10000%1000%100%10+0x30);
- }
- delay_ms(5000);
- clear_screen();
- write_com(0x80);
- han_zi_display("卡記錄: 共五張卡");
- for(hh=3;hh<5;hh++)
- {
- if(card_data[hh][4]==0xff)
- {
- tem_1=0;
- }
- else
- {
- tem_1=card_data[hh][1];
- tem_1<<=8;
- tem_1+=card_data[hh][2];
- tem_1<<=8;
- tem_1+=card_data[hh][3];
- tem_1<<=8;
- tem_1+=card_data[hh][4];
- }
- switch(hh)
- {
- case 3:
- write_com(0x90);
- han_zi_display("4.");
- break;
- case 4:
- write_com(0x88);
- han_zi_display("5.");
- break;
- default:
- break;
- }
- WDR(); //喂狗
- write_data(tem_1/10000000+0x30);
- write_data(tem_1%10000000/1000000+0x30);
- write_data(tem_1%10000000%1000000/100000+0x30);
- write_data(tem_1%10000000%1000000%100000/10000+0x30);
- write_data(tem_1%10000000%1000000%100000%10000/1000+0x30);
- write_data(tem_1%10000000%1000000%100000%10000%1000/100+0x30);
- write_data(tem_1%10000000%1000000%100000%10000%1000%100/10+0x30);
- write_data(tem_1%10000000%1000000%100000%10000%1000%100%10+0x30);
- }
- write_com(0x98);
- han_zi_display("稍后自動(dòng)返回!");
- delay_ms(5000);
- clear_screen();
- GICR|=(1<<INT1); //打開外部中斷1
- auto_return=88; //隨便賦一個(gè)比OVER_FLOW大的數(shù)字,目的是退出子菜單,進(jìn)入主屏
- }
- //*****************************************************保存新卡****************************************************
- void save_card(void)
- {
- uchar eeprom_addr=0;
- uchar uu=0;
- uchar yy=0;
- WDR(); //喂狗
- if((card_data[0][3]==0xff)&&(card_data[0][4]==0xff))
- {
- eeprom_addr=1; //從EEPROM的地址1處開始寫數(shù)據(jù)
- }
- else if((card_data[1][3]==0xff)&&(card_data[1][4]==0xff))
- {
- eeprom_addr=6; //從EEPROM的地址6處開始寫數(shù)據(jù)
- }
- else if((card_data[2][3]==0xff)&&(card_data[2][4]==0xff))
- {
- eeprom_addr=11; //從EEPROM的地址11處開始寫數(shù)據(jù)
- }
- else if((card_data[3][3]==0xff)&&(card_data[3][4]==0xff))
- {
- eeprom_addr=16; //從EEPROM的地址16處開始寫數(shù)據(jù)
- }
- else if((card_data[4][3]==0xff)&&(card_data[4][4]==0xff))
- {
- eeprom_addr=21; //從EEPROM的地址21處開始寫數(shù)據(jù)
- }
- else
- {
- clear_screen();
- WDR(); //喂狗
- write_com(0x80);
- han_zi_display(" 卡已存滿!");
- write_com(0x90);
- han_zi_display("請(qǐng)全部刪除, 再增");
- write_com(0x88);
- han_zi_display(" 加新卡!");
- auto_return=88; //隨便賦一個(gè)比OVER_FLOW大的數(shù)字,目的是退出子菜單,進(jìn)入主屏
- GICR|=(1<<INT1); //打開外部中斷1
- delay_ms(6000);
- return;
- }
- yy=eeprom_addr;
- for(uu=0;eeprom_addr<(yy+5);eeprom_addr++)
- {
- eeprom_write(eeprom_addr,rev_dat[uu++]);
- WDR(); //喂狗
- }
- clear_screen();
- write_com(0x90);
- han_zi_display(" 已保存卡號(hào)!");
- card_pro(); //把EEPROM數(shù)據(jù)讀出來,更新RAM中的card_data數(shù)組
- delay_ms(4000);
- GICR|=(1<<INT1); //打開外部中斷1
- auto_return=88; //隨便賦一個(gè)比OVER_FLOW大的數(shù)字,目的是退出子菜單,進(jìn)入主屏
- }
- //*********************************************不保存卡函數(shù)********************************************************
- void no_save_card(void)
- {
- rev_dat[0]=rev_dat[1]=rev_dat[2]=rev_dat[3]=rev_dat[4]=0;
- lcd_dis_num=0;
- auto_return=88; //隨便賦一個(gè)比OVER_FLOW大的數(shù)字,目的是退出子菜單,進(jìn)入主屏
- }
- //*********************************************清除全部卡函數(shù)******************************************************
- void clear_card(void)
- {
- uchar ii;
- for(ii=1;ii<36;ii++) //從EEPROM地址1處開始寫0XFF
- {
- eeprom_write(ii,0xff); //把前EEPROM 的前30位內(nèi)容全部清成0xff
- WDR(); //喂狗
- }
- clear_screen();
- write_com(0x90);
- han_zi_display("已刪除全部卡號(hào)!");
- write_com(0x88);
- han_zi_display("請(qǐng)盡快添加新卡!");
- card_pro(); //把EEPROM數(shù)據(jù)讀出來
- delay_ms(4000);
- auto_return=88; //隨便賦一個(gè)比OVER_FLOW大的數(shù)字,目的是退出子菜單,進(jìn)入主屏
- }
- //********************************************取消刪除卡時(shí)處理的函數(shù)***********************************************
- void no_clear_card(void) //不處理任何數(shù)據(jù)
- {
- auto_return=88; //隨便賦一個(gè)比OVER_FLOW大的數(shù)字,目的是退出子菜單,進(jìn)入主屏
- }
- //***********************************************日期時(shí)間設(shè)置******************************************************
- void date_time_set(void)
- {
- clear_screen();
- tem[5]=0; //秒變量清0
- set_time_temp=1;
- time_set_display();
- }
- //******************************************報(bào)警開關(guān)設(shè)置***********************************************************
- void alarm_set(void)
- {
- clear_screen();
- write_com(0x90);
- han_zi_display(" 設(shè)置完成 ");
- auto_return=88; //隨便賦一個(gè)比OVER_FLOW大的數(shù)字,目的是退出菜單,進(jìn)入主屏
- delay_ms(500);
- //添加相應(yīng)的功能(此程序沒有此功能)
- }
- //******************************************人體紅外傳感器設(shè)置*****************************************************
- void infrared_set(void)
- {
- clear_screen();
- write_com(0x90);
- han_zi_display(" 設(shè)置完成 ");
- auto_return=88; //隨便賦一個(gè)比OVER_FLOW大的數(shù)字,目的是退出菜單,進(jìn)入主屏
- delay_ms(500);
- //添加相應(yīng)的功能(此程序沒有此功能)
- }
- //******************************************路燈開關(guān)設(shè)置***********************************************************
- void lamp_set(void)
- {
- clear_screen();
- write_com(0x90);
- han_zi_display(" 設(shè)置完成 ");
- auto_return=88; //隨便賦一個(gè)比OVER_FLOW大的數(shù)字,目的是退出菜單,進(jìn)入主屏
- delay_ms(500);
- //添加相應(yīng)的功能(此程序沒有此功能)
- }
- //******************************************空函數(shù),不處理任何數(shù)據(jù)*************************************************
- void nullsubs(void)
- {
- }
- //*****************************************************************************************************************
- void time_set_display(void)
- {
- write_com(0x80); //第一行(如果是地址是:80H,即LCD的第一行的第一個(gè)位置顯示)
- han_zi_display(" 日期時(shí)間設(shè)置 ");
- write_com(0x91);
- write_data((tem[0]/10)+0x30);
- write_data((tem[0]%10)+0x30);
- han_zi_display("年");
- write_data((tem[1]/10)+0x30);
- write_data((tem[1]%10)+0x30);
- han_zi_display("月");
- write_data((tem[2]/10)+0x30);
- write_data((tem[2]%10)+0x30);
- han_zi_display("日");
- date_time_display();
- write_com(0x8d);
- lcd_week_pro(); //星期處理
- write_com(0x98);
- han_zi_display(" OK設(shè)置; NG退出");
- }
- //***********************************************星期處理**********************************************************
- void lcd_week_pro(void)
- {
- switch(tem[6])
- {
- case 0:
- han_zi_display("星期日");
- break;
- case 1:
- han_zi_display("星期一");
- break;
- case 2:
- han_zi_display("星期二");
- break;
- case 3:
- han_zi_display("星期三");
- break;
- case 4:
- han_zi_display("星期四");
- break;
- case 5:
- han_zi_display("星期五");
- break;
- case 6:
- han_zi_display("星期六");
- break;
- default:
- break;
- }
- }
- //**********************************************菜單選中標(biāo)志"●"****************************************************
- void select_menu(uchar data1)
- {
- write_com(data1);
- write_data(0xa1); //哪個(gè)菜單項(xiàng)選中時(shí)顯示"●"
- write_data(0xf1);
- }
- //*************************************************清整個(gè)GDRAM空間*************************************************
- void clear_gdram(void)
- {
- uchar x,y;
- for(y=0;y<64;y++) //64
- {
- for(x=0;x<16;x++) //16
- {
- write_com(0x34);
- write_com(y+0x80); //行地址
- write_com(x+0x80); //列地址
- write_com(0x30);
- write_data(0x00);
- write_data(0x00);
- WDR(); //喂狗
- }
- }
- }
- //********************************************清屏*****************************************************************
- void clear_screen(void)
- {
- write_com(0x01);
- delay_ms(10);
- }
- //*********************************************系統(tǒng)起動(dòng)引導(dǎo)主畫面**************************************************
- void root_directory(void)
- {
- write_com(0x80); //第一行(如果是地址是:80H,即LCD的第一行的第一個(gè)位置顯示)
- han_zi_display(" 門禁系統(tǒng) ");
- write_com(0x91);
- write_data((tem[0]/10)+0x30);
- write_data((tem[0]%10)+0x30);
- han_zi_display("年");
- write_data((tem[1]/10)+0x30);
- write_data((tem[1]%10)+0x30);
- han_zi_display("月");
- write_data((tem[2]/10)+0x30);
- write_data((tem[2]%10)+0x30);
- han_zi_display("日");
- write_com(0x8d);
- switch(tem[6])
- {
- case 0:
- han_zi_display("星期日");
- break;
- case 1:
- han_zi_display("星期一");
- break;
- case 2:
- han_zi_display("星期二");
- break;
- case 3:
- han_zi_display("星期三");
- break;
- case 4:
- han_zi_display("星期四");
- break;
- case 5:
- han_zi_display("星期五");
- break;
- case 6:
- han_zi_display("星期六");
- break;
- default:
- break;
- }
- write_com(0x98);
- han_zi_display("室內(nèi)溫度:");
- if(cold==0xaa)
- {
- write_data('-');
- }
- else
- {
- write_data(0x20);
- }
- write_data(temp0/10+0x30);
- write_data(temp0%10+0x30);
- write_com(0x9e);
- han_zi_display("℃");
- }
- //**********************************************時(shí)間、日期顯示*****************************************************
- void date_time_display(void)
- {
- write_com(0x88);
- write_data((tem[3]/10)+0x30); //HOUR
- write_data((tem[3]%10)+0x30);
- if(set_time_temp==0) //=0 表示沒有進(jìn)入時(shí)間設(shè)置菜單
- {
- write_data(':'); //通常情況下,":"要顯示為半角,目的:好看
- }
- else
- {
- han_zi_display("時(shí)"); //進(jìn)入設(shè)置時(shí)間菜單時(shí),顯示為漢字,目的:方便反白顯示
- }
- write_data((tem[4]/10)+0x30); //MINUTE
- write_data((tem[4]%10)+0x30);
- if(set_time_temp==0) //=0 表示沒有進(jìn)入時(shí)間設(shè)置菜單
- {
- write_data(':'); //通常情況下,":"要顯示為半角,目的:好看
- write_data((tem[5]/10)+0x30); //SECOND
- write_data((tem[5]%10)+0x30);
- }
- else
- {
- han_zi_display("分"); //進(jìn)入設(shè)置時(shí)間菜單時(shí),顯示為漢字,目的:方便反白顯示
- }
- }
- //*********************************************讀EEPROM,到RAM中***************************************************
- void card_pro(void)
- {
- uchar i=0,u=0,r=1; //EEPROM地址從0x01處保存
- for(i=0;i<5;i++) //共有5張開門卡,1張管理卡
- {
- for(u=0;u<5;u++) //每個(gè)卡有5個(gè)字節(jié)數(shù)據(jù)
- {
- card_data[i][u]=eeprom_read(r++); //把EEPROM中的5張開門卡復(fù)制到RAM中
- WDR(); //喂狗
- }
- }
- }
- //********************************************比較匹配A 中斷*******************************************************
- #pragma interrupt_handler time1_comp:7 //工作在CTC模式 每1S中斷一次
- void time1_comp(void)
- {
- if(return_en) //菜單不動(dòng)作自動(dòng)返回允許變量
- {
- auto_return++; //當(dāng)auto_return>=OVER_FLOW時(shí)自動(dòng)退出菜單設(shè)置
- }
- xx++;
- if(lcd_back_en==0xaa) //LCD背光計(jì)時(shí)變量允許
- {
- lcd_back_time++;
- if(lcd_back_time>=LCD_LAMP) //30秒后關(guān)閉LCD背光
- {
- lcd_back_time=0;
- lcd_back_en=0;
- LCD_BACK_OFF;
- }
- }
- if(set_time_temp==0)
- {
- tem[5]++;
- if(tem[5]>=60) //60 秒進(jìn)位
- {
- tem[5]=0;
- tem[4]++;
- charge_tem++;
- scan_en=0;
- if(tem[4]>=60) //60 分進(jìn)位
- {
- tem[4]=0;
- tem[3]++;
- if(tem[3]>=24) //24 小時(shí)進(jìn)位
- {
- tem[3]=0;
- tem[6]++;
- tem[2]++;
- if(tem[6]>=7) //7 星期進(jìn)位
- {
- tem[6]=0;
- }
- if((tem[1]==1)||(tem[1]==3)||(tem[1]==5)||(tem[1]==7)||(tem[1]==8)||(tem[1]==10)||(tem[1]==12)) //判斷大小月
- {
- if(tem[2]>=32) //如果為大月,則有31天
- {
- tem[2]=1;
- tem[1]++;
- }
- }
- else
- {
- if(tem[2]>=31) //如果為小月,則代表只有30天
- {
- tem[2]=1;
- tem[1]++;
- }
- }
- if(tem[1]>=13) //月進(jìn)位
- {
- tem[1]=1;
- tem[0]++;
- if(tem[0]>=29) //當(dāng)年大于2029年時(shí),清零即2007年
- {
- tem[0]=7;
- }
- }
- }
- }
- }
- }
- }
- //*********************************************讀卡中斷INT0********************************************************
- #pragma interrupt_handler int0_inter:2 //讀卡
- void int0_inter(void)
- {
- uchar i;
- uchar card_num=0;
- card_num=read_card_number(); //讀卡
- if(card_num==0xaa)
- {
- buzzer_pro(1); //峰鳴器指示
- LCD_BACK_ON; //打開LCD背光
- lcd_back_en=0xaa; //打開計(jì)時(shí)變量
- lcd_back_time=0; //計(jì)時(shí)變量清0
- WDR(); //喂狗
- if((manage_card[0]==rev_dat[0])&&(manage_card[1]==rev_dat[1])&&(manage_card[2]==rev_dat[2])&&(manage_card[3]==rev_dat[3])&&(manage_card[4]==rev_dat[4])&&(manage_card_inc_en==0))
- {
- inc_card_en=0xaa; //管理卡
- GIFR=(1<<INTF0);
- GICR&=~((1<<INT1)|(1<<INT0)); //關(guān)閉外部中斷0、1
- return;
- }
- if(manage_card_inc_en==0xaa) //添加卡
- {
- manage_card_inc_en=0;
- GIFR=(1<<INTF0);
- GICR&=~(1<<INT0); //關(guān)閉外部中斷0
- return;
- }
- for(i=0;i<5;i++)
- {
- if((card_data[i][0]==rev_dat[0])&&(card_data[i][1]==rev_dat[1])&&(card_data[i][2]==rev_dat[2])&&(card_data[i][3]==rev_dat[3])&&(card_data[i][4]==rev_dat[4]))
- { //卡1
- GICR&=~((1<<INT1)|(1<<INT0)); //關(guān)閉外部中斷0、1
- xx=0;
- WDR(); //喂狗
- LOCK_ON; //開鎖
- delay_ms(500);
- LOCK_OFF;
- rev_dat[0]=rev_dat[1]=rev_dat[2]=rev_dat[3]=rev_dat[4]=0xff;
- i=6;
- }
- }
- close_read=1;
- card_num=0;
- xx=0;
- GICR&=~(1<<INT0); //關(guān)閉外部中斷0
- card_num=0;
- }
- GIFR=(1<<INTF0);
- }
- //*********************************************按鍵中斷INT1********************************************************
- #pragma interrupt_handler int1_on:3
- void int1_on(void)
- {
- delay_ms(10); //按鍵采樣, 注意,一定要延時(shí)8MS以上,否則會(huì)造成連鍵現(xiàn)象
- kk=1;
- GICR&=~(1<<INT1); //關(guān)閉外部中斷1
- GIFR=(1<<INTF1);
- }
- //*****************************************************************************************************************
- //文件名: 用AD來檢測(cè)按鍵
- //編譯日期: 2007-01-21
- //功能描述:
- // 1、共8個(gè)KEY,利用AD口其中的一個(gè),來測(cè)電壓不同來判斷哪個(gè)按鍵按下。
- //CPU類型: ATmega16
- //晶振頻率: 7.3728MHZ
- //版本: V0.1
- //編程: 于軍峰
- //*****************************************************************************************************************
- //理論值:
- // S1=0V S2=0.45V S3=0.83V S4=1.15V S5=1.42V S6=1.66V S7=1.875V S8=2.05V 無按下時(shí)=5V
- //
- // S1=SET S2=向上 S3=向下 S4=向左 S5=向右 S6=確認(rèn) S7=返回 S8=關(guān)于
- //
- //**********************************************AD來檢測(cè)按鍵*******************************************************
- void read_adc(void)
- {
- uint key_val=0;
- key_val=adc_sampling(ADC_PINA0);
- if(key_val<400)
- {
- key=1;
- }
- else if(key_val<600) //向上
- {
- key=2;
- }
- else if(key_val<1000) //向下
- {
- key=3;
- }
- else if(key_val<1200) //向左
- {
- key=4;
- }
- else if(key_val<1500) //向右
- {
- key=5;
- }
- else if(key_val<1700) //OK
- {
- key=6;
- }
- else if(key_val<1900) //返回
- {
- key=7;
- }
- else if(key_val<2200) //說明
- {
- key=8;
- }
- else
- {
- key=0;
- return;
- }
- }
- //************************************************ADC 采樣*********************************************************
- uint adc_sampling(uchar adc_input)
- {
- ulong temp32=0;
- uint tem_3=0;
- CLI(); //關(guān)中斷
- ADMUX=(0x40|adc_input); //選擇外接參考電壓,AVCC, AREF 引腳外加濾波電容
- //adc_input:?jiǎn)味送ǖ?0x00~0x07,0x1E,0x1F
- ADCSRA|=(1<<ADSC); //啟動(dòng)AD轉(zhuǎn)換
- while ((ADCSRA&(1<<ADIF))==0);
- ADCSRA|=(1<<ADIF); //寫1清除標(biāo)志位
- temp32=ADC;
- //**************************************第一次采樣的值舍去不要*****************************************************
- ADMUX=(0x40|adc_input); //選擇外接參考電壓,AVCC, AREF 引腳外加濾波電容
- //adc_input:?jiǎn)味送ǖ?0x00~0x07,0x1E,0x1F
- ADCSRA|=(1<<ADSC); //啟動(dòng)AD轉(zhuǎn)換
- while ((ADCSRA&(1<<ADIF))==0);
- ADCSRA|=(1<<ADIF); //寫1清除標(biāo)志位
- temp32=ADC;
- temp32*=vref;
- tem_3=((uint)(temp32/1024));
- SEI(); //開中斷
- return(tem_3);
- }
- //**********************************************室溫檢測(cè)***********************************************************
- uchar temperature_check(void)
- {
- uchar adc_result1=0;
- temp_value=adc_sampling(ADC_PINA1); //AD采樣
- adc_result1=get_degree();
- if(adc_result1<=30) //是否為零下
- {
- adc_result1=31-adc_result1;
- cold=0xaa;
- }
- else
- {
- cold=0;
- adc_result1-=31;
- }
- return(adc_result1);
- }
- //**********************************************溫度查表***********************************************************
- uchar get_degree(void)
- {
- uchar x=129; //只檢測(cè)溫度-30---+99
- for (x=129;x>0;x--) // 查表
- {
- if (temp_1[x]>=temp_value)
- {
- return x;
- }
- }
- return x;
- }
- //********************************************峰鳴器處理***********************************************************
- void buzzer_pro(uchar p)
- {
- for(;p>0;p--)
- {
- WDR(); //喂狗
- buzzer_on;
- delay_ms(15);
- buzzer_off;
- delay_ms(15);
- }
- }
- //**************************************************Program End****************************************************
復(fù)制代碼
|
評(píng)分
-
查看全部評(píng)分
|