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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機4x4鍵盤的數碼管程序 顯示異常 現在只有長按才能顯示對應的01,02

[復制鏈接]
跳轉到指定樓層
樓主
ID:1068026 發表于 2023-4-2 14:27 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
請大佬們幫忙看看吧!我想實現4x4鍵盤,使用數碼管顯示對應的數字,現在只有長按才能顯示對應的01,02,改咋改好,謝謝大佬們的解答了

單片機源程序如下:
  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);                                //延時
  65.                                 temp=P1;                                        //讀入P1口狀態
  66.                                 temp=temp|0x0f;                        //使P1.3~P1.0為輸入
  67.                                 temp=temp<<1;                        //P1.7~P1.4左移1位,準備下一行掃描
  68.                                 temp=temp|0x0f;                        //移位后,置P1.3~P1.0為1,保證其仍為輸入
  69.                                 P1=temp;                                        //行掃描值送P1口,為下一行掃描做準備
  70.                         }
  71.                 }
  72.         }
  73. void delay_ms(unsigned int n)
  74. {
  75. {
  76.     while(n--);
  77. }
  78. }
復制代碼


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

使用道具 舉報

沙發
ID:332444 發表于 2023-4-3 07:56 | 只看該作者
如果覺得不好用就學別的矩陣掃描方法
回復

使用道具 舉報

板凳
ID:59202 發表于 2023-4-3 09:03 | 只看該作者
這程序簡直是太酸爽了,是樓主自己寫的嗎?還是別改了,到網上搜一下別人寫的程序,再把編程思想想明白了就會獲益良多的
回復

使用道具 舉報

地板
ID:161164 發表于 2023-4-3 12:33 | 只看該作者
變量名不要用a,b,c,d!
變量名不要用a,b,c,d!
變量名不要用a,b,c,d!

在群里問了幾次都不貼全部代碼
現在終于表弄明白那個for是怎么運作的

  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);                                //延時
  52.             temp=P1;                                        //讀入P1口狀態
  53.             temp=temp|0x0f;                        //使P1.3~P1.0為輸入
  54.             temp=temp<<1;                        //P1.7~P1.4左移1位,準備下一行掃描
  55.             temp=temp|0x0f;                        //移位后,置P1.3~P1.0為1,保證其仍為輸入
  56.             P1=temp;                                        //行掃描值送P1口,為下一行掃描做準備
  57.         }
  58.         //******Keypad scan******************
  59.     }

  60. }

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




回復

使用道具 舉報

5#
ID:1068026 發表于 2023-4-3 15:01 | 只看該作者
lkc8210 發表于 2023-4-3 12:33
變量名不要用a,b,c,d!
變量名不要用a,b,c,d!
變量名不要用a,b,c,d!

好的好的,謝謝大佬
回復

使用道具 舉報

6#
ID:1068026 發表于 2023-4-3 15:01 | 只看該作者
xxxevery 發表于 2023-4-3 09:03
這程序簡直是太酸爽了,是樓主自己寫的嗎?還是別改了,到網上搜一下別人寫的程序,再把編程思想想明白了就 ...

謝謝,已經想明白了,用for循環重新寫了一個
回復

使用道具 舉報

7#
ID:1068026 發表于 2023-4-3 15:02 | 只看該作者
xianfajushi 發表于 2023-4-3 07:56
如果覺得不好用就學別的矩陣掃描方法

好的好的,謝謝建議
回復

使用道具 舉報

8#
ID:69038 發表于 2023-4-4 09:55 | 只看該作者
char 矩陣4X4鍵掃()//行、列全都上拉
{
行全輸出低;
讀列值;//Key_L4
列值全為高,則無鍵入,返回0;//退出;
列值不全為高
{
  簡單延時;
  再讀列值不全為高,確認是有鍵入
   {
    列全輸出低;
    讀行值;//Key_H4
    while(讀行值不全為高)
  {
     簡單延時;
     Kt++;//此處可加入按鍵計數,用于判斷長短按=>靜態變量Kt可視為按鍵時長
   }  返回 (Key_H4+Key_L4);//退出;
  }
  
返回0;//退出;
}
}
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 中文字幕在线观看成人 | 天色综合网 | 国产精品毛片av一区 | 亚洲视频观看 | 欧区一欧区二欧区三免费 | 亚洲性在线| 色婷婷精品国产一区二区三区 | 久操亚洲 | 91 视频网站 | 国产精品久久久久久一区二区三区 | 青青草av在线播放 | 久久99国产精品久久99果冻传媒 | 亚洲一区二区日韩 | 精品久久久久久久久久 | 国产福利资源 | 成人免费在线视频 | 黄色大片免费看 | 99精品免费视频 | 久久久久久久国产精品 | 成人h动漫精品一区二区器材 | 一本大道久久a久久精二百 欧洲一区二区三区 | 亚洲精品欧美一区二区三区 | 国产一区| 国产精品免费在线 | 三级视频久久 | 亚洲视频中文字幕 | 国内精品久久精品 | av中文字幕在线 | 91精品国产综合久久久久久首页 | 成人在线免费观看 | 草久视频 | 国产丝袜一区二区三区免费视频 | 久久久精品在线 | 久久天堂| 欧美日韩一二三区 | 国产伦精品一区二区三区照片91 | 一级a爱片性色毛片免费 | 亚洲精品成人网 | 日韩精品一区二区三区老鸭窝 | 二区三区在线观看 | 日日夜夜精品视频 |