|
本帖最後由 fatzeros 於 2012-9-25 06:09 PM 編輯
最近在作七段顯示器時鐘,
但是在測試七段顯示時就不正常了,
七段顯示器a段亮後,換b段時,a段還是持續亮了一會才熄!
我的想像中,應該是a段亮後熄滅,亮b段才行是啊!
在實驗板上相同的程序沒有問題啊!
實驗板是stc89c52_12t的單片機,而我用的是stc15f204ea_1t的單片機,
照理論來說,應該是不會有這樣的問題啊!只是執行速度的差異比較大吧!
請教板上問題出在那!
程序:
;腳位功能定義
CLOCK_H1 EQU P3.4 ;定義H1為P3.5腳
CLOCK_H2 BIT P3.3 ;定義H2為P3.4腳
CLOCK_M1 BIT P3.2 ;定義M1為P3.3腳
CLOCK_M2 BIT P3.5 ;定義M2為P3.6腳
CLOCK_SS EQU P3.6 ;定義SS為P3.2腳
DS1302_SCLK BIT P1.6 ;DS1302時鐘口P1.0
DS1302_IO BIT P1.7 ;DS1302數據口P1.1
DS1302_CE BIT P0.0 ;DS1302片選口P1.2
;程序開始
START:
ORG 0000H
AJMP MAIN
;數據段
ORG 0100H
TABLE: ;定義七段顯視器顯的方式
DB 07FH,0FDH,0F7H,0EFH,0DFH,0BFH,0FBH,0FEH ;A,B,C,D,E,F,G,DP
DB 0F5H,049H,061H,0B1H,023H,003H,075H,001H,021H ;0,1,2,3,4,5,6,7,8,9
;主程序段
ORG 0200H
MAIN:
;初始七段顯視器,使SMG_LED為低電位導通
CLR CLOCK_H1
CLR CLOCK_H2
CLR CLOCK_M1
CLR CLOCK_M2
CLR CLOCK_SS
;循環功能段
CYCLE:
MOV R7,#8 ;初始暫存器R7為X,表示使用TABLE表之前X項之數值
MOV DPTR,#TABLE ;初始DPTR為數據段之數值
DISPLAY:
CLR A ;清除累加器
MOVC A,@A+DPTR ;指定累加器為累加器加上循環功能段之DPTR(TABLE表內之數值,由第一個開始)
MOV P2,A ;指定P2_I/O腳位為累加器之數值,即七段顯視器依TABLE表內之數值遞增顯視
ACALL DELAY ;呼叫延遲程序,使七段顯視器顯視時間加長
INC DPTR ;遞增DPTR的顯視TABLE表內之數值
DJNZ R7,DISPLAY ;遞減暫存器R7的值,如不為0則跳至DISPLAY段
AJMP CYCLE ;遞減暫存器R7的值,如為0則跳至CYCLE段
;使用遞減暫存器R5及R6達成延時效果,暫存器R4為遞減循環次數
DELAY:
MOV R4,#40 ;暫存器R4,循環A次
D1:
MOV R5,#150 ;D1段,暫存器R5指定初始值為B,最大至255
D2:
MOV R6,#200 ;D2段,暫存器R6指定初始值為C,最大至255
DJNZ R6,$ ;遞減暫存器R6初始值C
DJNZ R5,D2 ;遞減暫存器R5初始值B,如不為0時則跳至D2段
DJNZ R4,D1 ;遞減暫存器R4初始值A,如不為0時則跳至D1段
RET ;回呼叫點
END
電路圖:
難道問題是出在電阻不夠大嗎?
謝謝謝謝! |
|