標(biāo)題: 單片機(jī)4x4鍵盤的數(shù)碼管程序 顯示異常 現(xiàn)在只有長按才能顯示對(duì)應(yīng)的01,02 [打印本頁]

作者: 2671085715    時(shí)間: 2023-4-2 14:27
標(biāo)題: 單片機(jī)4x4鍵盤的數(shù)碼管程序 顯示異常 現(xiàn)在只有長按才能顯示對(duì)應(yīng)的01,02
請大佬們幫忙看看吧!我想實(shí)現(xiàn)4x4鍵盤,使用數(shù)碼管顯示對(duì)應(yīng)的數(shù)字,現(xiàn)在只有長按才能顯示對(duì)應(yīng)的01,02,改咋改好,謝謝大佬們的解答了

單片機(jī)源程序如下:
  1. #include<reg51.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int   
  4. sbit L1=P1^0;                                                            //定義鍵盤的4列線
  5. sbit L2=P1^1;
  6. sbit L3=P1^2;
  7. sbit L4=P1^3;
  8. uchar dis[16]={ 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
  9. void delay_ms(unsigned int n);
  10. uint n;
  11. uchar a;
  12. uchar b;
  13. uchar c;
  14. uchar d;

  15. void main()                                                            //主程序
  16.         {
  17.                 uchar temp;
  18.                 uchar i;
  19.                 while(1)
  20.                 {
  21.                         P1=0xef;                                            //行掃描初值,P1.4=0,P1.5~P1.7=1
  22.                         for(i=0;i<=3;i++)                            //按行掃描,一共4行
  23.                         {
  24.                                 if(L1==0) {
  25.                                     a=i*4+0;
  26.                                     switch (a)
  27.                                     {
  28.                                     case 0:while(1){P3=0x04;P2=dis[a/10%10];delay_ms(1000);P3=0x08;P2=dis[a%10];delay_ms(1000);};break;
  29.                                     case 4:while(1){P3=0x04;P2=dis[a/10%10];delay_ms(1000);P3=0x08;P2=dis[a%10];delay_ms(1000);break;};break;
  30.                                     case 8:while(1){P3=0x04;P2=dis[a/10%10];delay_ms(1000);P3=0x08;P2=dis[a%10];delay_ms(1000);break;};break;
  31.                                     case 12:while(1){P3=0x04;P2=dis[a/10%10];delay_ms(1000);P3=0x08;P2=dis[a%10];delay_ms(1000);break;};break;
  32.                                     }
  33.                                     }        //判斷第一列是否有鍵按下
  34.                                 if(L2==0){
  35.                                     b=i*4+1;
  36.                                     switch (b)
  37.                                     {
  38.                                     case 1:while(1){P3=0x04;P2=dis[b/10%10];delay_ms(1000);P3=0x08;P2=dis[b%10];delay_ms(1000);break;};break;
  39.                                     case 5:while(1){P3=0x04;P2=dis[b/10%10];delay_ms(1000);P3=0x08;P2=dis[b%10];delay_ms(1000);break;};break;
  40.                                     case 9:while(1){P3=0x04;P2=dis[b/10%10];delay_ms(1000);P3=0x08;P2=dis[b%10];delay_ms(1000);break;};break;
  41.                                     case 13:while(1){P3=0x04;P2=dis[b/10%10];delay_ms(1000);P3=0x08;P2=dis[b%10];delay_ms(1000);break;};break;

  42.                                     }
  43.                                     }         //判斷第二列是否有鍵按下
  44.                                 if(L3==0){
  45.                                     c=i*4+2;
  46.                                     switch (c)
  47.                                     {
  48.                                     case 2:while(1){P3=0x04;P2=dis[c/10%10];delay_ms(1000);P3=0x08;P2=dis[c%10];delay_ms(1000);break;};break;
  49.                                     case 6:while(1){P3=0x04;P2=dis[c/10%10];delay_ms(1000);P3=0x08;P2=dis[c%10];delay_ms(1000);break;};break;
  50.                                     case 10:while(1){P3=0x04;P2=dis[c/10%10];delay_ms(1000);P3=0x08;P2=dis[c%10];delay_ms(1000);break;};break;
  51.                                     case 14:while(1){P3=0x04;P2=dis[c/10%10];delay_ms(1000);P3=0x08;P2=dis[c%10];delay_ms(1000);break;};break;
  52.                                     }
  53.                                 }        //判斷第三列是否有鍵按下
  54.                                 if(L4==0){
  55.                                     d=i*4+3;
  56.                                     switch (d)
  57.                                     {
  58.                                     case 3:while(1){P3=0x04;P2=dis[d/10%10];delay_ms(1000);P3=0x08;P2=dis[d%10];delay_ms(1000);break;};break;
  59.                                     case 7:while(1){P3=0x04;P2=dis[d/10%10];delay_ms(1000);P3=0x08;P2=dis[d%10];delay_ms(1000);break;};break;
  60.                                     case 11:while(1){P3=0x04;P2=dis[d/10%10];delay_ms(1000);P3=0x08;P2=dis[d%10];delay_ms(1000);break;};break;
  61.                                     case 15:while(1){P3=0x04;P2=dis[d/10%10];delay_ms(1000);P3=0x08;P2=dis[d%10];delay_ms(1000);break;};break;
  62.                                     }
  63.                                 }         //判斷第四列是否有鍵按下
  64.                                 delay_ms(50);                                //延時(shí)
  65.                                 temp=P1;                                        //讀入P1口狀態(tài)
  66.                                 temp=temp|0x0f;                        //使P1.3~P1.0為輸入
  67.                                 temp=temp<<1;                        //P1.7~P1.4左移1位,準(zhǔn)備下一行掃描
  68.                                 temp=temp|0x0f;                        //移位后,置P1.3~P1.0為1,保證其仍為輸入
  69.                                 P1=temp;                                        //行掃描值送P1口,為下一行掃描做準(zhǔn)備
  70.                         }
  71.                 }
  72.         }
  73. void delay_ms(unsigned int n)
  74. {
  75. {
  76.     while(n--);
  77. }
  78. }
復(fù)制代碼



作者: xianfajushi    時(shí)間: 2023-4-3 07:56
如果覺得不好用就學(xué)別的矩陣掃描方法
作者: xxxevery    時(shí)間: 2023-4-3 09:03
這程序簡直是太酸爽了,是樓主自己寫的嗎?還是別改了,到網(wǎng)上搜一下別人寫的程序,再把編程思想想明白了就會(huì)獲益良多的
作者: lkc8210    時(shí)間: 2023-4-3 12:33
變量名不要用a,b,c,d!
變量名不要用a,b,c,d!
變量名不要用a,b,c,d!

在群里問了幾次都不貼全部代碼
現(xiàn)在終于表弄明白那個(gè)for是怎么運(yùn)作的

  1. #include <reg51.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. sbit L1=P1^0;                                                            //定義鍵盤的4列線
  5. sbit L2=P1^1;
  6. sbit L3=P1^2;
  7. sbit L4=P1^3;
  8. uchar dis[16]= { 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
  9. uchar dispbuf[2] = {0,0};
  10. void delay_ms(unsigned int n);
  11. uint n;
  12. uchar KeyVal;

  13. void main()                                                            //主程序
  14. {
  15.     uchar temp;
  16.     uchar i;
  17.     while(1)
  18.     {
  19.         //******display******************
  20.         P2=0xFF;
  21.         P3=0x04;
  22.         P2=dis[dispbuf[1]];
  23.         delay_ms(1000);
  24.         P2=0xFF;
  25.         P3=0x08;
  26.         P2=dis[dispbuf[0]];
  27.         delay_ms(1000);
  28.         //******display******************

  29.         //******Keypad scan******************
  30.         P1=0xef;                                            //行掃描初值,P1.4=0,P1.5~P1.7=1
  31.         for(i=0; i<=3; i++)                          //按行掃描,一共4行
  32.         {
  33.             if(L1==0)
  34.             {
  35.                 KeyVal=i*4+0;
  36.             }        //判斷第一列是否有鍵按下
  37.             if(L2==0)
  38.             {
  39.                 KeyVal=i*4+1;
  40.             }
  41.             if(L3==0)
  42.             {
  43.                 KeyVal=i*4+2;
  44.             }
  45.             if(L4==0)
  46.             {
  47.                 KeyVal=i*4+3;
  48.             }
  49.             dispbuf[1]=KeyVal/10%10;
  50.             dispbuf[0]=KeyVal%10;
  51.             delay_ms(50);                                //延時(shí)
  52.             temp=P1;                                        //讀入P1口狀態(tài)
  53.             temp=temp|0x0f;                        //使P1.3~P1.0為輸入
  54.             temp=temp<<1;                        //P1.7~P1.4左移1位,準(zhǔn)備下一行掃描
  55.             temp=temp|0x0f;                        //移位后,置P1.3~P1.0為1,保證其仍為輸入
  56.             P1=temp;                                        //行掃描值送P1口,為下一行掃描做準(zhǔn)備
  57.         }
  58.         //******Keypad scan******************
  59.     }

  60. }

  61. void delay_ms(unsigned int n)
  62. {
  63.     {
  64.         while(n--);
  65.     }
  66. }
復(fù)制代碼





作者: 2671085715    時(shí)間: 2023-4-3 15:01
lkc8210 發(fā)表于 2023-4-3 12:33
變量名不要用a,b,c,d!
變量名不要用a,b,c,d!
變量名不要用a,b,c,d!

好的好的,謝謝大佬
作者: 2671085715    時(shí)間: 2023-4-3 15:01
xxxevery 發(fā)表于 2023-4-3 09:03
這程序簡直是太酸爽了,是樓主自己寫的嗎?還是別改了,到網(wǎng)上搜一下別人寫的程序,再把編程思想想明白了就 ...

謝謝,已經(jīng)想明白了,用for循環(huán)重新寫了一個(gè)
作者: 2671085715    時(shí)間: 2023-4-3 15:02
xianfajushi 發(fā)表于 2023-4-3 07:56
如果覺得不好用就學(xué)別的矩陣掃描方法

好的好的,謝謝建議
作者: zhuls    時(shí)間: 2023-4-4 09:55
char 矩陣4X4鍵掃()//行、列全都上拉
{
行全輸出低;
讀列值;//Key_L4
列值全為高,則無鍵入,返回0;//退出;
列值不全為高
{
  簡單延時(shí);
  再讀列值不全為高,確認(rèn)是有鍵入
   {
    列全輸出低;
    讀行值;//Key_H4
    while(讀行值不全為高)
  {
     簡單延時(shí);
     Kt++;//此處可加入按鍵計(jì)數(shù),用于判斷長短按=>靜態(tài)變量Kt可視為按鍵時(shí)長
   }  返回 (Key_H4+Key_L4);//退出;
  }
  
返回0;//退出;
}
}





歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1