📄 key.c
字号:
//按键驱动程序
//开关量输入口1,地址 ADDRESS=8300H
//p1.0 和 p1.1 密钥输入,p1.2 打印机状态
//按键连接到 p1.3,p1.4,p1.5,p1.6,p1.7
#include "key.h"
extern unsigned char xdata OLD_YEAR; //以BCD 码格式存放的日期和时间
extern unsigned char xdata OLD_MONTH;
extern unsigned char xdata OLD_DAY;
extern unsigned char xdata OLD_HOUR;
extern unsigned char xdata OLD_MIN;
extern unsigned char xdata drvr_drv_time[300][28];//流水记录所有驾驶员的驾驶情况
extern unsigned int xdata index_drv_time; //上一数组的行下标
extern unsigned char xdata vin[41];
extern unsigned char xdata new_speed_15min[15][21];//_at_ 0x0124; // 停车前15分钟速度
extern unsigned char xdata cur_id[25];//存放当前驾驶员代码,驾驶证号
extern unsigned char xdata id1[11][25] ;//存放所有驾驶员代码,驾驶证号码
extern unsigned char xdata overtime_rec[21][28];
extern unsigned char xdata day_three[3][3]; //存放今天昨天前天的数组
extern unsigned char xdata index_threeday; //存放数组当前的行
extern unsigned char xdata FL_BACKUPA; //备份标志位
extern unsigned char xdata driver_cur; //当前驾驶员是第几位驾驶员,即id1数组的下标
extern unsigned char xdata ctr_beiguang; //背光灯计数器,每当键盘被按下,该值为0,当该值为10时,背光灯灭
extern bit FLAG_LEGAL;
extern bit FL_RUN;
extern void Get_All_Lich(); //计算出累计里程
extern void intlcd(void);
extern void clrlcd(void);
extern void Displaymenu(int menu_sel);
extern void idle(void);
extern void DISPLAY(void);
extern void Connect(void);
extern void DISPLAYID(void);
extern void SelfTest(void);
extern void CHANGEID(int i,int j,int k);
extern void Displaycheck();
extern void DisplayCOM(int i);
extern void Displayprint(int i);
extern bit read_print(void) ;
extern void init_print(void);
extern void hanzi(unsigned char i);
extern void printrecord(void);
unsigned char GetKey()
{
char xdata keytemp,count,longpress;
Clr_WDog(); //清w-dog
count=0;
keytemp=(~KEY>>3) & KEYMASK;
Delay(15);
while(keytemp!=((~KEY>>3) & KEYMASK)) //软件去抖
{
keytemp=(~KEY>>3) & KEYMASK;
Delay(1);
}
while(((~KEY>>3) & KEYMASK)!=NOKEY) // 等按键释放,判断是否长按
{
count++;
Delay(3);
if((count%50)>48)Clr_WDog();
}
if(count>75) //是否长按,改变数值可以更改长按的时间
longpress=LONGPRESS;
else longpress=0;
if((KEY1 & keytemp)==KEY1) return (KEY1|longpress);
else if((KEY2 & keytemp)==KEY2) return (KEY2|longpress);
else if((KEY3 & keytemp)==KEY3)return (KEY3|longpress);
else if((KEY4 & keytemp)==KEY4)return (KEY4|longpress);
else return NOKEY;
}
unsigned char WaitKey(unsigned int count)
{
unsigned int xdata i,key;
Clr_WDog(); //清w-dog
for(i=0;i<count;i++)
{
Clr_WDog(); //清w-dog
key=GetKey();
if(key!=NOKEY)
return key;
else
{
Delay(5);
if((i%50)>48)Clr_WDog();
}
if(FL_RUN) return key;
}
return key;
}
void KeyProcess()
{
unsigned char xdata menu_sel,count;
unsigned char xdata key;
Clr_WDog(); //清w-dog
key=0;
count=0;
key=GetKey();
if(key==0) return;
else
{
P14=0; //背光灯亮
ctr_beiguang=0; //背光灯计数器清0
if(FL_RUN) return;
else if(key!=KEY1) return;
}
menu_sel=0;
Displaymenu(menu_sel); //显示主菜单
Get_All_Lich(); //计算出所有里程
while(1)
{
key=WaitKey(100);//是否有键被按下
Clr_WDog();
switch (key)
{
case KEY1: //功能键,退回上级菜单
case LKEY1:
idle();
return;
case KEY2: // + ,↓键, 翻页,和数字加1
case LKEY2:
count=0;
menu_sel=(menu_sel+3)%6;
Displaymenu(menu_sel);
break;
case KEY3: // → 键选择下一个菜单
case LKEY3:
count=0;
if(menu_sel>2)
{
if(menu_sel==5) menu_sel=3;
else menu_sel++;
}
else menu_sel=(menu_sel+1)%3;
Displaymenu(menu_sel);
break;
case KEY4: //确定
case LKEY4:
switch(menu_sel)
{
case 0: //选择菜单一,显示
Clr_WDog(); //清w-dog
count=0;
DISPLAY();
break;
case 1:
//选择菜单二,通信
Clr_WDog(); //清w-dog
drvr_drv_time[index_drv_time][23]=OLD_YEAR;
drvr_drv_time[index_drv_time][24]=OLD_MONTH;
drvr_drv_time[index_drv_time][25]=OLD_DAY;
drvr_drv_time[index_drv_time][26]=OLD_HOUR;
drvr_drv_time[index_drv_time][27]=OLD_MIN;
count=0;
menu2();
menu_sel=1;
//WaitKey(50);
break;
case 2:
//选择菜单三,打印
Clr_WDog(); //清w-dog
count=0;
menu3();
menu_sel=2;
WaitKey(100);
break;
case 3:
//选择菜单四,自检
Clr_WDog(); //清w-dog
count=0;
menu4();
menu_sel=3;
WaitKey(100);
break;
case 4:
//选择菜单五,身份
Clr_WDog(); //清w-dog
count=0;
menu5();
menu_sel=4;
break;
case 5://选择菜单六,返回
default :
idle();
return ;
}
break;
case NOKEY:
count++;
if(count>2||FL_RUN)
{
count=0;
idle();
return;
}
default:
break;
}
Clr_WDog();
Displaymenu(menu_sel);
}
}
void scankey(void)
{
Clr_WDog(); //清w-dog
idle();
Delay(1);
KeyProcess();
Delay(1);
}
void Delay(unsigned int count)
{
unsigned int xdata j;
while(count--)
{
Clr_WDog();
for(j=0;j<117;j++) ;
}
return;
}
void Clr_WDog(void)
{
WDTRST=0X1E; //喂狗
WDTRST=0XE1;
}
void menu5(void)
{
//驾驶员代码最多只能输入7位,键盘接受到后,将其转换成16进制,保存在数组cur_id[]中驾驶员代码的后3个字节,留待上传。
unsigned int xdata i,j,k;
unsigned char xdata key;
Clr_WDog(); //清w-dog
for(i=0;i<7;i++)
cur_id[i]=0;
clrlcd();
DISPLAYID();
i=0;
j=0;
CHANGEID(i,j,1);
k=0;
while(k<800)
{
key=GetKey();
k++;
switch (key)
{
case KEY2:
case LKEY2:
k=0;
i=(i+1)%10;
CHANGEID(i,j,1);
cur_id[j]=i;
break;
case KEY3:
case LKEY3:
k=0;
CHANGEID(i,j,0);
j=(j+1)%7;
i=cur_id[j];
CHANGEID(i,j,1);
break;
case KEY4:
case LKEY4:
k=800;
break;
default:
break;
}
if(FL_RUN) break;
}
CHANGEID(i,j,0);
Identify();
//记下驾驶员的流水记录
drvr_drv_time[index_drv_time][23]=OLD_YEAR;
drvr_drv_time[index_drv_time][24]=OLD_MONTH;
drvr_drv_time[index_drv_time][25]=OLD_DAY;
drvr_drv_time[index_drv_time][26]=OLD_HOUR;
drvr_drv_time[index_drv_time][27]=OLD_MIN;
index_drv_time=(index_drv_time+1)%300;
for(i=0;i<18;i++) drvr_drv_time[index_drv_time][i]=cur_id[7+i];
drvr_drv_time[index_drv_time][18]=OLD_YEAR;
drvr_drv_time[index_drv_time][19]=OLD_MONTH;
drvr_drv_time[index_drv_time][20]=OLD_DAY;
drvr_drv_time[index_drv_time][21]=OLD_HOUR;
drvr_drv_time[index_drv_time][22]=OLD_MIN;
if(FL_RUN==0)
{
DISPLAYID();
Delay(600);
}
return;
}
void menu4(void)
{
//自检
Clr_WDog(); //清w-dog
SelfTest();
Displaycheck();
return;
}
void menu2(void)
{
Clr_WDog(); //清w-dog
Connect();
return;
}
void menu3(void)
{
int i=0;
Clr_WDog(); //清w-dog
if(i=read_print())
{
Displayprint(0); //打印机未连接
return;
}
else
{
Displayprint(1); //显示正在打印
printrecord(); //打印记录
Delay(50);
}
return;
}
void Identify(void)
{
unsigned char xdata i,j,k;
Clr_WDog(); //清w-dog
FLAG_LEGAL=0; //先将标志位置为非法
FL_BACKUPA=FL_BACKUPA&0XEF;
k=0; //将当前驾驶员代码与已知代码比较
for(i=0;i<10;i++)
{
for(j=0;j<7;j++)
{
if(cur_id[j]==id1[i][j]) k++; //如果前7位全部相等,则k为7
}
if(k==7)
{
FLAG_LEGAL=1; //合法,合法标志置1
FL_BACKUPA=FL_BACKUPA|0X10;
for(j=7;j<25;j++)
cur_id[j]=id1[i][j];
driver_cur=i; //存入当前驾驶员是第几个驾驶员,即数组 id1 的行下标
return;
}
k=0;
}
if(FLAG_LEGAL==0)
{
for(j=0;j<7;j++)
cur_id[j]=0; //将当前驾驶员代码全部置0
for(j=7;j<25;j++)
cur_id[j]=0x30; //将当前驾驶证号码全部置0x30
driver_cur=10; //如果非法,则存入0F
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -