標(biāo)題: 單片機(jī)怎么實(shí)現(xiàn)1位數(shù)碼管按鍵下的靜態(tài)顯示0-9 我寫(xiě)的程序有問(wèn)題 [打印本頁(yè)]

作者: fenger112    時(shí)間: 2018-4-24 22:26
標(biāo)題: 單片機(jī)怎么實(shí)現(xiàn)1位數(shù)碼管按鍵下的靜態(tài)顯示0-9 我寫(xiě)的程序有問(wèn)題
這個(gè)代碼有問(wèn)題,按下按鍵不是按順序從0-9的顯示,是跳著顯示,幫看看哪里錯(cuò)了。

單片機(jī)源程序:
  1. #include "reg52.h"
  2. #define uint unsigned int
  3. #define uchar unsigned char
  4. uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
  5.                      0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //共陽(yáng)數(shù)碼管碼表
  6. sbit key_s1 = P3^2;  //獨(dú)立按鍵S1
  7. uchar num;
  8. void delay(uint z);
  9. void main()

  10. {
  11.         uchar i;
  12.         P2 = 0xff;
  13.         while(1)
  14.         {
  15.            for(i=0;i<16;i++)
  16.            
  17.            if(key_s1 == 0)
  18.          {
  19.            delay(1000);
  20.            P0=~table[i];
  21.            
  22.            delay(20); //按鍵消抖
  23.            if(key_s1 == 0)
  24.            num++;
  25.            if(num == 10)
  26.            num = 0;
  27.            while(!key_s1); //松手檢測(cè)
  28.          }
  29.         }
  30. }
  31.         void delay(uint z)
  32.         {
  33.          uint x,y;         for(x=z;x>0;x--)
  34.          for(y=110;y>0;y--);
  35.         }

復(fù)制代碼



作者: HC6800-ES-V2.0    時(shí)間: 2018-4-25 08:42
你的程序思路不對(duì)啊。

你先f(wàn)or,你知道你按鍵時(shí),for到哪里了?所以,你按下鍵時(shí),真的是碰運(yùn)氣,for到哪,就是哪兒,所以,不會(huì)跟你設(shè)想的按一下,走一個(gè)字。

我是這樣改你的程序的
void main()

{
        uchar i;
        P2 = 0xff;
        while(1)
        {
           if(key_s1 == 0)
         {
           delay(1000);
           P0=table[i];
           i++;
                   if (i>9)
                   i=0;
           delay(20); //按鍵消抖
           if(key_s1 == 0)
           num++;
           if(num == 10)
           num = 0;
           while(!key_s1); //松手檢測(cè)
         }
        }
}

另外,我還不明白,你的num變量是干什么的,沒(méi)什么用啊。
作者: 752599906    時(shí)間: 2018-4-25 12:01
邏輯混亂了
你現(xiàn)在實(shí)現(xiàn)的是0-f的抽獎(jiǎng)顯示吧

1.你的16次for循環(huán)應(yīng)該去掉
2.要顯示的應(yīng)該是num,不是i
3.delay(1000)影響消抖,且你不按按鍵數(shù)碼管顯示數(shù)字不會(huì)變,這句應(yīng)該去掉
暫時(shí)看到那么多
作者: fenger112    時(shí)間: 2018-4-25 12:50
怎么是亂碼

265947653.jpg (41.49 KB, 下載次數(shù): 82)

265947653.jpg

作者: wulin    時(shí)間: 2018-4-25 14:28
fenger112 發(fā)表于 2018-4-25 12:50
怎么是亂碼

數(shù)碼管數(shù)組用反了吧?
作者: fenger112    時(shí)間: 2018-4-25 20:43
現(xiàn)在是正常了,可是怎么按下按鍵,直接從0跳到2,怎么回事啊,大家在幫我看看哪里出問(wèn)題了。

#include "reg52.h"
#define uint unsigned int
#define uchar unsigned char
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
                     0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //共陽(yáng)數(shù)碼管碼表
sbit key_s1 = P3^2;  //獨(dú)立按鍵S1
uchar num;
void delay(uint z);
void main()

{
        uchar i;
        P2 = 0xff;
        while(1)
        {
           if(key_s1 == 0)
         {
           P0=~table[i];
           i++;
           if (i>9)
       i=0;
           delay(20); //按鍵消抖
           if(key_s1 == 0)
           num++;
           if(num == 10)
           num = 0;
           while(!key_s1); //松手檢測(cè)
         }
        }
}
        void delay(uint z)
        {
         uint x,y;         for(x=z;x>0;x--)
         for(y=110;y>0;y--);
        }


作者: wulin    時(shí)間: 2018-4-26 07:12
fenger112 發(fā)表于 2018-4-25 20:43
現(xiàn)在是正常了,可是怎么按下按鍵,直接從0跳到2,怎么回事啊,大家在幫我看看哪里出問(wèn)題了。

#include " ...

#include "reg52.h"
#define uint unsigned int
#define uchar unsigned char
uchar code table[]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,                     
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //共陰數(shù)碼管碼表0~F
sbit key_s1 = P3^2;  //獨(dú)立按鍵S1
//uchar num;
void delay(uint z);
void main()
{
        uchar i=0;
        P2 = 0xff;
        P0=~table;
        while(1)
        {
                if(key_s1 == 0)
                {
                        delay(20); //按鍵消抖
                        if(key_s1 == 0)
                        {
                                i++;
                                if(i>9)
                                        i=0;
                                P0=~table;
                                while(!key_s1); //松手檢測(cè)
//                                num++;
//                                if(num == 10)
//                                num = 0;
                        }
                }
        }
}
void delay(uint z)
{
        uint x,y;         
        for(x=z;x>0;x--)
                for(y=110;y>0;y--);
}

作者: fenger112    時(shí)間: 2018-4-26 19:16
wulin 發(fā)表于 2018-4-26 07:12
#include "reg52.h"
#define uint unsigned int
#define uchar unsigned char

謝謝了,不過(guò)P0=~table;這句要改成P0=~table;才行
作者: haiguangshi    時(shí)間: 2018-4-26 19:48
對(duì)啦,我也剛看明白,學(xué)習(xí)了
作者: wulin    時(shí)間: 2018-4-26 20:34
fenger112 發(fā)表于 2018-4-26 19:16
謝謝了,不過(guò)P0=~table;這句要改成P0=~table;才行

這是與你使用的數(shù)碼管是共陰或共陽(yáng)來(lái)確定的
作者: 馬非    時(shí)間: 2018-4-26 21:37
共陽(yáng)數(shù)碼管段碼不對(duì)吧




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1