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

📄 key_time.h

📁 51查询按键例程,支持长按键,附带各种时间软件定时器
💻 H
字号:
/* ================================================= */
/*                                                   */
/*   KEY_TIME.H                                      */
/*   (c) 2001 Author HONGLEISHI                      */
/*                                                   */
/*   时间和查询按键                                  */
/*                                                   */
/* ================================================= */

#ifndef _KEY_TIME_H
#define _KEY_TIME_H
#include <string.h>

/*  定义T0中断时间     */
//#define T0_2MS5
//#define T0_5MS
#define T0_10MS
//#define T0_20MS

#ifdef T0_2MS5
   #define T0TIME  2.5 
#endif
#ifdef T0_5MS
   #define T0TIME  5 
#endif
#ifdef T0_10MS
   #define T0TIME  10 
#endif
#ifdef T0_20MS
   #define T0TIME  20 
#endif

#define KEY0 0                  /* 无按键代码 */
#define KEY1 1                  /* 按键1编码  */
#define KEY2 2                  /* 按键2编码  */
#define KEY3 3                  /* 按键3编码  */
#define KEY4 4                  /* 按键4编码  */
#define KEY5 5                  /* 按键5编码  */
#define KEY6 6                  /* 按键6编码  */
#define KEY7 7                  /* 按键7编码  */
#define KEY8 8                  /* 按键8编码  */
#define KEY_NO KEY0             /* 无按键     */
#define KEY_EXCEED  0XFF        /* 按键超时   */


#define KEY_BUFF_LEN       5       /* 按键缓冲区大小 */
#define KEY_EXCEED_TIME    60      /* 按键超时,秒    */
#define KEY_PRESS_TIME     2000    /*长按时间,毫秒   */
#define KEY_INTERVAL_TIME  20      /*长按间隔,毫秒   */
unsigned char keybuff[KEY_BUFF_LEN];  /* 按键缓冲区  */
unsigned char keytail=0;              /* 按键指针尾  */
unsigned char B_keymark;              /* 有按键标志  */
unsigned char keypress;               /* 当前按键    */
unsigned char keylast3;               /* 第三次按键  */
unsigned char keylast4;               /* 第四次按键  */
unsigned char keycontinue=0;          /* 长按键计数  */
unsigned char getkeytime;             /* 按键超时长  */


/* 判断按键,根据实际改动  */
sbit JP1 = P3^3;
sbit JP2 = P3^4;
sbit JP3 = P3^5;
unsigned char encode()
{
   unsigned char k;
   JP1=JP2=JP3=1;
   if(!JP1)k=KEY1;
   else if(!JP2)k=KEY2;
   else if(!JP3)k=KEY3;
   else k=KEY0;
   return k;
}
/* 按键初始化  */
void InitKey(void)
{
   keytail=0;
   B_keymark=0;
   keypress=0;
   keylast3=0;
   keylast4=0;
   keycontinue=0;
   getkeytime=KEY_EXCEED_TIME;
}
/* 判断按键是否有效 定时器0中断调用 */
void keydowith(void)
{
   keypress=encode();
   if (!B_keymark)                /* 第一次按键标志  */
   {
      if(keypress!=KEY0)          /* 第一次按键      */
      {
         B_keymark=1;
         keycontinue=0;
         keylast3=keypress;
      }
   }
   else  
   {
      if(keypress!=KEY0)          /* 按键未释放      */
      {
         if(keycontinue==3)keylast3=keypress;
         if(keycontinue==4)keylast4=keypress;
         if(keycontinue>KEY_PRESS_TIME/T0TIME) /*长按时间*/
         {
            if(keytail<KEY_BUFF_LEN)
              keybuff[keytail++]=keylast3;
            keycontinue=(KEY_PRESS_TIME-KEY_INTERVAL_TIME)/T0TIME;
         }
         else keycontinue++;
      }
      else
      {
         B_keymark=0;
         if(keytail<KEY_BUFF_LEN  && 
            keycontinue>4 && 
            keylast3==keylast4)
            keybuff[keytail++]=keylast3;
      }
      getkeytime=KEY_EXCEED_TIME;
   } 
  return;
}

/* 读按键,立即返回,不清缓冲区 */
unsigned char ReadKey(void)
{
  return (!keytail)? KEY0:keybuff[0];
}
/* 读按键,有按键返回,不清缓冲区 */
unsigned char ReadKeyValid(void)
{
   unsigned char k;
   while((k=ReadKey())==KEY_NO)
   {
       if(!getkeytime)return KEY_EXCEED;
       //ExWdtReset();   /* 复位看门狗 */
       //wdt_reset();
   };
   return k;
}
/* 取按键,立即返回,清缓冲区 */
unsigned char GetKey(void)
{
     unsigned char k;
     if(!getkeytime)return KEY_EXCEED;
     if(!keytail)return(KEY0);
     k=keybuff[0];
     memcpy((void *)keybuff,
            (void *)(keybuff+1),
            --keytail);
     return(k);
}
/* 取按键,有按键返回,清缓冲区 */
unsigned char GetKeyValid(void)
{
   unsigned char k;
   while((k=GetKey())==KEY_NO)
   {
     if(!getkeytime)return KEY_EXCEED;
     //ExWdtReset();    /* 复位看门狗 */
     //wdt_reset();
   }
   return k;
}
/* ================================================= */
/*                                                   */
/*   KEY_TIME.H                                      */
/*   (c) 2001 Author                                 */
/*                                                   */
/*   Description                                     */
/*                                                   */
/* ================================================= */

/* 2.5 ms:0xf7     */
/*    5ms:0xee13   */
/*   10ms:0xdc     */
/*   20ms:0xb8     */

#ifdef T0_2MS5
   #define T0RELOADH  0xf7 
#endif
#ifdef T0_5MS
   #define T0RELOADH  0xee 
#endif
#ifdef T0_10MS
   #define T0RELOADH  0xdc 
#endif
#ifdef T0_20MS
   #define T0RELOADH  0xb8 
#endif

#define T0RELOADL  0x00

unsigned char time_nms;            //      10ms
unsigned char time_100ms;          //      100ms
unsigned char time_second;         //      1s
unsigned char time_minute;         //      1m
unsigned char time_hour;           //      1h

unsigned char soft_timer_nms0;    //        n          0
unsigned char soft_timer_nms1;    //        n          1
unsigned char soft_timer_nms2;    //        n          2
unsigned char soft_timer_100ms0;  //      200          0
unsigned char soft_timer_100ms1;  //      200          1
unsigned char soft_timer_100ms2;  //      200          2
unsigned char soft_timer_second0; //          1        0
unsigned char soft_timer_second1; //          1        1
unsigned char soft_timer_second2; //          1        2
unsigned char soft_timer_minute0; //          1        0
unsigned char soft_timer_minute1; //          1        1
unsigned char soft_timer_minute2; //          1        2
/*****************************************************
 *                     定时器 0                      *
 *****************************************************/
void InitTimer0(void)
{
    TR0=0;        //      0
    ET0=0;
    TMOD=(TMOD&0xf0)|0x01;
    TH0=T0RELOADH,TL0=T0RELOADL;
    ET0=1;
    TR0=1;        //    T0
    return;
}

void timer0(void) interrupt 1
{
     TR0=0;
     TH0=T0RELOADH;
     TL0=T0RELOADL;
     TR0=1;
     if(soft_timer_nms0)soft_timer_nms0--;
     if(soft_timer_nms1)soft_timer_nms1--;
     if(soft_timer_nms2)soft_timer_nms2--;
     if (++time_nms==10){
        time_nms=0;
        if(soft_timer_100ms0)soft_timer_100ms0--;
        if(soft_timer_100ms1)soft_timer_100ms1--;
        if(soft_timer_100ms2)soft_timer_100ms2--;
        if (++time_100ms==10){
           time_100ms=0;
           if(getkeytime)getkeytime--;  //
           if(soft_timer_second0)soft_timer_second0--;
           if(soft_timer_second1)soft_timer_second1--;
           if(soft_timer_second2)soft_timer_second2--;
           if (++time_second==60){
              time_second=0;
              if(soft_timer_minute0)soft_timer_minute0--;
              if(soft_timer_minute1)soft_timer_minute1--;
              if(soft_timer_minute2)soft_timer_minute2--;
              if (++time_minute ==60){
                 time_minute=0;
                 if (++time_hour ==24)time_hour=0;
                 }//minute
              }//second
           }//200ms
        }//20ms
     keydowith();
     return;

}  //timer0 end

#endif
/* ================================================= */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -