標(biāo)題: 關(guān)于51單片機(jī)矩陣鍵盤程序調(diào)試的問題 [打印本頁]

作者: vo1t    時(shí)間: 2023-3-21 21:50
標(biāo)題: 關(guān)于51單片機(jī)矩陣鍵盤程序調(diào)試的問題
rt,在跟著郭天祥老師的視頻學(xué)習(xí)中,自己寫了代碼和老師的不一樣,但可以成功運(yùn)行?墒侵笤趺炊枷氩煌ㄊ侨绾芜\(yùn)行成功的,

我疑問的點(diǎn)在于當(dāng)我按下一個(gè)按鍵時(shí),P3口的值就發(fā)生了變化,但是如果我是在一次循環(huán)的末尾按下的按鍵,那么進(jìn)入下一次循環(huán)的時(shí)候,P3的值不是就又被代碼重新賦值了嗎?那么是怎么檢測(cè)到是哪一行的呢?越想越想不通了,但是下載到開發(fā)板上是可以完美運(yùn)行的。好暈

單片機(jī)代碼如下:
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int


sbit wela=P2^7;
sbit dula=P2^6;

uchar code tabledu[]=
{0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};

uchar i,num,temp,key;

void delay(uint i)
{
        uint x,y;
        for(x=i;x>0;x--)
                for(y=110;y>0;y--);
}

void main()
{
        num=0;
        temp=0xfe;
        wela=1;
        P0=0xc0;
        wela=0;
        dula=1;        
        P0=0x00;
        dula=0;
        while(1)
        {
                for(i=0;i<4;i++)
                {
                        P3=_crol_(temp,i);
                        key=P3;
                        key=key&0xf0;
                        while(key!=0xf0)
                        {
                                delay(10);
                                key=P3;
                                key=key&0xf0;
                                while(key!=0xf0)
                                {
                                        switch(key)
                                        {
                                                case 0xe0:num=1+(i*4);        
                                                        break;
                                                case 0xd0:num=2+(i*4);        
                                                        break;
                                                case 0xb0:num=3+(i*4);        
                                                        break;
                                                case 0x70:num=4+(i*4);        
                                                        break;
                                        }
                                        break;        
                                }
                                dula=1;        
                                P0=tabledu[num-1];
                                dula=0;        
                                break;        
                        }
                }
        }
}




作者: vo1t    時(shí)間: 2023-3-21 21:52
我的代碼里并沒有對(duì)P3的低位(也就是行數(shù))進(jìn)行驗(yàn)證是多少,但是卻可以完美的運(yùn)行出來,真的沒搞懂
作者: vo1t    時(shí)間: 2023-3-21 21:52
感覺自己表達(dá)的也不是很清楚,不知道有沒有大佬能懂我意思
作者: vo1t    時(shí)間: 2023-3-21 22:06
我嘗試把for循環(huán)中第一條給P3口賦值的語句刪除掉,程序就無法運(yùn)行了,按任何按鍵都沒有反應(yīng)。所以我想問一下,給P3賦一個(gè)值的意義是什么呢?我反復(fù)看了幾遍老師的視頻,沒有理解得很透徹。視頻里的意思是先給低位賦值,先確定行后確定列,可是用代碼這樣賦值不就是和實(shí)際使用當(dāng)中矛盾了嘛希望有大佬幫我解答一下,或者有講得比較清楚的視頻或帖子可以推薦一下,我自己去看,感謝各位
作者: lkc8210    時(shí)間: 2023-3-21 23:34
傳統(tǒng)51單片機(jī)的準(zhǔn)雙向IO結(jié)構(gòu)
準(zhǔn)雙向IO置1時(shí)是弱上拉,只能輸出很小的電流(150~270uA)
準(zhǔn)雙向IO置0時(shí)是開漏,能接受比較大的電流(6~20mA)
所以當(dāng)IO(P30)置0時(shí)(i=0),而其它IO置1時(shí)(P3 => 0xFE)
如果他們之間的按鍵被按下(短路P34)
P34就會(huì)被拉低(P3 => 0xEE)
P3 & 0xF0 => 0xE0
結(jié)合i就得出鍵值

給P3賦一個(gè)值就是為了拉低一位
不賦值P3=> 0xFF
按啥鍵都沒有電平變化
自然不符合 switch(key)中的任一個(gè)case
作者: vo1t    時(shí)間: 2023-3-21 23:39
lkc8210 發(fā)表于 2023-3-21 23:34
傳統(tǒng)51單片機(jī)的準(zhǔn)雙向IO結(jié)構(gòu)
準(zhǔn)雙向IO置1時(shí)是弱上拉,只能輸出很小的電流(150~270uA)
準(zhǔn)雙向IO置0時(shí)是開 ...

懂了懂了,太感謝了。。!謝謝大神!
作者: vo1t    時(shí)間: 2023-3-22 01:00
lkc8210 發(fā)表于 2023-3-21 23:34
傳統(tǒng)51單片機(jī)的準(zhǔn)雙向IO結(jié)構(gòu)
準(zhǔn)雙向IO置1時(shí)是弱上拉,只能輸出很小的電流(150~270uA)
準(zhǔn)雙向IO置0時(shí)是開 ...

在感謝一下大神,又仔細(xì)想了想完全懂了,謝謝你!
作者: a185980800    時(shí)間: 2023-3-22 02:15
#include<reg52.h> // 導(dǎo)入 8052 單片機(jī)頭文件 #include<intrins.h> // 導(dǎo)入 _crol_ 函數(shù)所需的頭文件  #define uchar unsigned char // 定義無符號(hào)字符類型 #define uint unsigned int // 定義無符號(hào)整數(shù)類型  sbit wela=P2^7; // 定義 WELA 引腳 sbit dula=P2^6; // 定義 DULA 引腳  uchar code tabledu[]= {0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71}; // 定義顯示表格  uchar i,num,temp,key; // 定義變量  void delay(uint i) { // 延時(shí)函數(shù)     uint x,y;     for(x=i;x>0;x--)         for(y=110;y>0;y--); }  void main() {     num=0; // 初始化 num 變量     temp=0xfe; // 初始化 temp 變量     wela=1; // 置位 WELA 引腳     P0=0xc0; // 將 "1100 0000"(第一位和第二位為 1)寫入 P0 寄存器中,用于控制數(shù)碼管     wela=0; // 復(fù)位 WELA 引腳     dula=1; // 置位 DULA 引腳     P0=0x00; // 將 "0000 0000" 寫入 P0 寄存器,用于清除數(shù)碼管上次顯示的內(nèi)容     dula=0; // 復(fù)位 DULA 引腳     while(1) {         for(i=0;i<4;i++) { // 遍歷四個(gè)數(shù)碼管             P3=_crol_(temp,i); // 將 temp 變量左移 i 位后的值賦給 P3 寄存器             key=P3; // 將 P3 寄存器中的值賦給 key 變量             key=key&0xf0; // 將 key 變量的低四位清零             while(key!=0xf0) { // 如果按鍵沒有被按下,則等待                 delay(10); // 延時(shí) 10ms                 key=P3; // 將 P3 寄存器中的值賦給 key 變量                 key=key&0xf0; // 將 key 變量的低四位清零                 while(key!=0xf0) {                     switch(key) { // 根據(jù)按鍵的不同,將對(duì)應(yīng)的數(shù)字顯示在數(shù)碼管上                         case 0xe0:num=1+(i*4); break; // 按下第一行第一個(gè)按鍵                         case 0xd0:num=2+(i*4); break; // 按下第二行第一個(gè)按鍵                         case 0xb0:num=3+(i*4); break; // 按下第三行第一個(gè)按鍵                         case 0x70:num=4+(i*4); break; // 按下第四行第一個(gè)按鍵                     }                     break;                 }                 dula=1; // 置位 DULA 引腳                 P0=tabledu[num-1]; // 在數(shù)碼管上顯示 num 變量對(duì)應(yīng)的數(shù)字                 dula=0; // 復(fù)位 DULA 引腳                 break;             }         }     } }
作者: glinfei    時(shí)間: 2023-3-22 10:24
a185980800 發(fā)表于 2023-3-22 02:15
#include // 導(dǎo)入 8052 單片機(jī)頭文件 #include // 導(dǎo)入 _crol_ 函數(shù)所需的頭文件  #define uchar unsigned  ...

這個(gè)是不是ChatGPT給的答復(fù)?
作者: a185980800    時(shí)間: 2023-3-22 14:57
Gpt不就是這么用的嗎叫他幫我寫個(gè)注釋了我才看得懂啊
作者: glinfei    時(shí)間: 2023-3-22 15:08
本帖最后由 glinfei 于 2023-3-22 15:16 編輯
a185980800 發(fā)表于 2023-3-22 14:57
Gpt不就是這么用的嗎叫他幫我寫個(gè)注釋了我才看得懂啊

就算有點(diǎn)錯(cuò),總體寫的還行,我覺得如果變量名稱起的規(guī)范,以后寫程序都不用寫注釋了,可惜我沒注冊(cè)上。有沒試過,讓它寫個(gè)矩陣鍵盤程序?




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1