欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2273|回復(fù): 5
收起左側(cè)

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

[復(fù)制鏈接]
ID:883891 發(fā)表于 2021-2-10 18:40 | 顯示全部樓層 |閱讀模式
這個是用定時器實現(xiàn)動態(tài)數(shù)碼管顯示,如果有按鍵按下,數(shù)碼管數(shù)字加一,F(xiàn)在我在readkey()函數(shù)多加了一個if語句,如果另一個按鍵按下會數(shù)字減一。但是,放進去后,只能加一次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;  //定義數(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};//共陽數(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ù)字各個位數(shù)
  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()    //數(shù)碼管顯示函數(shù)
  42. {
  43.         yima();         //獲得數(shù)字各個位數(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ù)點
  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.     //設(shè)置定時器的初始計數(shù)值
  80.     //計算方法
  81.     //假設(shè)定時器為1ms,一個機器周期為 1/單片機的晶振頻率  即: 1/12M = 1us
  82.     //而1個機器周期 = 12個時鐘周期 所以: n x 機器周期 = 1ms ===> n x 1us = 1ms
  83.     //所以n = 1000,也就是經(jīng)過1000個機器周期,定時器要溢出(從0開始計數(shù))
  84.     //所以定時器的初始值為65535 - 1000 + 1 = 64536 ===> 0xFC18
  85.     TH0 = 0xFC;
  86.     TL0 = 0x18;

  87.     EA = 1;  //總中斷開關(guān)
  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();  //動態(tài)顯示數(shù)字
  98. }               
  99. //}


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


數(shù)碼管顯示.zip

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

回復(fù)

使用道具 舉報

ID:883891 發(fā)表于 2021-2-10 18:47 | 顯示全部樓層
補充:
1.我用的是c51
2.readkey()函數(shù)如果只是下面這樣是沒有問題的
void readkey(void)   //按鍵按下判斷函數(shù)

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

   

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

使用道具 舉報

ID:213173 發(fā)表于 2021-2-11 07:47 | 顯示全部樓層
大Q熊 發(fā)表于 2021-2-10 18:47
補充:
1.我用的是c51
2.readkey()函數(shù)如果只是下面這樣是沒有問題的

樓主的程序問題不少,改這樣試試。
#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};//共陽數(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ù)字各個位數(shù)
{
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()    //數(shù)碼管顯示函數(shù)
{
//        yima();         //獲得數(shù)字各個位數(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ù)點
                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;  //總中斷開關(guān)
        ET0 = 1; //T0中斷
        TR0 = 1;//啟動T0定時器
}

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

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

回復(fù)

使用道具 舉報

ID:373388 發(fā)表于 2021-2-11 12:33 | 顯示全部樓層
1 ,float 數(shù)據(jù)類型最高位是符號位,  0 -1 就等于 -1 了, 你的譯碼函數(shù)沒有判斷符號位;顯示會有問題
2, 檢查硬件電路,按下去和抬起按鍵電平是否正確
回復(fù)

使用道具 舉報

ID:883891 發(fā)表于 2021-2-11 15:21 | 顯示全部樓層
wulin 發(fā)表于 2021-2-11 07:47
樓主的程序問題不少,改這樣試試。
#include
#include

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

使用道具 舉報

ID:883891 發(fā)表于 2021-2-11 15:22 | 顯示全部樓層
xhaity 發(fā)表于 2021-2-11 12:33
1 ,float 數(shù)據(jù)類型最高位是符號位,  0 -1 就等于 -1 了, 你的譯碼函數(shù)沒有判斷符號位;顯示會有問題
2 ...

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

使用道具 舉報

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

本版積分規(guī)則

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

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

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