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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1771|回復: 10
收起左側

關于51單片機矩陣鍵盤程序調試的問題

[復制鏈接]
ID:1067696 發表于 2023-3-21 21:50 | 顯示全部樓層 |閱讀模式
rt,在跟著郭天祥老師的視頻學習中,自己寫了代碼和老師的不一樣,但可以成功運行?墒侵笤趺炊枷氩煌ㄊ侨绾芜\行成功的,

我疑問的點在于當我按下一個按鍵時,P3口的值就發生了變化,但是如果我是在一次循環的末尾按下的按鍵,那么進入下一次循環的時候,P3的值不是就又被代碼重新賦值了嗎?那么是怎么檢測到是哪一行的呢?越想越想不通了,但是下載到開發板上是可以完美運行的。好暈

單片機代碼如下:
#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;        
                        }
                }
        }
}



回復

使用道具 舉報

ID:1067696 發表于 2023-3-21 21:52 | 顯示全部樓層
我的代碼里并沒有對P3的低位(也就是行數)進行驗證是多少,但是卻可以完美的運行出來,真的沒搞懂
回復

使用道具 舉報

ID:1067696 發表于 2023-3-21 21:52 | 顯示全部樓層
感覺自己表達的也不是很清楚,不知道有沒有大佬能懂我意思
回復

使用道具 舉報

ID:1067696 發表于 2023-3-21 22:06 | 顯示全部樓層
我嘗試把for循環中第一條給P3口賦值的語句刪除掉,程序就無法運行了,按任何按鍵都沒有反應。所以我想問一下,給P3賦一個值的意義是什么呢?我反復看了幾遍老師的視頻,沒有理解得很透徹。視頻里的意思是先給低位賦值,先確定行后確定列,可是用代碼這樣賦值不就是和實際使用當中矛盾了嘛希望有大佬幫我解答一下,或者有講得比較清楚的視頻或帖子可以推薦一下,我自己去看,感謝各位
回復

使用道具 舉報

ID:161164 發表于 2023-3-21 23:34 | 顯示全部樓層
傳統51單片機的準雙向IO結構
準雙向IO置1時是弱上拉,只能輸出很小的電流(150~270uA)
準雙向IO置0時是開漏,能接受比較大的電流(6~20mA)
所以當IO(P30)置0時(i=0),而其它IO置1時(P3 => 0xFE)
如果他們之間的按鍵被按下(短路P34)
P34就會被拉低(P3 => 0xEE)
P3 & 0xF0 => 0xE0
結合i就得出鍵值

給P3賦一個值就是為了拉低一位
不賦值P3=> 0xFF
按啥鍵都沒有電平變化
自然不符合 switch(key)中的任一個case
回復

使用道具 舉報

ID:1067696 發表于 2023-3-21 23:39 | 顯示全部樓層
lkc8210 發表于 2023-3-21 23:34
傳統51單片機的準雙向IO結構
準雙向IO置1時是弱上拉,只能輸出很小的電流(150~270uA)
準雙向IO置0時是開 ...

懂了懂了,太感謝了。。。≈x謝大神!
回復

使用道具 舉報

ID:1067696 發表于 2023-3-22 01:00 | 顯示全部樓層
lkc8210 發表于 2023-3-21 23:34
傳統51單片機的準雙向IO結構
準雙向IO置1時是弱上拉,只能輸出很小的電流(150~270uA)
準雙向IO置0時是開 ...

在感謝一下大神,又仔細想了想完全懂了,謝謝你!
回復

使用道具 舉報

ID:857072 發表于 2023-3-22 02:15 來自觸屏版 | 顯示全部樓層
#include<reg52.h> // 導入 8052 單片機頭文件 #include<intrins.h> // 導入 _crol_ 函數所需的頭文件  #define uchar unsigned char // 定義無符號字符類型 #define uint unsigned int // 定義無符號整數類型  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) { // 延時函數     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 寄存器中,用于控制數碼管     wela=0; // 復位 WELA 引腳     dula=1; // 置位 DULA 引腳     P0=0x00; // 將 "0000 0000" 寫入 P0 寄存器,用于清除數碼管上次顯示的內容     dula=0; // 復位 DULA 引腳     while(1) {         for(i=0;i<4;i++) { // 遍歷四個數碼管             P3=_crol_(temp,i); // 將 temp 變量左移 i 位后的值賦給 P3 寄存器             key=P3; // 將 P3 寄存器中的值賦給 key 變量             key=key&0xf0; // 將 key 變量的低四位清零             while(key!=0xf0) { // 如果按鍵沒有被按下,則等待                 delay(10); // 延時 10ms                 key=P3; // 將 P3 寄存器中的值賦給 key 變量                 key=key&0xf0; // 將 key 變量的低四位清零                 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; // 置位 DULA 引腳                 P0=tabledu[num-1]; // 在數碼管上顯示 num 變量對應的數字                 dula=0; // 復位 DULA 引腳                 break;             }         }     } }
回復

使用道具 舉報

ID:844772 發表于 2023-3-22 10:24 | 顯示全部樓層
a185980800 發表于 2023-3-22 02:15
#include // 導入 8052 單片機頭文件 #include // 導入 _crol_ 函數所需的頭文件  #define uchar unsigned  ...

這個是不是ChatGPT給的答復?
回復

使用道具 舉報

ID:857072 發表于 2023-3-22 14:57 來自觸屏版 | 顯示全部樓層
Gpt不就是這么用的嗎叫他幫我寫個注釋了我才看得懂啊
回復

使用道具 舉報

ID:844772 發表于 2023-3-22 15:08 | 顯示全部樓層
本帖最后由 glinfei 于 2023-3-22 15:16 編輯
a185980800 發表于 2023-3-22 14:57
Gpt不就是這么用的嗎叫他幫我寫個注釋了我才看得懂啊

就算有點錯,總體寫的還行,我覺得如果變量名稱起的規范,以后寫程序都不用寫注釋了,可惜我沒注冊上。有沒試過,讓它寫個矩陣鍵盤程序?
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久久久久国产精品免费免费 | 久久久久久久久久久爱 | 在线国产一区二区 | 久久国产成人精品国产成人亚洲 | 中文字幕二区三区 | 国产精品激情在线 | 日韩欧美视频免费在线观看 | 久久精品国产一区二区电影 | 亚洲成av| 精品免费国产一区二区三区四区 | 国产精品欧美一区二区三区 | 色视频网站免费 | 在线免费视频一区 | 高清久久 | 色爱综合网 | 久久精品视频播放 | 男人av的天堂 | 欧美日韩高清一区二区三区 | 中文字幕日韩av | 玖玖在线免费视频 | 午夜免费视频 | 日本精品一区二区 | 成人激情视频在线观看 | 日韩免费毛片视频 | 国产精品国产精品国产专区不蜜 | 日本中文字幕在线视频 | 国产精品成人久久久久 | 日本黄色片免费在线观看 | 亚洲高清成人 | 婷婷久| 国产精品精品3d动漫 | 日韩精品免费在线 | 国产亚洲欧美另类一区二区三区 | 亚洲免费精品 | av一区在线观看 | 亚洲一区二区三区在线观看免费 | 日本在线视频不卡 | 亚洲人成网亚洲欧洲无码 | 国产精品99 | 综合久久综合久久 | 91精品久久久久 |