欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 18347|回復: 12
收起左側

比較實用的51矩陣鍵盤程序解析

  [復制鏈接]
ID:70941 發表于 2015-1-23 04:32 | 顯示全部樓層 |閱讀模式


由于單片機I/o口的有限,當需要多個按鍵的時候,常用矩陣鍵盤作為輸入設備.
由于按鍵按下后,松開得到的波形實際中不是理想化的方波,會出現機械抖動,對后續單片機檢測按鍵帶來麻煩,




一般教材上基本都是利用延時去抖動:基本套路都:
void key()
{
if(k1==0) //如果按鍵按下
{
delay_10ms();延時去抖動   
if(k1==0)  再次判斷
{
你要的功能
}
}
}

由于10ms是理論上人們按鍵按下后到松手所要的大概時間,由于個體差異,和按鍵的機械靈活度有差異,導致可能出現按鍵按太快,沒反應,按時間太長導致單片機效率降低等不確定因素.

可以采用判斷是否是第一次按下來進行檢測,可以大大提高效率,當你按鍵按了再快也能檢測到。
程序如下:

//---------------------------------------------------------------------

#include <reg52.h>

#define key P2
int val;

char code sign[17]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x83,0xf8,0x80,0x98,0x88,0x83,0xc6,0xa1,0x86,0x8e};

void delay_10ms();

void key_scan();   //矩陣按鍵函數聲明


void main()
{
        while(1)

        {
        P0=sign[val];
        key_scan();
        }  
}

void key_scan()
{
         static char a,b;  //a用于判斷是不是第一次按下,b用于稍微延時
         char state;   //記錄鍵值
         key=0x0f;
         if(key!=0x0f)                 //如果有按鍵按下
         {
          state=key;   //記錄第一次按鍵狀態
                  if(a==0)                //如果第一次按下
                  {
                   b++;                         //略微延時  不需要延時10ms以提高單片機效率
                           if(b>3)
                        {
                                         if(key==state)                //判斷鍵值是否和第一次一致
                                         {
                                            a=1,b=0;    //復位狀態值 a==1說明已經按下,等待后續松開
                                           key=0x0f;                 //測試列
                                                           switch(key)
                                                           {
                                                                case (0x07):          val=0;break;
                                                                case (0x0b):          val=1;break;
                                                                case (0x0d):          val=2;break;
                                                                case (0x0e):          val=3;break;
                                                           }
                                   key=0xf0;        // 測試行
                                                           switch(key)
                                                           {
                                                                 case (0x70):         val=val;break;
                                                                 case (0xb0):         val=val+4;break;
                                                                 case (0xd0):    val=val+8;break;
                                                                 case (0xe0):         val=val+12;break;
                                                           }
                                           }
                                }
                   }
          }
       else
           {
                a=b=0;                         //松開后復位狀態機
           }                  
}


回復

使用道具 舉報

ID:72399 發表于 2015-1-23 16:11 | 顯示全部樓層
矩陣鍵盤的程序,用到再復制
回復

使用道具 舉報

ID:72399 發表于 2015-1-23 16:11 | 顯示全部樓層
矩陣鍵盤的程序,用到再復制
回復

使用道具 舉報

ID:72399 發表于 2015-1-23 16:11 | 顯示全部樓層
矩陣鍵盤的程序,用到再復制
回復

使用道具 舉報

ID:29438 發表于 2015-2-5 13:33 | 顯示全部樓層
學習了,謝謝!
回復

使用道具 舉報

ID:73030 發表于 2015-2-9 07:59 來自觸屏版 | 顯示全部樓層
留著,用的時候再拿,謝謝樓主。
回復

使用道具 舉報

ID:20841 發表于 2015-2-22 07:24 | 顯示全部樓層
謝謝樓主的分享
回復

使用道具 舉報

ID:73002 發表于 2015-3-11 13:19 | 顯示全部樓層
可以學習下。
回復

使用道具 舉報

ID:263745 發表于 2017-12-21 17:57 | 顯示全部樓層
多鍵摁下 怎么處理呢?
回復

使用道具 舉報

ID:402000 發表于 2018-9-25 11:26 | 顯示全部樓層
非常感謝,減少了打代碼的時間
回復

使用道具 舉報

ID:402219 發表于 2018-9-25 16:01 | 顯示全部樓層
感謝  好具體
回復

使用道具 舉報

ID:985169 發表于 2021-12-5 20:25 | 顯示全部樓層
如果顯示平方數的要怎么修改?
回復

使用道具 舉報

ID:66287 發表于 2021-12-6 09:04 | 顯示全部樓層
思路真正對路,修改待驗證。
回復

使用道具 舉報

14#
無效樓層,該帖已經被刪除
您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表