找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 3055|回復(fù): 11
打印 上一主題 下一主題
收起左側(cè)

我學(xué)寫的MCU矩陣鍵盤看不出來有什么問題?

[復(fù)制鏈接]
回帖獎(jiǎng)勵(lì) 80 黑幣 回復(fù)本帖可獲得 20 黑幣獎(jiǎng)勵(lì)! 每人限 1 次(中獎(jiǎng)概率 80%)
跳轉(zhuǎn)到指定樓層
樓主
我是將按鍵的值通過數(shù)碼管顯示,第1,2,3,4個(gè)按鍵按下去正常,

其他按鍵按下去的分布如下所示(這個(gè)是我現(xiàn)在的問題):
1 1 1 1
2 2 2 2
3 3 3 3
4 4 4 4
有沒有大佬解答一下。
我希望的正確結(jié)果是:
1  5  9   13
2  6  10 14
3  7  11 15
4  8  13 16

1.jpg (130.25 KB, 下載次數(shù): 60)

1.jpg
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:123289 發(fā)表于 2019-3-29 01:25 | 只看該作者
對(duì)于計(jì)算機(jī)來說,1也罷、2也罷、它都一樣處理。何必介意鍵值是多少呢?隨便是什么都可以。
要點(diǎn)是:對(duì)于你的硬件布置方便,排好后可以以序給鍵命名。程序要做的事:將你對(duì)鍵的命名與鍵值做個(gè)關(guān)聯(lián)!
回復(fù)

使用道具 舉報(bào)

板凳
ID:123289 發(fā)表于 2019-3-29 01:32 | 只看該作者
例如:電腦用的鍵盤,它有100多個(gè)鍵,拆開看一下,它的連線總是電適合硬件位置的走線方便。
其實(shí)對(duì)于“A"這個(gè)鍵,不同的廠家它的硬件鍵值會(huì)因走線不同而不同,但鍵盤上的CPU會(huì)把它翻譯成“A”的ASCII碼送出去,這樣無論是哪個(gè)廠家的鍵,就都可以通用了。
回復(fù)

使用道具 舉報(bào)

地板
ID:416287 發(fā)表于 2019-3-29 07:53 | 只看該作者
你看哈    void  display(void)  { char a=0;    PGIO_KEY=0X0F;     if(PGIO_KEY!=0x0f)         {delay(1000);          if(PGIO_KEY!=0x0f)          {   PGIO_KEY=0X0F;                     switch(PGIO_KEY)                    { case(0x07): Keyvalue=0;break;                    case(0x0b): Keyvalue=1;break;                    case(0x0d): Keyvalue=2;break;                   case(0x0e): Keyvalue=3;break;                   }                  PGIO_KEY=0xf0;                   switch(PGIO_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)&&(PGIO_KEY!=0xF0))                   delay(1000);                   a++;              }         }           }  
回復(fù)

使用道具 舉報(bào)

5#
ID:96131 發(fā)表于 2019-3-29 08:35 | 只看該作者
第三列最后一行13應(yīng)為12
回復(fù)

使用道具 舉報(bào)

6#
ID:213173 發(fā)表于 2019-3-29 08:43 | 只看該作者

  1. #include <reg51.h>
  2. #define uint unsigned int
  3. #define uchar unsigned char
  4. sbit digital_1=P2^0;
  5. sbit digital_2=P2^1;
  6. uchar  code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
  7. uchar KeyValue=0;                                //鍵值變量
  8. bit sign_1=0,sign_2=0;                        //位變量
  9. uint count_1=0,count_2=0;                //計(jì)數(shù)變量                       

  10. void keyscan()                                        //按鍵掃描程序
  11. {
  12.         P3=0xf0;                                        //賦值P3 1111 0000
  13.         if(P3!=0xf0)                                //檢測有按鍵按下
  14.         {
  15.                 if((++count_1>=250)&&(sign_1==0))//消抖計(jì)數(shù)100~1000,判斷按鍵自鎖
  16.                 {                       
  17.                         sign_1=1;                        //按鍵自鎖標(biāo)志置1
  18.                         switch(P3)
  19.                         {
  20.                                 case(0Xe0):KeyValue=0;break;
  21.                                 case(0Xd0):KeyValue=1;break;
  22.                                 case(0Xb0):KeyValue=2;break;
  23.                                 case(0X70):KeyValue=3;break;
  24.                         }
  25.                         P3=0x0f;                        //賦值P3 0000 1111
  26.                         switch(P3)
  27.                         {
  28.                                 case(0X0e):KeyValue+= 1;break;
  29.                                 case(0X0d):KeyValue+= 5;break;
  30.                                 case(0X0b):KeyValue+= 9;break;
  31.                                 case(0X07):KeyValue+=13;break;
  32.                         }
  33.                 }
  34.         }
  35.         else                                                //鍵抬起
  36.         {
  37.                 sign_1=0;                                //按鍵自鎖標(biāo)志清0
  38.                 count_1=0;                                //消抖計(jì)數(shù)清0
  39.         }
  40. }

  41. void display()                                        //數(shù)碼管顯示程序
  42. {
  43.         if(++count_2>=100)                        //延時(shí)計(jì)數(shù)
  44.         {
  45.                 count_2=0;
  46.                 P0=0x00;                                //消隱
  47.                 if(sign_2==0)
  48.                 {
  49.                         P0=table[KeyValue/10];//顯示十位段碼
  50.                         digital_1=0;
  51.                         digital_2=1;
  52.                         sign_2=1;
  53.                 }
  54.                 else
  55.                 {
  56.                         P0=table[KeyValue%10];//顯示個(gè)位段碼
  57.                         digital_1=1;
  58.                         digital_2=0;
  59.                         sign_2=0;
  60.                 }
  61.         }
  62. }

  63. void main()                                                //主函數(shù)
  64. {
  65.         while(1)
  66.         {
  67.                 keyscan();                                //按鍵掃描程序
  68.                 display();                                //數(shù)碼管顯示鍵值1~16
  69.         }
  70. }
復(fù)制代碼



回復(fù)

使用道具 舉報(bào)

7#
ID:158375 發(fā)表于 2019-3-29 08:45 | 只看該作者
你讀到的按鍵或顯示的按鍵值不對(duì);
這個(gè)要看程序。有程序,一定會(huì)有人幫你的。
回復(fù)

使用道具 舉報(bào)

8#
ID:365802 發(fā)表于 2019-3-29 09:48 | 只看該作者
不應(yīng)該直接返回你要的值, 推薦是由掃描碼返回目標(biāo)碼.
回復(fù)

使用道具 舉報(bào)

9#
ID:282850 發(fā)表于 2019-3-29 09:52 | 只看該作者
程序邏輯清晰,應(yīng)該是“線與”功能出問題。你在列掃描時(shí)加個(gè)default 并+值,看一下是否一直是進(jìn)default 。
回復(fù)

使用道具 舉報(bào)

10#
ID:160500 發(fā)表于 2019-3-29 11:30 | 只看該作者
你這個(gè)程序不對(duì),仔細(xì)檢查一下吧
回復(fù)

使用道具 舉報(bào)

11#
ID:337069 發(fā)表于 2019-3-29 13:27 | 只看該作者
P0高四位沒加上拉電阻,不能輸出0xf0
回復(fù)

使用道具 舉報(bào)

12#
ID:244223 發(fā)表于 2019-3-30 16:26 | 只看該作者
結(jié)貼了,關(guān)鍵問題是圖上那個(gè)延時(shí),在第一次發(fā)的圖上加也行

2.png (25.67 KB, 下載次數(shù): 52)

2.png
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表