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

📄 键盘程序.txt

📁 单片机键盘描扫程序. 一直在用的程序.
💻 TXT
字号:
把我设计按键程序的思路说说,欢迎大家拍砖

1、一般都不在键盘程序中延时,而是通过隔一段时间调用(比如10毫秒)来扫描按键,以尽量释放CPU资源;
2、所有键盘程序基本上都是一个模式,可以处理加速键、一键多功能等情况;
3、对外接口只有2个,换用不同硬件的键盘只需把该键盘程序加入工程编译即可,其他不需要作任何改动,非常方便。


基本上都是一个模式:
有键?--YES——和上次相同?--No--Keyold=0;退出 
  |      |
  |     YES--Keyold++;
  |      |
  |     Keyold==首键延时KEYDELAY?--No--退出
  |      |
  |     YES--Keyok=1;     //按下不放一定时间发首键,后面发加速键
  |            保存键值到Keydata;(必要时译码)
  |            Keyold=KEYDELAY-KEYLOOP(按住不放的延时);--退出
  |
  No--Keyold==0?--YES--退出
            |
           N0--Keyok=1;    //不为0说明按了键再放开,当然作按键有效处理
                 保存键值到Keydata;(必要时译码)
                 Keyold=0;--退出

所有键盘程序对外接口:
unsigned char KeyGetCode(void)        //返回按键码
{
    key_ok=0;
    return(key_data);
}

bit KeyTest(void)            //检查有无按键
{
    KeyScan();            //键扫描
    return(key_ok);
}





/*===================================
NOTE:
    键盘处理主程序模块
    此程序在主程序中调用
===================================*/    
void key_scan(void)
{
      unsigned int i;
    
      switch(key_state)
     {
    case 0:
        if(key_exist())    //判断有无键按下入口
        {
        key_time=system_time;
        key_before=key_get();
        key_state=1;
        }
        break;
    case 1:            //消抖入口                    if(key_system-key_time>=10)
        {
        if(key_exist())
         {
                 if(key_before==key_get())
              {
              key_result=key_before;
              key_state=2;
              }
              else
              {
               key_before=0xff;
                          key_result=0xff;
               key_state=0;
               }    
         }
         else
        {
               key_before=0xff;
               key_result=0xff;
               key_state=0;
        }
        }
        break;
    case 2:           //判断键有没有被释放入
        if(key_exist())
        {
        if(key_before=key_get())
        {
              return;                
        }
        else
        {
              key_before=0xff;
              key_state=0;
             }
         }
         else
         {
        key_before=0xffff;
        key_state=0;
         }                
         break;                        
    case initalize:        //初始化如入口
         key_result=0xff;
         key_before=0xff;
         key_time=0;
         key_state=0;
         break;
    default:
         break;
      }
}        

⌨️ 快捷键说明

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