(這個方法有助於加深對於中斷的理解)
在今天設計乙個關於數碼管的秒錶時,採用了以下**
:
#include
sbit addr0=p1
^0;sbit addr1=p1
^1;sbit addr2=p1
^2;sbit addr3=p1
^3;sbit enled=p1
^4;unsigned char code ledchar=
;unsigned char ledbuff[6]
=;unsigned char i=0;
unsigned int cnt=0;
unsigned char flag=0;
void
main()
;if(sec/
100%
10==
0&&sec/10%
10!=0)
; ledbuff[3]
=0x40
; ledbuff[4]
=0x4f
; ledbuff[5]
=0x5b;}
}}void
interrupttimer0
() interrupt 1p0=
0x00
;switch
(i)}
;
原本目的是三位秒錶如果百位為0則不會亮,但是卻出現了鬼影現象,這是為什麼呢?
個人的理解是,在以下**處,由於原本採用的定時器中斷方式,在定時器即將溢位時,**剛好執行到if之前,則會帶著錯誤的ledbuff值進入中斷程式,產生鬼影
ledbuff[1]
= ledchar[sec/10%
10]; ledbuff[2]
= ledchar[sec/
100%10]
;if(sec/
100%
10==
0&&sec/10%
10==
0)
下面是改進之後的**,也就是將相關賦值放在中斷程式中進行,就能消除鬼影啦(但是有的微控制器型號不同值得留意)
#include
sbit addr0=p1
^0;sbit addr1=p1
^1;sbit addr2=p1
^2;sbit addr3=p1
^3;sbit enled=p1
^4;unsigned char code ledchar=
;unsigned char ledbuff[6]
=;unsigned char i =0;
unsigned int cnt =0;
unsigned char flag =0;
unsigned long sec =0;
void
main()
void
interrupttimer0
() interrupt 1
if(sec/
100%
10==
0&&sec/10%
10!=0)
}th0
=0xfc
;tl0
=0x67
; cnt++;if
(cnt >=
1000)p0
=0x00
;switch
(i)}
C51微控制器動態數碼管顯示
delay時間設定的不同可以展示出不同的效果,人的肉眼正常情況下只能分辨變化超過 24ms 間隔的運動,所以小於24ms看起來感覺是靜態顯示的,當延長delay時間時可展現出明顯的動態效果。include include typedef unsigned int u16 typedef unsign...
C51微控制器靜態數碼管 (0 F)
數碼管靜態顯示輪換 include typedef unsigned char u8 typedef unsigned int u16 sbit kza p2 2 控制顯示數碼管具體位 sbit kzb p2 3 sbit kzc p2 4 顯示位 u8 code shumag u8 a 10,i ...
C51微控制器Day03 數碼管靜態顯示
89c51引腳介紹 見課件 數碼管顯示的原理 位選和段選 include sbit dula p2 6 sbit wela p2 7 void main 編碼表code 隨機儲存器中每定義乙個變數都會占用乙個位元組如uchar,而int佔兩個位元組,而隨機儲存器共128位元組,故要合理使用 code...