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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1947|回復: 5
收起左側

求助,寫的單片機按鍵矩陣不能實現功能

[復制鏈接]
ID:376790 發表于 2020-1-17 16:34 | 顯示全部樓層 |閱讀模式
      寫的是用定時器掃描矩陣按鍵,然后在數碼管顯示,可是代碼不能實現功能,檢查了幾遍也沒想明白哪里出錯了,單片機小白,求助
  1. #include "reg52.h"
  2. #include "intrins.h"

  3. void anjian();

  4. unsigned int a,b;

  5. sbit KEY_IN1 = P3^7;
  6. sbit KEY_IN2 = P3^6;
  7. sbit KEY_IN3 = P3^5;
  8. sbit KEY_IN4 = P3^4;
  9. sbit KEY_OUT1 = P3^0;
  10. sbit KEY_OUT2 = P3^1;
  11. sbit KEY_OUT3 = P3^2;
  12. sbit KEY_OUT4 = P3^3;

  13. unsigned char code pucseg_code[] = {
  14.         0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8,
  15.         0x80, 0x90, 0x88, 0x83, 0xc6, 0xa1, 0x86, 0x8e
  16. };  //數碼管顯示段碼

  17. /*unsigned char ledbuff[8] = {
  18.         0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
  19. };*/

  20. unsigned char keysta[4][4] = {
  21.         {1, 1, 1, 1}, {1, 1, 1, 1}, {1, 1, 1, 1}, {1, 1, 1, 1}
  22. };   //矩陣按鍵當前狀態

  23. void Delay1ms()                //@12.000MHz
  24. {
  25.         unsigned char i, j;

  26.         i = 12;
  27.         j = 169;
  28.         do
  29.         {
  30.                 while (--j);
  31.         } while (--i);
  32. }

  33. void Delay300us()                //@12.000MHz
  34. {
  35.         unsigned char i, j;

  36.         i = 4;
  37.         j = 125;
  38.         do
  39.         {
  40.                 while (--j);
  41.         } while (--i);
  42. }

  43. void cls_periphercal(void)                //系統初始化
  44. {
  45.         P0 = 0xff;
  46.         P2 = P2 & 0x1f | 0x80;
  47.         P2 = 0x1f;
  48.         P0 = 0;
  49.         P2 = P2 & 0x1f | 0xa0;
  50.         P2 = 0x1f;
  51.        
  52.        
  53. }

  54. void seg_disp(unsigned char pu, unsigned char ucseg_pos)   //數碼管段選
  55. {       
  56.         P0 = 0xff;
  57.         P2 = P2 & 0x1f | 0xe0;
  58.         P2 &= 0x1f;
  59.         Delay300us();
  60.        
  61.         P0 = 0x80 >> ucseg_pos;
  62.         P2 = P2 & 0x1f | 0xc0;
  63.         P2 &= 0x1f;
  64.         Delay300us();
  65.        
  66.         P0 = pu;
  67.         P2 = P2 & 0x1f | 0xe0;
  68.         P2 &= 0x1f;
  69.         Delay300us();
  70. }

  71. void saomiao(unsigned char i)   //數碼管循環刷新顯示
  72. {
  73.         switch(i)
  74.         {
  75.                 case 0: seg_disp(pucseg_code[0], 0); break;
  76.                 case 1: seg_disp(pucseg_code[1], 1); break;
  77.                 case 2: seg_disp(pucseg_code[2], 2); break;
  78.                 case 3: seg_disp(pucseg_code[3], 3); break;
  79.                 case 4: seg_disp(pucseg_code[4], 4); break;
  80.                 case 5: seg_disp(pucseg_code[5], 5); break;
  81.                 case 6: seg_disp(pucseg_code[6], 6); break;
  82.                 case 7: seg_disp(pucseg_code[7], 7); break;
  83.         }
  84.        
  85. }


  86. /*void Timer0Init(void)                //2??@12.000MHz   //定時器定時2ms
  87. {
  88.         AUXR |= 0x80;                //?????1T??
  89.         TMOD &= 0xF0;                //???????
  90.         TL0 = 0x40;                //??????
  91.         TH0 = 0xA2;                //??????
  92.         TF0 = 0;                //??TF0??
  93.         TR0 = 1;                //???0????
  94.         ET0 = 1;
  95.         EA = 1;
  96. }*/

  97. void InterruptTimer0() interrupt 1
  98. {
  99.         unsigned char i;
  100.         static unsigned char keyout = 0;       //輸出索引值
  101.         static unsigned char keybuf[4][4] = {  //掃描緩沖數組
  102.         {0xff, 0xff, 0xff, 0xff}, {0xff, 0xff, 0xff, 0xff},
  103.         {0xff, 0xff, 0xff, 0xff}, {0xff, 0xff, 0xff, 0xff}
  104.         };
  105.         TH0 = 0XFC;
  106.         TL0 = 0X67;
  107.        
  108.        
  109.         keybuf[keyout][0] = (keybuf[keyout][0] << 1) | P3^7;
  110.         keybuf[keyout][0] = (keybuf[keyout][0] << 1) | P3^6;
  111.         keybuf[keyout][0] = (keybuf[keyout][0] << 1) | P3^5;
  112.         keybuf[keyout][0] = (keybuf[keyout][0] << 1) | P3^4;
  113.        
  114.         for(i=0; i<4; i++)
  115.         {
  116.                 if((keybuf[keyout][i] & 0x0f) == 0x00)
  117.                         keysta[keyout][i] = 0;      //連續掃描四次4值為0,可以認為按鍵已經穩定按下或彈起
  118.                 else if((keybuf[keyout][i] & 0x0f) == 0x0f)
  119.                         keysta[keyout][i] = 1;
  120.         }
  121.        
  122.         keyout++;                     //索引值遞增
  123.         keyout = keyout & 0x03;       //當索引值到4時歸零
  124.         switch(keyout)          //根據索引值,釋放當前輸出引腳,拉低下次輸出引腳
  125.         {
  126.                 case 0 : KEY_OUT4 = 1; KEY_OUT1 = 0; break;
  127.                 case 1 : KEY_OUT1 = 1; KEY_OUT2 = 0; break;
  128.                 case 2 : KEY_OUT2 = 1; KEY_OUT3 = 0; break;
  129.                 case 3 : KEY_OUT3 = 1; KEY_OUT4 = 0; break;
  130.                 default: break;
  131.         }
  132. }

  133. void anjian(void)                //判斷按鍵按下的是哪一位
  134. {
  135.                                         if(b == 0 & a == 0)
  136.                                                 {
  137.                                                         saomiao(0);
  138.                                                         Delay1ms();
  139.                                                 }
  140.                                                 else if(b == 1 & a == 0)
  141.                                                 {
  142.                                                         saomiao(1);
  143.                                                         Delay1ms();
  144.                                                 }
  145.                                                 else if(b == 2 & a == 0)
  146.                                                 {
  147.                                                         saomiao(2);
  148.                                                         Delay1ms();
  149.                                                 }
  150.                                                 else if(b == 3 & a == 0)
  151.                                                 {
  152.                                                         saomiao(3);
  153.                                                         Delay1ms();
  154.                                                 }
  155.                                                 else if(b == 0 & a == 1)
  156.                                                 {
  157.                                                         saomiao(4);
  158.                                                         Delay1ms();
  159.                                                 }
  160.                                                 else if(b == 1 & a == 1)
  161.                                                 {
  162.                                                         saomiao(5);
  163.                                                         Delay1ms();
  164.                                                 }
  165.                                                 else if(b == 2 & a == 1)
  166.                                                 {
  167.                                                         saomiao(6);
  168.                                                         Delay1ms();
  169.                                                 }
  170.                                                 else if(b == 3 & a == 1)
  171.                                                 {
  172.                                                         saomiao(7);
  173.                                                         Delay1ms();
  174.                                                 }
  175.                                                 else if(b == 0 & a == 2)
  176.                                                 {
  177.                                                         saomiao(8);
  178.                                                         Delay1ms();
  179.                                                 }
  180.                                                 else if(b == 1 & a == 2)
  181.                                                 {
  182.                                                         saomiao(9);
  183.                                                         Delay1ms();
  184.                                                 }
  185. }

  186. void main(void)
  187. {
  188.         unsigned char backup[4][4] = {
  189.         {1, 1, 1, 1}, {1, 1, 1, 1}, {1, 1, 1, 1}, {1, 1, 1, 1}
  190.         };   //按鍵掃描值備份
  191.        
  192.         EA = 1;
  193.         //ENLED = 0;
  194.         TMOD = 0X01;
  195.         TH0 = 0XFC;
  196.         TL0 = 0X67;
  197.         ET0 = 1;
  198.         TR0 = 1;
  199.         saomiao(0);
  200.        
  201.         cls_periphercal();
  202.         Timer0Init();

  203.         while(1)
  204.         {
  205.                 for(a=0; a<4; a++)
  206.                 {
  207.                         for(b=0; b<4; b++)
  208.                         {
  209.                                 if(backup[a][b] != keysta[a][b])
  210.                                 {
  211.                                         if(backup[a][b] != 0)
  212.                                         {
  213.                                                 //anjian();
  214.                                                 saomiao(7);
  215.                                                 Delay1ms();
  216.                                                 Delay1ms();
  217.                                                 Delay1ms();
  218.                                                 Delay1ms();
  219.                                                 Delay1ms();
  220.                                                 Delay1ms();
  221.                                         }
  222.                                         backup[a][b] = keysta[a][b];
  223.                                 }       
  224.                         }
  225.                 }
  226.         }
  227. }





復制代碼



回復

使用道具 舉報

ID:376790 發表于 2020-1-17 16:44 | 顯示全部樓層
求助
回復

使用道具 舉報

ID:473159 發表于 2020-1-17 20:08 | 顯示全部樓層
一個一個按鍵的調試,屏蔽其他按鍵,先調通一個,后面就會照做就OK!
回復

使用道具 舉報

ID:213173 發表于 2020-1-17 22:12 | 顯示全部樓層

樓主這是從哪里東拼西湊來的代碼,只是用數碼管顯示矩陣按鍵鍵值的簡單程序,竟然洋洋灑灑幾百條代碼。給你簡化一下經仿真無誤。 無標題.jpg

  1. #include "reg52.h"
  2. #include "intrins.h"
  3. #define uint unsigned int
  4. #define uchar unsigned char
  5. uchar code pucseg_code[] = {//段碼
  6.         0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8,
  7.         0x80, 0x90, 0x88, 0x83, 0xc6, 0xa1, 0x86, 0x8e};
  8. uchar code weia[] = {0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};//位碼
  9. uchar data dis_buf[8];//顯示緩存
  10. uchar key=0;                                        //定義鍵值全局變量

  11. void anjian()                                        //按鍵掃描程序
  12. {
  13.         static bit sign=0;                        //按鍵有效標志
  14.         static uchar count=0;                //消抖計數變量                       
  15.         uchar num=0;                                //臨時變量
  16.         P3=0xf0;                                        //賦值P3 1111 0000
  17.         if(P3!=0xf0)                                //檢測有按鍵按下
  18.         {
  19.                 count++;                                //消抖計數
  20.                 if((count>=10)&&(sign==0))
  21.                 {                       
  22.                         sign=1;                                //按鍵有效標志置1
  23.                         num=P3;                                //保存P3值xxxx 0000,x為0或1
  24.                         num|=0x0f;                        //保存num按位或0x0f值xxxx 1111
  25.                         P3=num;                                //賦值P3 xxxx 1111
  26.                         switch(P3)
  27.                         {
  28.                                 case 0xee: key= 1; break;
  29.                                 case 0xde: key= 2; break;
  30.                                 case 0xbe: key= 3; break;
  31.                                 case 0x7e: key= 4; break;
  32.                                 case 0xed: key= 5; break;
  33.                                 case 0xdd: key= 6; break;
  34.                                 case 0xbd: key= 7; break;
  35.                                 case 0x7d: key= 8; break;
  36.                                 case 0xeb: key= 9; break;
  37.                                 case 0xdb: key=10; break;
  38.                                 case 0xbb: key=11; break;
  39.                                 case 0x7b: key=12; break;
  40.                                 case 0xe7: key=13; break;
  41.                                 case 0xd7: key=14; break;
  42.                                 case 0xb7: key=15; break;
  43.                                 case 0x77: key=16; break;
  44.                         }
  45.                 }
  46.         }
  47.         else                                                //鍵抬起
  48.         {
  49.                 sign=0;                                        //按鍵有效標志清0
  50.                 count=0;                                //消抖計數清0
  51.         }
  52. }

  53. void saomiao()//共陽數碼管循環刷新顯示
  54. {        
  55.         static bit i=0;
  56.         if(i)
  57.                 dis_buf[0]=pucseg_code[key%10];
  58.         else
  59.                 dis_buf[1]=pucseg_code[key/10];
  60.         P0=0xff;//消隱
  61.         P2=weia[i];
  62.         P0=dis_buf[i];
  63.         i=~i;
  64. }
  65. void main()                                                //主函數
  66. {
  67.         TMOD = 0X01;//1ms
  68.         TH0 = 0XFC;
  69.         TL0 = 0X67;
  70.         EA = 1;
  71.         ET0 = 1;
  72.         TR0 = 1;
  73.         while(1);
  74. }
  75. void InterruptTimer0() interrupt 1
  76. {
  77.         TH0 = 0XFC;
  78.         TL0 = 0X67;
  79.         anjian();        //按鍵掃描程序
  80.         saomiao();  //共陽數碼管顯示程序
  81. }
復制代碼



回復

使用道具 舉報

ID:376790 發表于 2020-1-18 14:22 | 顯示全部樓層
wulin 發表于 2020-1-17 22:12
樓主這是從哪里東拼西湊來的代碼,只是用數碼管顯示矩陣按鍵鍵值的簡單程序,竟然洋洋灑灑幾百條代碼。給 ...

自己參考書里改的,感謝大佬, 我參考
回復

使用道具 舉報

ID:376790 發表于 2020-1-18 14:23 | 顯示全部樓層
yoxi 發表于 2020-1-17 20:08
一個一個按鍵的調試,屏蔽其他按鍵,先調通一個,后面就會照做就OK!

好的,感謝解答
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美一区二区三区国产精品 | 国产精品免费一区二区三区四区 | 亚洲国产成人精品女人久久久 | 亚洲国产免费 | 99久久精品一区二区成人 | 日韩欧美国产精品一区 | 亚洲1区| 色综合99 | 欧美精品乱码久久久久久按摩 | 国产高清视频 | 久久精品无码一区二区三区 | 99久久成人 | 91免费小视频 | 国产一级在线 | 日韩一区二区三区视频 | 97色伦网 | 日本特黄a级高清免费大片 特黄色一级毛片 | 亚洲性在线 | 亚洲电影免费 | 亚洲不卡在线观看 | 成人精品久久久 | 国产欧美在线观看 | 亚洲午夜电影 | 小h片免费观看久久久久 | 亚洲欧美视频 | 日韩久久精品视频 | 欧美综合国产精品久久丁香 | 久久精品成人 | 国产日韩亚洲欧美 | 欧美日韩看片 | 久久久久国产一区二区三区 | 97精品超碰一区二区三区 | 五月婷婷丁香 | 久久av一区二区三区 | 成人免费视频观看视频 | 精品久久久久久久久久久 | 亚洲乱码国产乱码精品精98午夜 | 欧美激情a∨在线视频播放 成人免费共享视频 | 久久国产精品一区二区三区 | 日韩一区二区在线免费观看 | 欧美在线免费 |