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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

關于單片機矩陣鍵盤程序的理解 求解釋,困惑了好長時間了

[復制鏈接]
跳轉到指定樓層
樓主
附件是矩陣鍵盤的原理圖
以下是矩陣鍵盤掃描程序以及在數碼管顯示0-f


請問如果第一個按鍵被按下,P1口應該是0x07,但進入到測試列的程序中時,P1口被重新賦值為0x0f,那么P1口怎么還會一直保留原來的0x07?到測試行時又被重新賦值為0xf0,怎么還會保留原來的值呢?
跪求大佬解答,詳細,感激不盡!!!!

單片機源程序如下:
#include "reg52.h"                         //此文件中定義了單片機的一些特殊功能寄存器

typedef unsigned int u16;          //對數據類型進行聲明定義
typedef unsigned char u8;

#define GPIO_DIG P0
#define GPIO_KEY P1


u8 KeyValue;        //用來存放讀取到的鍵值


u8 code smgduan[17]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
                                        0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};//顯示0~F的值共陰
void delay(u16 i)
{
        while(i--);        
}
void KeyDown(void)
{
        char a=0;
        GPIO_KEY=0x0f;
        if(GPIO_KEY!=0x0f)//讀取按鍵是否按下
        {
                delay(1000);//延時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))         //檢測按鍵松手檢測
        {
                delay(100);
                a++;
        }
}
void main()
{        

        while(1)
        {        
                KeyDown();                   //按鍵判斷函數
                GPIO_DIG=~smgduan[KeyValue];          //
        }               
}
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:390416 發表于 2021-1-16 00:56 | 只看該作者

這就是矩陣鍵盤掃描的代碼,主函數循環調用本函數就行 不能有死等延遲。必須計數延遲。定時器調用也行(有些浪費不建議)。
回復

使用道具 舉報

板凳
ID:213173 發表于 2021-1-16 07:04 | 只看該作者
預置P1口0x0f,如果第一個按鍵被按下,P1口應該是0x07,此時P1的低4位當前狀態已讀取,以鍵值的方式保存在變量KeyValue中,進入到測試列的步驟時,P1口被重新賦值為0xf0,此時P1的高4位當前狀態0X70再被讀取并與低4位相加。測試得到的結果是0x77。最終輸出KeyValue=0。
回復

使用道具 舉報

地板
ID:654028 發表于 2021-1-16 09:12 | 只看該作者
按鍵抖動
回復

使用道具 舉報

5#
ID:633344 發表于 2021-1-16 10:11 | 只看該作者
你想啊。單片機執行速度非常的快,你按下按鍵的時候(按下的時間很短但對于單片機來說很長了,單片機的處理速度很快)這些操作都已經進行完了,意思就是你雖然進行了賦值,但你還按下了按鍵,按鍵改變了你的賦值,然后switch case語句去判斷你按下了哪個按鍵,
回復

使用道具 舉報

6#
ID:633344 發表于 2021-1-16 10:18 | 只看該作者
單片機的處理速度很快(按鍵時間雖短,但在按鍵的時間內,單片機已經將這些處理進行完畢,意思就是你還按著那個鍵,賦予新的初值只是軟件上的改變,而你還按著這個鍵就是硬件上給io口改變了賦值)軟件上賦值給io口是為檢測硬件上的改變(到底按了哪個鍵)做準備,然后switch case語句去檢測到底按下了哪個鍵

評分

參與人數 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

7#
ID:536119 發表于 2021-1-16 16:42 | 只看該作者
yousir 發表于 2021-1-16 10:18
單片機的處理速度很快(按鍵時間雖短,但在按鍵的時間內,單片機已經將這些處理進行完畢,意思就是你還按著 ...

感謝!!!!!!
回復

使用道具 舉報

8#
ID:235954 發表于 2021-1-18 15:43 | 只看該作者
按鍵行做輸出,列做輸入,只需檢測列那邊電平即可
回復

使用道具 舉報

9#
ID:332444 發表于 2021-1-19 09:22 | 只看該作者
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲欧美在线观看 | 在线成人 | 精品欧美一区二区三区久久久 | 久久精品| 亚洲三级av | 97精品国产97久久久久久免费 | 中文字幕一区二区三区四区不卡 | 亚洲在线一区 | 欧美日韩中文字幕在线 | 中文字幕一区在线观看视频 | 岛国av在线免费观看 | 成人免费xxxxx在线视频 | 男女网站免费观看 | 午夜精品一区二区三区在线观看 | 国产精品毛片久久久久久 | 欧美日韩视频在线 | 一级做受毛片免费大片 | 华丽的挑战在线观看 | 日产精品久久久一区二区福利 | 久久国产成人 | 亚洲www啪成人一区二区麻豆 | 日一日操一操 | 中文字幕在线观看一区二区 | 狠狠干天天干 | 中文在线www | 亚洲一区二区三区四区五区中文 | 欧美精品99| 亚洲国产高清高潮精品美女 | 日韩中文字幕第一页 | 伊人精品在线 | 久草新视频 | 欧美午夜精品理论片a级按摩 | 免费久 | 欧美日韩久 | 男人久久天堂 | 999国产精品视频免费 | 中文字幕日韩欧美 | 国产亚洲高清视频 | 老司机久久 | 国产成人精品一区二区三 | 日朝毛片|