久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3496|回復: 3
打印 上一主題 下一主題
收起左側

單片機矩陣鍵盤掃描誤觸發的問題

[復制鏈接]
跳轉到指定樓層
樓主
本人新手
請 大家幫小弟看一下 為什么我寫的這個矩陣鍵盤掃描函數 會誤觸發 像是沒有消抖功能 小弟百思不得其解 請大家幫幫 謝謝了#define KeyPort P3

unsigned char KeyScan()                        //矩陣掃描,使用行列逐級掃描法
{
   unsigned char VAL;
   KeyPort=0xf0;//高四位置高,低四位拉低
   if(KeyPort!=0xf0)//表示有按鍵按下
   {
        Delay(10);  //去抖
        if(KeyPort!=0xf0)   //表示有按鍵按下
          {           
                Delay(5);
                if(KeyPort!=0xf0)
                {
                         KeyPort=0xfe; //檢測第一行
                     if(KeyPort!=0xfe)
                          {
                          VAL=KeyPort&0xf0;
                            VAL+=0x0e;
                        while(KeyPort!=0xfe);
                        Delay(10);
                        while(KeyPort!=0xfe);
                               return VAL;
                         }
                }
        }


        return 0xff;
}


只檢測了第一行,發現按鍵的時候,會有誤觸發
我想知道我這個邏輯哪里有問題
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:149988 發表于 2017-7-13 07:03 | 只看該作者

RE: 單片機矩陣鍵盤掃描誤觸發的問題

開發板配的矩陣鍵盤程序都非常好,講解的都很詳細,網上也有很多矩陣鍵盤的例子。拿過來仔細分析一下,真正弄懂其原理,再自我發揮,寫出自己需要的矩陣鍵盤程序。你寫的這段矩陣鍵盤程序,有點看不懂。開始鍵值KeyPort賦值0xf0,去抖、延時后KeyPort又賦值0xfe(KeyPort=0xfe; //檢測第一行),如果一直有鍵按下KeyPort肯定不等于0xfe,但究竟是哪個鍵還是不清楚。經過VAL=KeyPort&0xf0; VAL+=0x0e;運算后,VAL=0xfe。這個VAL=0xfe是人為的,不是程序判斷出來的。只要有鍵一直按下,KeyPort不會等于0xfe。 while(KeyPort!=0xfe);是成立的,僅此而已。
回復

使用道具 舉報

板凳
ID:213173 發表于 2017-7-13 07:32 | 只看該作者
程序修改如下:
#define KeyPort P3
unsigned char keyscan()                                        //矩陣鍵盤掃描函數
{
        unsigned char temp1,temp2,VAL;                //臨時變量
        static bit sign=0;                                        //按鍵自鎖標志
        static unsigned char count=0;                //消抖計數變量
        KeyPort=0xf0;                                                //先給P3賦一個初值
        if(KeyPort!=0xf0)                                         //判斷P3不等于所賦初值,說明有健按下
        {
                if(sign==0)                                                //如果按鍵自鎖標志為0
                {
                        count++;                                        //消抖計數
                        if(count>=100)                                //消抖計數自>=100,估算主循環周期調整
                        {                                                        //摒棄Delay延時方式,提高運行效率
                                count=100;                                //防止溢出
                                sign=1;                                        //按鍵自鎖標志置1,鍵不抬起,按其他鍵無效
                                temp1=KeyPort;                        //temp1保存高4位變化
                                KeyPort=0x0f;                        //再給P3賦值0x0f
                                temp2=KeyPort;                        //temp2保存低4位變化
                                VAL=temp2|temp1;                //VAL=高4位+低4位
                                return VAL;                                //返回VAL值
                        }
                }
        }
        else                                                                 //按鍵抬起
        {
                sign=0;                                                        //按鍵自鎖標志清0
                count=0;                                                //消抖計數清0
        }
}
回復

使用道具 舉報

地板
ID:164602 發表于 2017-7-13 08:30 | 只看該作者
程序問題吧。
我這里有一個例程,你看看。
/*******************************************************************************
* 函 數 名         : KeyDown
* 函數功能                   : 檢測有按鍵按下并讀取鍵值
* 輸    入         : 無
* 輸    出         : 無
*******************************************************************************/
void KeyDown(void)
{
        char a=0;
        GPIO_KEY=0x0f;
        if(GPIO_KEY!=0x0f)//讀取按鍵是否按下
        {
                Delay10ms();//延時10ms進行消抖
                if(GPIO_KEY!=0x0f)//再次檢測鍵盤是否按下
                {
                       
                        //測試列
                        GPIO_KEY=0X0F;
                        switch(GPIO_KEY)
                        {
                                case(0X07):        KeyValue=0;break;
                                case(0X0b):        KeyValue=1;break;
                                case(0X0d): KeyValue=2;break;
                                case(0X0e):        KeyValue=3;break;
                        }
                        //測試行
                        GPIO_KEY=0XF0;
                        switch(GPIO_KEY)
                        {
                                case(0X70):        KeyValue=KeyValue;break;
                                case(0Xb0):        KeyValue=KeyValue+4;break;
                                case(0Xd0): KeyValue=KeyValue+8;break;
                                case(0Xe0):        KeyValue=KeyValue+12;break;
                        }
                        while((a<50)&&(GPIO_KEY!=0xf0))         //檢測按鍵松手檢測
                        {
                                Delay10ms();
                                a++;
                        }
                }
        }
}
對應電路如圖,看看你的電路和它怎么樣,才能移植。

1.jpg (25.29 KB, 下載次數: 40)

1.jpg
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲国产精品久久 | 精品久久久久久亚洲精品 | 谁有毛片 | 久久久精品网 | 青青草一区二区三区 | 久久久www成人免费精品 | 久久精品在线播放 | 日韩精品一区二区三区中文在线 | 99久久婷婷国产综合精品电影 | 欧美啊v在线观看 | 在线播放中文字幕 | 日韩午夜精品 | 日韩欧美一区在线 | 亚洲一区综合 | 粉嫩一区二区三区四区公司1 | 午夜在线影院 | 91精品国产91久久久久久最新 | 色偷偷噜噜噜亚洲男人 | 日韩精品久久一区 | 国产免费一级一级 | 久久亚洲欧美日韩精品专区 | 国产日产精品一区二区三区四区 | 国产精品色综合 | 搞黄网站在线观看 | 视频一区二区在线观看 | 九七午夜剧场福利写真 | 成人国产免费观看 | 天天操天天舔 | 国产精品小视频在线观看 | 国产精品国产自产拍高清 | 欧美一区二区三区久久精品 | 国产在线色 | 亚洲一二三在线 | 人人做人人澡人人爽欧美 | 激情av | 国产精品美女在线观看 | 国产一区二区视频免费在线观看 | 色婷婷综合网 | 国产精品国产a级 | 久久91精品国产一区二区 | 妹子干综合 |