⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 key.c

📁 记录仪
💻 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 + -