數碼管數字漂移問題

2021-06-07 16:05:17 字數 1883 閱讀 5051

下面是我的計數器實驗遇到的問題以及解答。**如下所示:

#include

typedef unsigned char uint8;

typedef unsigned long int  uint32;

sbit addr0=p1^0;

sbit addr1=p1^1;

sbit addr2=p1^2;

sbit enled2=p1^3;

sbit enled1=p1^4;

uint32 sec=0;//

這個用於記錄秒數,因為有

6個數碼管,所以

16為已經不夠了,用

32位

uint8 number=;

void display();

void main()

if(j==100) 

/* sec=123456;

for(k=0;k<100;k++)

for(i=0;i<255;i++);*/

} }

void display()

}sec=123456

以及紅色程式是我的測試資料。

如果加上

sec=123456

和紅色那段程式,那麼就會顯示

123456,

但是如果加上

sec=123456

不加紅色部分了以後就會顯示

234561。

如果都不加它就會從第二個數碼管開始累加。

拋開程式,我還發現了乙個奇怪的現象,

如果只是用乙個的數碼管顯示,那麼可以正常顯示(

0->9->0),

但是如果是第乙個和第二個數碼管,那麼第二個變成個位,第乙個變為十位,但是如果是三個的話,那麼第二位還是個位,第三個是十位,第乙個就是百位。我不知道這個是什麼原因,自己已經搞了乙個下午和晚上都不知道錯誤在**!

解答:為了簡化問題,用下面兩行程式來討論。

case0:addr0=0;addr1=0;addr2=0;h++;p0=number[sec%10];break;

case1:addr0=1;addr1=0;addr2=0;h++;p0=number[(sec/10)%10];break;

第一次呼叫

display

()時,選中

ds1,

p0輸出個位數

6的段碼,

緊接著第二次呼叫

display,

執行case1:addr0=1;addr1=0;addr2=0;

(暫停一下,此時

138已選中數碼管

ds2,

p0上還保持者上次的內容:個位數

6的段碼,它會被送顯到

ds2上),

接下來執行

h++;

tmp=(sec/10)%10

;(/和

%運算都要花些時間,這段時間

ds2上一直顯示著個位數

6的段碼,在你沒加紅色延時的情況下,時間要比顯示十位數

5的時間長),

最後執行

p0= number[tmp]

,這個時候

ds2上才顯示出十位數

5(前面說過,這個時間較短,十位數

5顯示在

ds3上的時間較長)

總結一下:在沒加延時的情況下,個位數6在

ds1上顯示的時間短於在

ds2的時間,在

ds2上看到的是6和

5的混合顯示,更多的看到

6,同理

ds3上更多的看到的是5,

ds1上更多的看到的是1,

…… 加上延時就不同了,

ds2上顯示

5的時間要遠遠多於顯示

6的時間,以至於只能看到

5,顯示就正常了!

數碼管顯示任意數字

數碼管顯示任意數字,例如 1 69 888 6666 11111類似的數字,只顯示應該亮的數碼管。c include define led choose p2 define led value p0 sbit le p1 0 sbit la p2 2 sbit lb p2 3 sbit lc p2 ...

數碼管問題(c 實現)

描述 液晶數碼管用七筆阿拉數字表示的十個數字,把橫和豎的一 個短劃都稱為一筆,即 有 筆,有 筆等。對於十個數字一種排列,要做到 兩相鄰數字都可以由另乙個數字加上幾筆或減去幾筆組成,但不能又加又減。比如 是允許的,不允許。任意輸入一組數,判斷是否符合上述規則。輸入 每行輸入乙個0 9的排列,數字之間...

數碼管顯示

數碼管顯示 最近因為對突然對電子感興趣,前幾天在路過電子 時買了乙個數碼管。因為以前總是紙上談兵,根本沒實驗過,連數碼見都沒見過,所以開始覺得將這塊數碼管顯示出來是非常具有挑戰性的工作。今天正好有空,拿來了我的數碼管,並在網上看了一些資料,才發現並不是想象中的那麼難,其實更準確的說是太簡單了。不到半...