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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

請教一個問題:單片機矩陣鍵盤按數字在數碼管上顯示

[復制鏈接]
跳轉到指定樓層
樓主
問題描述:我想寫一個程序想要達到目的是:通過矩陣鍵盤s1~s10分別代表數字0~9,按下矩陣鍵盤代表的數字然后在數碼管的最左兩位顯示出來。想要達到的效果就像計算器那樣當有第一個數字輸入時,在最右側顯示;當有第二個數字輸入時,最右側數字向左移動一位,空出來的位置顯示第二個數字。
我的思路是:定義一個兩字節數組,初值都是0,分別存放個位和十位。第一個輸入的數字存入個位,當有第二個數字輸入時,先把個位的值存入十位,再將第二個數字存入個位。
下面是我寫的一段不完整的代碼:請會的大神幫我完成一下代碼或者按照你的思路給我一個參考代碼,謝謝您!(我用的板子是單核A2開發板)

單片機代碼:
  1. #include
  2. #define uchar unsigned char
  3. #define uint        unsigned int
  4. uchar seg_value[2];        //數碼管編碼存儲,數組的0、1位分別存儲個位、十位
  5. void delay1();                                                
  6. uchar KEY_SCAN();
  7. void seg_updata(uchar x);
  8. void SEG_display();
  9. uchar code seg_table[] = {0xc0,0xf9,0xa4,0xb0,                //定義一個數組,將0~f對應的編碼存入數組
  10.                                         0x99,0x92,0x82,0xf8,
  11.                                         0x80,0x90,0x88,0x83,
  12.                                         0xc6,0xa1,0x86,0x8e};
  13. sbit LSA=P2^2;
  14. sbit LSB=P2^3;
  15. sbit LSC=P2^4;
  16. void delay1()
  17. {
  18.         uint i;
  19.         for(i = 0;i<1000;i++);
  20. }

  21. uchar KEY_SCAN()
  22. {
  23.         uchar key_buf;                        //暫時存儲P1口狀態
  24.         uchar        key_state;                //存儲按鍵狀態
  25.         P1 = 0xf0;                                //高四位高電平,第四位低電平
  26.         key_buf = P1;                        //讀取P1口狀態
  27.         if(key_buf != 0xf0)
  28.         {
  29.                 delay1();                                        //延時消抖
  30.                 if(P1 == key_buf)                        //再次判斷是否有按鍵按下
  31.                 {
  32.                         key_state = key_buf & 0xf0;                //高四位狀態存入key_state
  33.                         P1 = 0x0f;                                                //高四位低電平,第四位高電平
  34.                         key_buf = P1;                                        //讀取P1口狀態
  35.                         key_state = key_state | key_buf;        //第四位狀態存入key_state
  36.                         return key_state;                                        //返回該按鍵坐標值(請允許我用坐標形容這個值)
  37.                 }
  38.                 else
  39.                         return 0;                        //如果沒有按鍵按下,返回0
  40.         }
  41.         else
  42.                 return 0;                                //如果沒有按鍵按下,返回0
  43. }

  44. /***************************************************
  45. *                                鍵值判斷子函數
  46. *                        判斷按鍵值,更新到數組seg_value[]
  47. ****************************************************/
  48. void seg_updata(uchar x)
  49. {
  50.         uchar table_num;                //存儲字符在數組中對應的編號
  51.         switch(x)
  52.         {
  53.                 case 0x77:        table_num = 0;break;        //S1被按下時,對應數字0
  54.                 case 0x7b:        table_num = 1;break;        //S2被按下時,對應數字1,
  55.                 case 0x7d:        table_num = 2;break;
  56.                 case 0x7e:        table_num = 3;break;
  57.                 case 0xb7:        table_num = 4;break;
  58.                 case 0xbb:        table_num = 5;break;
  59.                 case 0xbd:        table_num = 6;break;
  60.                 case 0xbe:        table_num = 7;break;
  61.                 case 0xd7:        table_num = 8;break;
  62.                 case 0xdb:        table_num = 9;break;
  63.                 default: table_num = 10;                        //如有其它坐標值,不作處理
  64.         }
  65.         if(table_num<10)
  66.         {
  67.                 seg_value[1] = seg_value[0];
  68.                 seg_value[0] = seg_table[table_num];
  69.         }
  70. }

  71. /***************************************************
  72. *                                數碼管顯示子函數
  73. *                        每隔一段時間,更新數據
  74. ****************************************************/
  75. void SEG_display()
  76. {
  77.         uint i;
  78.         for(i=0;i<2;i++)
  79.         {
  80.                 switch(i)         //位選,選擇點亮的數碼管,
  81.                 {
  82.                         case(0):
  83.                                 LSA=0;LSB=0;LSC=0; break;
  84.                         case(1):
  85.                                 LSA=1;LSB=0;LSC=0; break;        
  86.                 }
  87.                 P0=seg_value[i];//發送段碼
  88.                 delay1(); //間隔一段時間掃描        
  89.                 P0=0x00;//消隱
  90.         }
  91. }

  92. void main()
  93. {
  94.         uchar key_value;
  95.         uint state_cnt=1;
  96.         while(1)
  97.         {
  98.                 SEG_display();
  99.         }
  100. }

復制代碼











A2開發板原理圖.pdf

227.86 KB, 下載次數: 5

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:452950 發表于 2020-7-15 23:08 | 只看該作者
51黑有很多類似的設計,可以搜一下
51單片機實現多位十進制計算器 帶Proteus仿真原理圖 - 單片機仿真論壇 單片機論壇 http://www.zg4o1577.cn/bbs/dpj-191483-1.html
回復

使用道具 舉報

板凳
ID:332444 發表于 2020-7-16 03:07 | 只看該作者
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久综合久久自在自线精品自 | 国产精品久久久久久久久久软件 | 精品伊人 | 美女久久久久久久 | www.男人天堂.com| 国产精品久久久久婷婷二区次 | 日韩伦理一区二区 | av高清 | 91网视频| 人人九九精 | 久久精品久久久久久 | 天天干人人 | 日韩av电影院| 91在线观看免费视频 | 99久久免费观看 | 久久久久久久久久久国产 | 天天躁日日躁xxxxaaaa | 国产日韩亚洲欧美 | 成人在线观看亚洲 | 国产最新精品视频 | 久久久久国产一区二区三区 | 青青激情网 | 日本黄色影片在线观看 | 99热精品国产 | 国产91精品久久久久久久网曝门 | 九九热这里只有精品6 | 色综合天天天天做夜夜夜夜做 | 黄在线免费观看 | 一区二区高清 | 久久69精品久久久久久久电影好 | 爱综合| 精品国产青草久久久久96 | 欧美日产国产成人免费图片 | 精品一区二区三区在线观看 | 日本在线免费视频 | 日韩一二区 | 国产精品18久久久久久久 | 天堂一区在线观看 | 色婷婷综合成人av | 国产精品123区 | 日本精品一区二区 |