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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3001|回復: 11
收起左側

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

[復制鏈接]
回帖獎勵 80 黑幣 回復本帖可獲得 20 黑幣獎勵! 每人限 1 次(中獎概率 80%)
ID:244223 發表于 2019-3-28 23:22 | 顯示全部樓層 |閱讀模式
我是將按鍵的值通過數碼管顯示,第1,2,3,4個按鍵按下去正常,

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

使用道具 舉報

ID:123289 發表于 2019-3-29 01:25 | 顯示全部樓層
對于計算機來說,1也罷、2也罷、它都一樣處理。何必介意鍵值是多少呢?隨便是什么都可以。
要點是:對于你的硬件布置方便,排好后可以以序給鍵命名。程序要做的事:將你對鍵的命名與鍵值做個關聯!
回復

使用道具 舉報

ID:123289 發表于 2019-3-29 01:32 | 顯示全部樓層
例如:電腦用的鍵盤,它有100多個鍵,拆開看一下,它的連線總是電適合硬件位置的走線方便。
其實對于“A"這個鍵,不同的廠家它的硬件鍵值會因走線不同而不同,但鍵盤上的CPU會把它翻譯成“A”的ASCII碼送出去,這樣無論是哪個廠家的鍵,就都可以通用了。
回復

使用道具 舉報

ID:416287 發表于 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++;              }         }           }  
回復

使用道具 舉報

ID:96131 發表于 2019-3-29 08:35 | 顯示全部樓層
第三列最后一行13應為12
回復

使用道具 舉報

ID:213173 發表于 2019-3-29 08:43 | 顯示全部樓層
無標題.jpg
  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;                //計數變量                       

  10. void keyscan()                                        //按鍵掃描程序
  11. {
  12.         P3=0xf0;                                        //賦值P3 1111 0000
  13.         if(P3!=0xf0)                                //檢測有按鍵按下
  14.         {
  15.                 if((++count_1>=250)&&(sign_1==0))//消抖計數100~1000,判斷按鍵自鎖
  16.                 {                       
  17.                         sign_1=1;                        //按鍵自鎖標志置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;                                //按鍵自鎖標志清0
  38.                 count_1=0;                                //消抖計數清0
  39.         }
  40. }

  41. void display()                                        //數碼管顯示程序
  42. {
  43.         if(++count_2>=100)                        //延時計數
  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];//顯示個位段碼
  57.                         digital_1=1;
  58.                         digital_2=0;
  59.                         sign_2=0;
  60.                 }
  61.         }
  62. }

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



回復

使用道具 舉報

ID:158375 發表于 2019-3-29 08:45 | 顯示全部樓層
你讀到的按鍵或顯示的按鍵值不對;
這個要看程序。有程序,一定會有人幫你的。
回復

使用道具 舉報

ID:365802 發表于 2019-3-29 09:48 | 顯示全部樓層
不應該直接返回你要的值, 推薦是由掃描碼返回目標碼.
回復

使用道具 舉報

ID:282850 發表于 2019-3-29 09:52 | 顯示全部樓層
程序邏輯清晰,應該是“線與”功能出問題。你在列掃描時加個default 并+值,看一下是否一直是進default 。
回復

使用道具 舉報

ID:160500 發表于 2019-3-29 11:30 | 顯示全部樓層
你這個程序不對,仔細檢查一下吧
回復

使用道具 舉報

ID:337069 發表于 2019-3-29 13:27 | 顯示全部樓層
P0高四位沒加上拉電阻,不能輸出0xf0
回復

使用道具 舉報

ID:244223 發表于 2019-3-30 16:26 | 顯示全部樓層
結貼了,關鍵問題是圖上那個延時,在第一次發的圖上加也行
2.png
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日韩欧美在线免费观看视频 | www.久久.com | 可以免费观看的av | 色偷偷888欧美精品久久久 | 日日干日日操 | 国产精品三级 | 欧美一级片黄色 | 在线免费小视频 | 日韩免费av| av中文字幕在线 | 国产综合久久 | 亚洲福利 | 欧美日韩国产一区 | 国产精品一区视频 | 日韩成人精品在线观看 | 国产不卡视频 | 欧美精品一区二区三区四区五区 | 欧美一级一区 | 国产成人精品一区二区三区四区 | 欧美一级二级在线观看 | 草久久免费视频 | 成人久久18免费网站 | 7777精品伊人久久精品影视 | 国外成人在线视频网站 | 国产一区亚洲 | 色久在线 | 最新国产在线 | 午夜小视频在线观看 | 国产精品不卡 | 国产精品99久久久久久久久 | 欧美综合一区二区三区 | 成人免费视频 | 日本 欧美 国产 | 色婷婷一区二区三区四区 | 欧美日韩福利 | 欧美国产日韩成人 | 日本一区二区不卡视频 | 日本黄色免费大片 | 在线免费看黄 | 成人蜜桃av | 91久久精品国产 |