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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

MCU檢測按鍵,實現數碼管數字加一函數,我多加了一個減一就不行了

[復制鏈接]
跳轉到指定樓層
樓主
ID:883891 發表于 2021-2-10 18:40 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
這個是用定時器實現動態數碼管顯示,如果有按鍵按下,數碼管數字加一。現在我在readkey()函數多加了一個if語句,如果另一個按鍵按下會數字減一。但是,放進去后,只能加一次1,或者減一次1了。

下面是整個程序,請大家指點!感激不盡!
  1. #include <reg51.h>
  2. #include <intrins.h>
  3. sbit key = P3^2;  //P3為按鍵接口
  4. sbit key1 = P3^3;  //P3為按鍵接口

  5. int display_case=0;
  6. unsigned char n=0,n1=0;
  7.         float digital=12.26;  //定義數字為12.26
  8.         int a,b,c,d,e,f,g;

  9.   unsigned char table[] ={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0X7F};//共陽數碼管顯示
  10.         unsigned char table1[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//流水燈0-7
  11.          
  12. void readkey(void)   //按鍵按下判斷函數

  13. {
  14.                 void Delay100ms(int t);
  15.         
  16.     if(key==1)  
  17.                         {
  18.       Delay100ms(2);  //消抖0.2秒
  19.       if(key==1)  
  20.        while(key);  //等待按鍵釋放
  21.                         digital--;      //數字+1
  22.                  }               

  23.     if(key1==1)  
  24.                         {
  25.       Delay100ms(2);  //消抖0.2秒
  26.       if(key1==1)  
  27.        while(key1);  //等待按鍵釋放
  28.                         digital++;       //數字-1
  29.             }                                          
  30. }




  31. void yima()   //獲得數字各個位數
  32. {
  33. a=digital*100;
  34. b=a/1000;     //千位
  35. c=a-b*1000;   //獲得,百、十、個位
  36. d=c/100;      //取出百位
  37. e=c-d*100;    //獲得,十、個位
  38. f=e/10;       //取出十位
  39. g=e-f*10;     //取出個位
  40. }




  41. void display()    //數碼管顯示函數
  42. {
  43.         yima();         //獲得數字各個位數
  44.         
  45.         
  46.         display_case++;  //輪流顯示四位數字
  47. if(display_case>4)
  48.         display_case=0;


  49.         switch (display_case)//輪流顯示四位數字
  50.                 {
  51.                 case (0):
  52.   P2=0xfe;        //顯示千位
  53.         P0=table[b];
  54.                         break;

  55.                 case(1):
  56.         P2=0xfd;        //顯示百位
  57.         P0=table[d];
  58.       break;
  59.                         
  60.                 case(2):
  61.         P2=0xfd;        //顯示小數點
  62.         P0=table[10];
  63.       break;
  64.                         
  65.                 case(3):
  66.         P2=0xfb;        //顯示十位
  67.         P0=table[f];
  68.       break;
  69.         
  70.                 case(4):
  71.         P2=0xf7;        //顯示個位
  72.         P0=table[g];
  73.       break;
  74. }
  75.                 }


  76. void timer_init()
  77.         {
  78.     TMOD |= 0x01;  //定時器工作方式1,啟用T0定時器, GATE位為0,用TCON的TR0控制T0定時器的啟動

  79.     //設置定時器的初始計數值
  80.     //計算方法
  81.     //假設定時器為1ms,一個機器周期為 1/單片機的晶振頻率  即: 1/12M = 1us
  82.     //而1個機器周期 = 12個時鐘周期 所以: n x 機器周期 = 1ms ===> n x 1us = 1ms
  83.     //所以n = 1000,也就是經過1000個機器周期,定時器要溢出(從0開始計數)
  84.     //所以定時器的初始值為65535 - 1000 + 1 = 64536 ===> 0xFC18
  85.     TH0 = 0xFC;
  86.     TL0 = 0x18;

  87.     EA = 1;  //總中斷開關
  88.     ET0 = 1; //T0中斷

  89.     TR0 = 1;//啟動T0定時器
  90. }


  91. void trigger_timer0() interrupt 1
  92.         {
  93.     TH0 = 0xFC;
  94.     TL0 = 0x18;
  95. //if(ii>10)
  96. //{   ii=0;
  97.                 display();  //動態顯示數字
  98. }               
  99. //}


  100. void main (void)
  101. {
  102. timer_init();// 定時器初始化
  103.         while(1)
  104.         {  
  105.                 readkey();  //按鍵按下判斷函數
  106.         
  107.         }
  108. }
復制代碼


數碼管顯示.zip

1.38 KB, 下載次數: 2

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

使用道具 舉報

沙發
ID:883891 發表于 2021-2-10 18:47 | 只看該作者
補充:
1.我用的是c51
2.readkey()函數如果只是下面這樣是沒有問題的
void readkey(void)   //按鍵按下判斷函數

{
                void Delay100ms(int t);
      
    if(key==1)  
                        {
      Delay100ms(2);  //消抖0.2秒
      if(key==1)  
       while(key);  //等待按鍵釋放
                        digital--;      //數字+1
                 }        

   

但是再加一個if語句判斷另一個按鍵就有問題了就有問題了
回復

使用道具 舉報

板凳
ID:213173 發表于 2021-2-11 07:47 | 只看該作者
大Q熊 發表于 2021-2-10 18:47
補充:
1.我用的是c51
2.readkey()函數如果只是下面這樣是沒有問題的

樓主的程序問題不少,改這樣試試。
#include <reg51.h>
#include <intrins.h>
sbit key = P3^2;  //P3為按鍵接口
sbit key1 = P3^3;  //P3為按鍵接口

unsigned char display_case=0;
//unsigned char n=0,n1=0;
unsigned int digital=1226;  //定義數字為12.26
//unsigned char  a,b,c,d,e,f,g;

unsigned char table[] ={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0X7F};//共陽數碼管顯示
unsigned char table1[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//流水燈0-7

void Delay1ms(unsigned int t)
{
        unsigned int i,j;
        for(i=t;i>0;i--)
                        for(j=125;j>0;j--);
}

void readkey(void)   //按鍵按下判斷函數
{
        if(key==0) //低電平有效
        {
                Delay1ms(20);  //消抖0.02秒
                if(key==0)  
                {
                        digital++;      //數字+1
                        while(!key);  //等待按鍵釋放
                }
        }               
        if(key1==0) //低電平有效   
        {
                Delay1ms(20);  //消抖0.02秒
                if(key1==0)  
                {
                        digital--;       //數字-1
                        while(!key1);  //等待按鍵釋放
                }
        }                                          
}
/*
void yima()   //獲得數字各個位數
{
a=digital*100;
b=a/1000;     //千位
c=a-b*1000;   //獲得,百、十、個位
d=c/100;      //取出百位
e=c-d*100;    //獲得,十、個位
f=e/10;       //取出十位
g=e-f*10;     //取出個位
}*/

void display()    //數碼管顯示函數
{
//        yima();         //獲得數字各個位數
        display_case++;  //輪流顯示四位數字
        if(display_case>4)
                display_case=0;
        P0=0xff;//消隱
        switch (display_case)//輪流顯示四位數字
        {
                case(0):P2=0xfe;P0=table[digital/1000%10];break;//顯示千位
                case(1):P2=0xfd;P0=table[digital/100%10]&0x7f;break;//顯示百位+小數點
                case(2):P2=0xfb;P0=table[digital/10%10];break;//顯示十位
                case(3):P2=0xf7;P0=table[digital%10];break;//顯示個位
        }
}

void timer_init()
{
        TMOD |= 0x01;
        TH0 = 0xFC;
        TL0 = 0x18;
        EA = 1;  //總中斷開關
        ET0 = 1; //T0中斷
        TR0 = 1;//啟動T0定時器
}

void trigger_timer0() interrupt 1
{
        TH0 = 0xFC;
        TL0 = 0x18;
        display();  //動態顯示數字
}

void main (void)
{
        timer_init();// 定時器初始化
        while(1)
        {  
                readkey();  //按鍵按下判斷函數
        }
}

回復

使用道具 舉報

地板
ID:373388 發表于 2021-2-11 12:33 | 只看該作者
1 ,float 數據類型最高位是符號位,  0 -1 就等于 -1 了, 你的譯碼函數沒有判斷符號位;顯示會有問題
2, 檢查硬件電路,按下去和抬起按鍵電平是否正確
回復

使用道具 舉報

5#
ID:883891 發表于 2021-2-11 15:21 | 只看該作者
wulin 發表于 2021-2-11 07:47
樓主的程序問題不少,改這樣試試。
#include
#include

可以啦,太感謝了!!!!
回復

使用道具 舉報

6#
ID:883891 發表于 2021-2-11 15:22 | 只看該作者
xhaity 發表于 2021-2-11 12:33
1 ,float 數據類型最高位是符號位,  0 -1 就等于 -1 了, 你的譯碼函數沒有判斷符號位;顯示會有問題
2 ...

沒有,我在正數區間就出現問題了,還沒有到0以下,硬件是沒有問題的
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美日韩三级 | www.888www看片 | 九九免费视频 | 成人国产精品入口免费视频 | 国产专区在线 | 日韩精品一区在线 | 欧美一级欧美三级在线观看 | 一区二区三区观看视频 | 国产精品久久久久久久久久 | 伊人久久综合影院 | 久久99精品久久久97夜夜嗨 | 先锋资源亚洲 | 亚洲欧美日韩中文在线 | 久久中文字幕视频 | 中文字幕高清免费日韩视频在线 | 奇米久久久 | 日本一区二区三区视频在线 | 久草视频在 | 日韩精品免费在线观看 | 97国产精品视频人人做人人爱 | 日日噜噜噜夜夜爽爽狠狠视频97 | 日韩一级电影免费观看 | av中文字幕在线播放 | 色久五月| 国产一区二区在线视频 | 亚洲精品高清视频 | 午夜不卡一区二区 | 99久久精品免费看国产四区 | 欧美男人天堂 | 一级做a毛片 | 国产一区二区三区久久久久久久久 | av中文字幕网站 | 激情一区二区三区 | 红色av社区| 中文字幕视频在线观看 | av黄色网| 久久久久国产精品人 | 蜜桃视频在线观看免费视频网站www | 青青久视频 | 亚洲国产成人精品久久久国产成人一区 | 欧美成人免费在线视频 |