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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

關于3*4矩陣鍵盤控制燈亮時間控制 附單片機源程序

[復制鏈接]
跳轉到指定樓層
樓主
本帖最后由 Hajime_S 于 2020-1-17 16:32 編輯

單片機為89c52,矩陣鍵盤接p10-12為列,p13-16為行,燈接p20-21。第89行我用計算器算出11110011的值確實為0xf3,但按下星號鍵的時候燈亮都不亮,但是按下1,4,7鍵都可以亮指定的時間(臨時測試加了delay,亮的是delay里面的時間)。不確定其他列。請問哪里有問題?我用萬用表檢查了矩陣鍵盤,紅黑筆接第3,4個端口,按下星號鍵的時候電阻從無法測出(開路)變成20歐,接第3,5和3,6和3,7也是如此,所以排除鍵盤有問題。換了個單片機,也依舊無法識別星號鍵,所以排除單片機問題。
  1. #include<reg52.h>
  2. #define ulong unsigned long
  3. #define uchar unsigned char
  4. ulong time=0;
  5. ulong num;
  6. uchar temp;

  7. void delay(unsigned int xms){
  8.     unsigned int x,y;
  9.     for(x=xms;x>0;x--) for(y=110;y>0;y--);
  10. }

  11. void display(int key){
  12.         if(key!=11) {
  13.                 if (key!=10) {
  14.                         time = time*10 + key;
  15.                 }
  16.         }
  17.         else{
  18.                 time=time*100;
  19.                 P2=0xfe;
  20.                 delay(time);
  21.                 P2=0xff;
  22.                 time=0;
  23.         }
  24. }

  25. int keyscan() {
  26.         num = 10;
  27.         P1=0xfe;
  28.         temp=P1;
  29.         temp=temp&0xf0;
  30.         while(temp!=0xf0){
  31.                 delay(5);
  32.                 temp=P1;
  33.                 temp = temp&0xf0;
  34.                 while(temp!=0xf0){
  35.                         temp=P1;
  36.                         switch(temp){
  37.                                 case 0xf6:num=00;break;
  38.                                 case 0xee:num=9;break;
  39.                                 case 0xde:num=6;break;
  40.                                 case 0xbe:num=3;break;
  41.                         }
  42.                         while(temp!=0xf0){
  43.                                 temp=P1;
  44.                                 temp=temp&0xf0;
  45.                         }
  46.                 }
  47.         }
  48.         P1=0xfd;
  49.         temp=P1;
  50.         temp=temp&0xf0;
  51.         while(temp!=0xf0){
  52.                 delay(5);
  53.                 temp=P1;
  54.                 temp=P1;
  55.                 temp=temp&0xf0;
  56.                 while(temp!=0xf0){
  57.                         temp=P1;
  58.                         switch(temp){
  59.                                 case 0xf5:num=0;break;
  60.                                 case 0xed:num=8;break;
  61.                                 case 0xdd:num=5;break;
  62.                                 case 0xbd:num=2;break;
  63.                         }
  64.                         while(temp!=0xf0){
  65.                                 temp=P1;
  66.                                 temp=temp&0xf0;
  67.                         }
  68.                 }
  69.         }
  70.         P1=0xfb;
  71.         temp=P1;
  72.         temp=temp&0xf0;
  73.         while(temp!=0xf0){
  74.                 delay(5);
  75.                 temp=P1;
  76.                 temp=temp&0xf0;
  77.                 while(temp!=0xf0){
  78.                         temp=P1;
  79.                         switch(temp){
  80.                                 /*
  81.                                 case 0xf3:num=11;break;
  82.                                 case 0xeb:num=7;break;
  83.                                 case 0xdb:num=4;break;
  84.                                 case 0xbb:num=1;break;
  85.                                 */
  86.                                 case 0xf3:{num=11;P2=0xfe;delay(2000);P2=0xff;};break;
  87.                                 case 0xeb:{num=7;P2=0xfe;delay(1500);P2=0xff;};break;
  88.                                 case 0xdb:{num=4;P2=0xfe;delay(1000);P2=0xff;};break;
  89.                                 case 0xbb:{num=1;P2=0xfe;delay(500);P2=0xff;};break;
  90.                         };
  91.                         while(temp!=0xf0){
  92.                                 temp=P1;
  93.                                 temp=temp&0xf0;
  94.                         }
  95.                 }
  96.         }
  97.         return num;
  98. }

  99. void main(){
  100.         while(1){
  101.                 //display(keyscan());
  102.                 keyscan();
  103.         }
  104. }
復制代碼
鍵盤為薄膜鍵盤



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

使用道具 舉報

沙發
ID:643607 發表于 2020-1-17 16:48 | 只看該作者
我后來又用keil的debug模擬了一下, 在節點到73行的時候把P1的值改成0xF3,結果直接跳到return0去了;但改成0xEB的時候,卻能跳到delay函數去。。。實在不知道哪里錯了
回復

使用道具 舉報

板凳
ID:213173 發表于 2020-1-18 10:59 | 只看該作者
Hajime_S 發表于 2020-1-17 16:48
我后來又用keil的debug模擬了一下, 在節點到73行的時候把P1的值改成0xF3,結果直接跳到return0去了;但改 ...

給你改了一下,P1.0~1.6   3*4矩陣按鍵,P2 LED顯示鍵值,P1.7可另作它用,不影響按鍵。
  1. #include "reg52.h"

  2. #define uint unsigned int
  3. #define uchar unsigned char

  4. uchar key=0xff;                                //定義鍵值全局變量

  5. void keyscan()                                        //按鍵掃描程序
  6. {
  7.         static bit sign=0;                //按鍵自鎖標志
  8.         static uchar count=0;        //消抖計數變量                       
  9.         uchar num=0;                                //臨時變量
  10.         P1&=0x80;                                        //清P1低7位1000 0000 最高位保持原狀
  11.         P1|=0x78;                                        //賦值P1 x111 1000 最高位保持原狀
  12.         num=P1&0x78;                                //保存P1低7位0xxx x000,x為0或1
  13.         if(num!=0x78)                                //檢測有按鍵按下
  14.         {
  15.                 if(++count>=100 && sign==0)//消抖與自鎖識別
  16.                 {                       
  17.                         sign=1;                                //按鍵自鎖標志置1
  18.                         P1&=0x80;                        //清P1低7位1000 0000
  19.                         P1|=0x87;                        //賦值P1 x000 0111
  20.                         num=(P1&0x07)|num;  //讀P1低3位+num xxxx xxxx                               
  21.                         switch(num)
  22.                         {
  23.                                 case 0x76: key= 0;/*key='1';*/ break;
  24.                                 case 0x75: key= 1;/*key='2';*/ break;
  25.                                 case 0x73: key= 2;/*key='3';*/ break;
  26.                                 case 0x6e: key= 3;/*key='4';*/ break;
  27.                                 case 0x6d: key= 4;/*key='5';*/ break;
  28.                                 case 0x6b: key= 5;/*key='6';*/ break;
  29.                                 case 0x5e: key= 6;/*key='7';*/ break;
  30.                                 case 0x5d: key= 7;/*key='8';*/ break;
  31.                                 case 0x5b: key= 8;/*key='9';*/ break;
  32.                                 case 0x3e: key= 9;/*key='#';*/ break;
  33.                                 case 0x3d: key=10;/*key='0';*/ break;
  34.                                 case 0x3b: key=11;/*key='*';*/ break;
  35.                         }
  36.                 }
  37.         }
  38.         else                                                //鍵抬起
  39.         {
  40.                 sign=0;                                //按鍵自鎖標志清0
  41.                 count=0;                                //消抖計數清0
  42.         }
  43. }

  44. void main()                                                //主函數
  45. {
  46.         while(1)
  47.         {
  48.                 keyscan();//按鍵掃描程序
  49.                 P2=key;//LED顯示鍵值
  50.         }
  51. }
復制代碼





回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产高清视频在线观看 | 一级黄色生活视频 | 免费在线视频a | 日韩欧美国产一区二区三区 | 欧美色综合网 | 99视频在线看 | 精品国产伦一区二区三区观看方式 | 亚洲精品一区二区在线观看 | 五月婷婷丁香婷婷 | 欧美黄色一级毛片 | 中文二区 | 黄色一级毛片 | 东京av男人的天堂 | 久久天堂 | 成人av在线播放 | 欧洲一区二区视频 | 国产这里只有精品 | 日韩精品无码一区二区三区 | 精品国产一区二区三区性色av | 欧美日韩视频在线第一区 | 欧美三级免费观看 | av影片在线 | 亚洲成人在线免费 | av中文网| 中文字幕欧美一区 | 欧美精品久久 | 亚洲成人免费视频 | 亚洲国产成人av好男人在线观看 | 国产精品久久久久久久久久不蜜臀 | 欧美精品一区在线 | 亚洲一区二区精品 | 成人av免费| 欧美一级大黄 | 91久久精品一区二区二区 | 91中文字幕在线观看 | 日韩中文一区 | 日韩色综合 | 丝袜美腿一区二区三区 | 亚洲高清在线 | 四虎影院免费在线播放 | 久久久免费精品 |