找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 1967|回復(fù): 5
打印 上一主題 下一主題
收起左側(cè)

MCU檢測(cè)按鍵,實(shí)現(xiàn)數(shù)碼管數(shù)字加一函數(shù),我多加了一個(gè)減一就不行了

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:883891 發(fā)表于 2021-2-10 18:40 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
這個(gè)是用定時(shí)器實(shí)現(xiàn)動(dòng)態(tài)數(shù)碼管顯示,如果有按鍵按下,數(shù)碼管數(shù)字加一。現(xiàn)在我在readkey()函數(shù)多加了一個(gè)if語(yǔ)句,如果另一個(gè)按鍵按下會(huì)數(shù)字減一。但是,放進(jìn)去后,只能加一次1,或者減一次1了。

下面是整個(gè)程序,請(qǐng)大家指點(diǎn)!感激不盡!
  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;  //定義數(shù)字為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};//共陽(yáng)數(shù)碼管顯示
  10.         unsigned char table1[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//流水燈0-7
  11.          
  12. void readkey(void)   //按鍵按下判斷函數(shù)

  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--;      //數(shù)字+1
  22.                  }               

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




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




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


  49.         switch (display_case)//輪流顯示四位數(shù)字
  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;        //顯示小數(shù)點(diǎn)
  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;        //顯示個(gè)位
  72.         P0=table[g];
  73.       break;
  74. }
  75.                 }


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

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

  87.     EA = 1;  //總中斷開關(guān)
  88.     ET0 = 1; //T0中斷

  89.     TR0 = 1;//啟動(dòng)T0定時(shí)器
  90. }


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


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


數(shù)碼管顯示.zip

1.38 KB, 下載次數(shù): 2

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

使用道具 舉報(bào)

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

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

   

但是再加一個(gè)if語(yǔ)句判斷另一個(gè)按鍵就有問(wèn)題了就有問(wèn)題了
回復(fù)

使用道具 舉報(bào)

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

樓主的程序問(wèn)題不少,改這樣試試。
#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;  //定義數(shù)字為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};//共陽(yáng)數(shù)碼管顯示
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)   //按鍵按下判斷函數(shù)
{
        if(key==0) //低電平有效
        {
                Delay1ms(20);  //消抖0.02秒
                if(key==0)  
                {
                        digital++;      //數(shù)字+1
                        while(!key);  //等待按鍵釋放
                }
        }               
        if(key1==0) //低電平有效   
        {
                Delay1ms(20);  //消抖0.02秒
                if(key1==0)  
                {
                        digital--;       //數(shù)字-1
                        while(!key1);  //等待按鍵釋放
                }
        }                                          
}
/*
void yima()   //獲得數(shù)字各個(gè)位數(shù)
{
a=digital*100;
b=a/1000;     //千位
c=a-b*1000;   //獲得,百、十、個(gè)位
d=c/100;      //取出百位
e=c-d*100;    //獲得,十、個(gè)位
f=e/10;       //取出十位
g=e-f*10;     //取出個(gè)位
}*/

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

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

void trigger_timer0() interrupt 1
{
        TH0 = 0xFC;
        TL0 = 0x18;
        display();  //動(dòng)態(tài)顯示數(shù)字
}

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

回復(fù)

使用道具 舉報(bào)

地板
ID:373388 發(fā)表于 2021-2-11 12:33 | 只看該作者
1 ,float 數(shù)據(jù)類型最高位是符號(hào)位,  0 -1 就等于 -1 了, 你的譯碼函數(shù)沒(méi)有判斷符號(hào)位;顯示會(huì)有問(wèn)題
2, 檢查硬件電路,按下去和抬起按鍵電平是否正確
回復(fù)

使用道具 舉報(bào)

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

可以啦,太感謝了!。!
回復(fù)

使用道具 舉報(bào)

6#
ID:883891 發(fā)表于 2021-2-11 15:22 | 只看該作者
xhaity 發(fā)表于 2021-2-11 12:33
1 ,float 數(shù)據(jù)類型最高位是符號(hào)位,  0 -1 就等于 -1 了, 你的譯碼函數(shù)沒(méi)有判斷符號(hào)位;顯示會(huì)有問(wèn)題
2 ...

沒(méi)有,我在正數(shù)區(qū)間就出現(xiàn)問(wèn)題了,還沒(méi)有到0以下,硬件是沒(méi)有問(wèn)題的
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表