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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

我想按一下鍵盤就讓數碼管上的顯數加1 單片機程序邏輯漏洞

[復制鏈接]
跳轉到指定樓層
樓主
ID:632567 發表于 2020-5-31 17:16 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
我想按一下鍵盤就讓數碼管上的顯數加1,但是實際卻是這樣顯示的,自己也沒找到邏輯漏洞,實際視頻和原理圖已上傳 網址 https://v.youku.com/v_show/id_XN ... hcb.playlsit.page.1
程序:
#include<reg52.h>
sbit key1=P3^4;
sbit dula=P2^6;
sbit wela=P2^7;
#define uint unsigned int
#define uchar unsigned char
uchar i,bai,shi,ge;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};

void delay(uint z)
{        
        uint x,y;
        for(x=z;x>0;x--)
                for(y=110;y>0;y--);
}


void main()
{        
        P3=0xff;//P3口全部送高電平        
         i=0;
        while(1)
        {        
                bai=i/100;
                shi=i%100/10;           
                ge=i%10;
                if(key1==0)//按下鍵盤時鍵盤端接地為低電平
                {        i++;                 
                        delay(10);//消抖
                        while(!key1);//對鍵盤進行松手檢查
                        delay(10);//消抖
                        if(i<=10)
                {        
                        wela=1;
                        P0=0xfe;//第一個數碼管亮
                        wela=0;
                        dula=1;
                        P0=table[ge];
                        dula=0;
                        delay(10);
                }
                        if(10<i&&i<100)
                {        
                        dula=1;
                        P0=table[ge];
                        dula=0;
                        P0=0xff;
                        wela=1;
                        P0=0xfd;//第二個數碼管亮
                        wela=0;
                        delay(10);

                        dula=1;
                        P0=table[shi];
                        dula=0;
                        wela=1;
                        P0=0xfe;
                        wela=0;
                        delay(5);                        
                }
                        /*if(i==100)
                {

                        dula=1;
                        P0=table[bai];
                        dula=0;
                        wela=1;
                        P0=0xfe;
                        wela=0;
                        P0=0xff;
                        delay(5);

                          dula=1;
                        P0=table[shi];
                        dula=0;
                        wela=1;
                        P0=0xfd;
                        wela=0;
                        P0=0xff;
                        delay(5);

                        dula=1;
                        P0=table[ge];
                        dula=0;
                        wela=1;
                        P0=0xfb;
                        wela=0;
                        P0=0xff;
                        delay(5);
                        i=0;
                        while(!key1);
                        delay(10);
                        i=0;
                }*/
            }
                           
        }
        
}
   


TX-1C型單片機開發板原理圖.pdf

1015.98 KB, 下載次數: 4

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

使用道具 舉報

沙發
ID:686782 發表于 2020-6-2 10:44 | 只看該作者
你的數碼管在沒有按鍵按下事件時只給了高位顯示,并沒有進行掃描。
所以只有當按下按鍵時數碼管低位會跳過短暫的顯示,這之后就一直保留著高位位選打開的狀態,并沒有再對低位進行顯示。
回復

使用道具 舉報

板凳
ID:764107 發表于 2020-6-2 16:37 | 只看該作者
樓上的説得對,像這種就應該將顯示和按鈕掃描分開,你講按鈕執行里面的顯示全部弄到外面就行了
回復

使用道具 舉報

地板
ID:213173 發表于 2020-6-2 18:35 | 只看該作者
不能用按鍵松手死循環等待while(!key1);,會影響數碼管動態顯示,郭天祥的類似示例只為說明一個道理,完全不能實戰,樓主這程序只要小改一下問題都解決了。
  1. #include<reg52.h>
  2. sbit key1=P3^4;
  3. sbit dula=P2^6;
  4. sbit wela=P2^7;
  5. #define uint unsigned int
  6. #define uchar unsigned char
  7. uchar i,j,bai,shi,ge;
  8. uchar code table[]={
  9. 0x3f,0x06,0x5b,0x4f,
  10. 0x66,0x6d,0x7d,0x07,
  11. 0x7f,0x6f,0x77,0x7c,
  12. 0x39,0x5e,0x79,0x71};

  13. void delay(uint z)
  14. {        
  15.         uint x,y;
  16.         for(x=z;x>0;x--)
  17.                 for(y=110;y>0;y--);
  18. }


  19. void main()
  20. {        
  21.         P3=0xff;//P3口全部送高電平        
  22.         i=0;
  23.         while(1)
  24.         {
  25.                 if(key1==0)//按下鍵盤時鍵盤端接地為低電平
  26.                 {                        
  27.                         j++;//消抖
  28.                         if(key1==0&&j==2)
  29.                         {
  30.                                 j=2;
  31.                                 i++;
  32.                                 if(i>99)
  33.                                         i=0;
  34.                                 shi=i/10;           
  35.                                 ge        =i%10;
  36.                         }      
  37.                 }
  38.                 else j=0;//松手

  39.                 wela=1;
  40.                 P0=0xfe;//第一個數碼管亮
  41.                 wela=0;
  42.                 dula=1;
  43.                 P0=table[shi];
  44.                 dula=0;
  45.                 delay(5);
  46.                
  47.                 wela=1;
  48.                 P0=0xfd;//第二個數碼管亮
  49.                 wela=0;
  50.                 dula=1;
  51.                 P0=table[ge];
  52.                 dula=0;
  53.                 delay(5);
  54.         }       
  55. }

復制代碼

回復

使用道具 舉報

5#
ID:332444 發表于 2020-6-3 09:19 | 只看該作者
回復

使用道具 舉報

6#
ID:632567 發表于 2020-6-4 20:11 | 只看該作者
wulin 發表于 2020-6-2 18:35
不能用按鍵松手死循環等待while(!key1);,會影響數碼管動態顯示,郭天祥的類似示例只為說明一個道理,完全 ...

為什么j++可以消抖呢?
回復

使用道具 舉報

7#
ID:632567 發表于 2020-6-4 20:19 | 只看該作者
specialClass 發表于 2020-6-2 16:37
樓上的説得對,像這種就應該將顯示和按鈕掃描分開,你講按鈕執行里面的顯示全部弄到外面就行了

額,我沒聽懂但是把顯示函數調出后確實可以了
回復

使用道具 舉報

8#
ID:213173 發表于 2020-6-5 06:51 | 只看該作者
單片機在想peach 發表于 2020-6-4 20:11
為什么j++可以消抖呢?

一旦按鍵按下,j++,j就=1,由于顯示程序占用主循環時間大于10ms,等到再次判斷按鍵狀態時抖動時間已越過,所以j==2確認鍵被按下,否則沒有按下j清0。如果主循環周期短,判斷次數相應增加。如果程序寫得效率高主循環時間一般不大于1ms,這樣j就要以100~200判斷。
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 这里有精品 | 日韩精品 电影一区 亚洲 | 玖玖国产精品视频 | 亚洲视频免费在线看 | 真人一级毛片 | 日韩一区二区三区在线看 | 99久久精品免费看国产高清 | 天堂久 | 91九色视频 | 日本久久福利 | k8久久久一区二区三区 | 无码一区二区三区视频 | 亚洲九九精品 | av中文字幕在线播放 | 国产欧美精品一区二区色综合朱莉 | 日韩精品免费视频 | 久久久久国产精品 | 亚洲综合久久久 | 在线中文字幕亚洲 | 国产精品久久久久久久久久久久久 | 天堂网中文字幕在线观看 | 久久久久久成人 | 免费黄色大片 | 欧美视频二区 | 欧美在线一区二区三区 | 一区二区在线不卡 | 欧美激情一区二区 | 国户精品久久久久久久久久久不卡 | 欧美一区二区三区在线观看 | 男女网站免费观看 | 久久99精品久久久久子伦 | 亚洲 欧美 日韩在线 | 久久久久国产一区二区三区四区 | 九九免费| 日本黄色影片在线观看 | 欧美一区二区二区 | 亚洲精品美女视频 | 日韩久久综合网 | 中文字幕在线免费观看 | 中文字幕中文字幕 | 激情网五月天 |