lock_main.c
来自「一个基于单片机系统的门禁例子」· C语言 代码 · 共 1,865 行 · 第 1/4 页
C
1,865 行
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.时间日期设置");
break;
case 1:
han_zi_display(" 2.报警开关设置");
break;
case 2:
han_zi_display(" 3.人体红外设置");
break;
case 3:
han_zi_display(" 4.路灯开关设置");
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();
}
//******************************************************主目录初始化函数*******************************************
void main_menu_initial(void)
{
main_menu[0].menu_count = 4;
main_menu[0].display_string = " 1.时间日期设置";
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.报警开关设置";
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.人体红外设置";
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.路灯开关设置";
main_menu[3].subs = nullsubs;
main_menu[3].children_menus = lamp_menu;
main_menu[3].parent_menus = null;
}
//**************************************************报警开关设置目录初始化函数*************************************
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. 关闭 ";
alarm_menu[1].subs = alarm_set;
alarm_menu[1].children_menus = null; //&null
alarm_menu[1].parent_menus = main_menu;
}
//*************************************************人体红外开关设置目录初始化函数**********************************
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. 关闭 ";
infrared_menu[1].subs = infrared_set;
infrared_menu[1].children_menus = null; //&null
infrared_menu[1].parent_menus = main_menu;
}
//*************************************************路灯开关设置目录初始化函数**************************************
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. 关闭 ";
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. 确认 ";
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. 确认 ";
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; //准备接收新卡号码
clear_screen();
auto_return=0; //菜单自动返回变量清0
write_com(0x80);
han_zi_display(" 请刷卡!");
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)); //关闭外部中断0、1
write_com(0x90);
han_zi_display("卡号:");
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(" 请核对!");
delay_ms(3000);
}
else
{
manage_card_inc_en=0; //在请刷卡界面,如果没有刷卡,自动返回后要清0此变量
lcd_dis_num=0;
auto_return=88; //随便赋一个比OVER_FLOW大的数字,目的是退出子菜单,进入主屏
}
GICR|=(1<<INT1); //打开外部中断1
auto_return=0; //菜单自动返回变量清0
WDR(); //喂狗
}
}
//***************************************************卡数量查询****************************************************
void query_card(void)
{
ulong tem_1=0;
uchar hh;
card_pro(); //把EEPROM数据读出来
GICR&=~((1<<INT1)|(1<<INT0)); //关闭外部中断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); //显示卡号
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("稍后自动返回!");
delay_ms(5000);
clear_screen();
GICR|=(1<<INT1); //打开外部中断1
auto_return=88; //随便赋一个比OVER_FLOW大的数字,目的是退出子菜单,进入主屏
}
//*****************************************************保存新卡****************************************************
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处开始写数据
}
else if((card_data[1][3]==0xff)&&(card_data[1][4]==0xff))
{
eeprom_addr=6; //从EEPROM的地址6处开始写数据
}
else if((card_data[2][3]==0xff)&&(card_data[2][4]==0xff))
{
eeprom_addr=11; //从EEPROM的地址11处开始写数据
}
else if((card_data[3][3]==0xff)&&(card_data[3][4]==0xff))
{
eeprom_addr=16; //从EEPROM的地址16处开始写数据
}
else if((card_data[4][3]==0xff)&&(card_data[4][4]==0xff))
{
eeprom_addr=21; //从EEPROM的地址21处开始写数据
}
else
{
clear_screen();
WDR(); //喂狗
write_com(0x80);
han_zi_display(" 卡已存满!");
write_com(0x90);
han_zi_display("请全部删除, 再增");
write_com(0x88);
han_zi_display(" 加新卡!");
auto_return=88; //随便赋一个比OVER_FLOW大的数字,目的是退出子菜单,进入主屏
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(" 已保存卡号!");
card_pro(); //把EEPROM数据读出来,更新RAM中的card_data数组
delay_ms(4000);
GICR|=(1<<INT1); //打开外部中断1
auto_return=88; //随便赋一个比OVER_FLOW大的数字,目的是退出子菜单,进入主屏
}
//*********************************************不保存卡函数********************************************************
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; //随便赋一个比OVER_FLOW大的数字,目的是退出子菜单,进入主屏
}
//*********************************************清除全部卡函数******************************************************
void clear_card(void)
{
uchar ii;
for(ii=1;ii<36;ii++) //从EEPROM地址1处开始写0XFF
{
eeprom_write(ii,0xff); //把前EEPROM 的前30位内容全部清成0xff
WDR(); //喂狗
}
clear_screen();
write_com(0x90);
han_zi_display("已删除全部卡号!");
write_com(0x88);
han_zi_display("请尽快添加新卡!");
card_pro(); //把EEPROM数据读出来
delay_ms(4000);
auto_return=88; //随便赋一个比OVER_FLOW大的数字,目的是退出子菜单,进入主屏
}
//********************************************取消删除卡时处理的函数***********************************************
void no_clear_card(void) //不处理任何数据
{
auto_return=88; //随便赋一个比OVER_FLOW大的数字,目的是退出子菜单,进入主屏
}
//***********************************************日期时间设置******************************************************
void date_time_set(void)
{
clear_screen();
tem[5]=0; //秒变量清0
set_time_temp=1;
time_set_display();
}
//******************************************报警开关设置***********************************************************
void alarm_set(void)
{
clear_screen();
write_com(0x90);
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?