下面是我的計數器實驗遇到的問題以及解答。**如下所示:
#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的排列,數字之間...
數碼管顯示
數碼管顯示 最近因為對突然對電子感興趣,前幾天在路過電子 時買了乙個數碼管。因為以前總是紙上談兵,根本沒實驗過,連數碼見都沒見過,所以開始覺得將這塊數碼管顯示出來是非常具有挑戰性的工作。今天正好有空,拿來了我的數碼管,並在網上看了一些資料,才發現並不是想象中的那麼難,其實更準確的說是太簡單了。不到半...