#definenull0
#definevref5000//AD转换参考电压
#defineOVER_FLOW10//进入菜单设置时,如果在10S内没有按下任何键,则自动退出
#pragmadata:
code
//constucharmanage_card[5]={0x0b,0,0x2d,0x23,0x5f};//住房卡-----当作管理卡
constucharmanage_card[5]={0x33,0,0x7c,0x09,0xb1};//0008128945-----当作管理卡
//*************************************************温度测定查表****************************************************
//******************************************温度范围是:
-30度----99度*********************************************
constuinttemp_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,
};
//*****************************************************************************************************************
#pragmadata:
data
ucharcard_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
};
uchartem[7]={7,5,1,8,0,0,6};//日期、时间、星期数组
//年/月/日/H/M/S/W
//********************************************目录结构体定义*******************************************************
structmenu_item
{
shortmenu_count;
char*display_string;
void(*subs)();
structmenu_item*children_menus;
structmenu_item*parent_menus;
};
//**********************************************结构数组声明*******************************************************
structmenu_itemmain_menu[4];
structmenu_itemalarm_menu[2];
structmenu_iteminfrared_menu[2];
structmenu_itemlamp_menu[2];
structmenu_item(*menu_point)=main_menu;
structmenu_itemcard_main_menu[4];
structmenu_itemcard_inc_menu[2];
structmenu_itemcard_dec_menu[2];
structmenu_item(*menu_card)=card_main_menu;
ucharuser_choose=0;
ucharmax_items=0;
uinttemp_value=0;//温度检测AD值
//********************************************变量定义*************************************************************
ucharsecond_temp=0;//秒变量
ucharscan_en=0;//主屏扫描标志位
ucharkey=0;//按键变量
ucharkk=0;//按键按下标志位
ucharauto_return=0;//菜单自动返回变量
ucharreturn_en=0;//菜单自动返回标志位
ucharleft_right=0;//左右键变量
ucharchoose_temp=0;//子菜单标题变量
ucharreturn_temp=0;//返回临时变量
ucharset_time_temp=0;//设置时间时菜单变量,如果=1表示屏显在设置时间菜单
uchartwinkling_addr=0x91;//设置时间时闪动显示位置变量
ucharinc_card_en=0;//添加新卡允许变量
ucharmanage_card_inc_en=0;//管理卡
ucharcold=0;//温度正负极标志位
uchartemp0=0;//温度值变量
ucharxx=88;//温度更新变量,开机赋一个比较大的数,目的是开机就显示温度
ucharclose_read=0;
lcd_back_en=0;//LCD背光计时变量允许
lcd_back_time=0;//LCD背光计时变量
//*****************************************************************************************************************
voiddelay_ms(unsignedintm);//延时
voidread_adc(void);//按键ADC处理
voiddate_time_display(void);//时间日期显示
voidroot_directory(void);//引导主画面
voidset_menu(void);//设置菜单
voidclear_screen(void);//清屏
voidclear_gdram(void);//清全部GDRAM
voidselect_menu(uchardata1);//选择菜单时,标志
voidtime_set_display(void);//时间、日期设置显示
uintadc_sampling(ucharadc_input);//ADC采样
ucharget_degree(void);//温度查表
uchartemperature_check(void);//室温检测
ucharcharge_tem=0;//每十分钟,检测一次电池电量,此变量主要是计时
uintbattery_temp=0;//电平电压变量
//************************************************函数声明区***************************************************
voidmain_menu_initial(void);//主菜单初始化
voidalarm_menu_initial(void);//报警菜单初始化
voidinfrared_menu_initial(void);
voidlamp_menu_initial(void);
voidmenu_initial(void);
voidcard_main_menu_initial(void);
voidcard_inc_menu_initial(void);
voidcard_dec_menu_initial(void);
voidshow_menu(void);
voiddate_time_set(void);
voidalarm_set(void);
voidinfrared_set(void);
voidlamp_set(void);
voidnullsubs(void);
voidtwinkling_addr_pro(void);
voidlcd_week_pro(void);
voidkey_inc_dec(void);
voidlcd_menu_set(void);
voidcard_pro(void);
voidbuzzer_pro(ucharp);
//*****************************************************************************************************************
voidinc_new_card(void);//添加新卡的处理函数
voidquery_card(void);//查询卡函数
voidsave_card(void);//保存卡时处理函数
voidno_save_card(void);//取消保存卡时处理函数
voidclear_card(void);//删除全部卡
voidno_clear_card(void);//取消删除卡
voidcard_menu_show(void);//管理卡菜单显示
voidcard_menu_pro(void);//管理卡菜单处理
voidchar_twinkling(uchardata_1);//字符消隐
//*****************************************************************************************************************
voideeprom_write(uinteeprom_address,uchareeprom_data);//写----EEPROM操作
uchareeprom_read(uinteeprom_address);//读----EEPROM操作
//*************************************************主程序**********************************************************
voidmain(void)
{
PORTA=0XF8;//PA0---按键AD;PA1---室内温度AD;PA2---电平电量检测
PORTB=0XFF;
PORTC=0XFF;
PORTD=0XFF;
DDRA=0XF8;//AD转换时要设为输入、且端口要清0
DDRB=0XFF;
DDRC=0b11111000;
DDRD=0b11110010;//INT0、INT1、RXD设成输入;TXD设成输出
TIMSK=(1<TCCR1A=0;
TCCR1B=0X0D;//CTC模式,1024分频
OCR1A=7200;//定时1S
GICR=(1<MCUCR=(1<ADCSRA=(1<WDTCR=0x0f;//(1<write_com(0x01);//清除显示,并且设定地址指针为00H
menu_initial();//菜单数组初始化
send_initial();//串口初始化
WDR();//喂狗
card_pro();//读EEPROM,到RAM中
lcd_reset();//LCD初始化
write_com(0x90);
buzzer_on;
LCD_BACK_ON;//打开LCD背光
han_zi_display("系统正在启动");
write_com(0x88);
han_zi_display("请稍后......");
delay_ms(500);
clear_gdram();//清除GDRAM--绘图RAM
clear_screen();//清屏
buzzer_off;//峰鸣器指示
lcd_back_en=0xaa;//打开计时变量
lcd_back_time=0;//计时变量清0
SEI();//使能全局中断
while
(1)
{
WDR();//喂狗
if(scan_en==0)//只有在scan_en=0的时候扫描主屏,平时只更新时间
{
scan_en=~scan_en;
clear_screen();
temp0=temperature_check();//温度检测
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<}
}
if(kk)//=1表示有按键按下
{
kk=0;
read_adc();//AD转换,取得键值
buzzer_pro
(1);//峰鸣器指示
LCD_BACK_ON;//打开LCD背光
lcd_back_en=0xaa;//打开计时变量
lcd_back_time=0;//计时变量清0
if(key==1)
{
GICR&=~(1<lcd_menu_set();//LCD菜单设置
GICR=((1<}
elseif(key==8)
{
GICR&=~((1<key=0;
clear_screen();//清屏
write_com(0x80);
han_zi_display("警告");
write_com(0x88);
han_zi_display("版权归于军峰所有");