我看不太懂你的代碼
干脆我自己寫一個了,以下就是我寫的,這個程序仿真不一定行,但實際肯定是可以的,我已經(jīng)在自己的板子上燒錄運行過了,你可以參考一下
每個人寫代碼的習慣都是不一樣的, 我不太習慣由編譯器指定地址,有時候要用到連續(xù)的地址,我不知道由編譯指定的地址是不是連續(xù),所以,就自己指定了,久了就成了一種習慣了
/*0-2000計數(shù)程序
;單片機型號:STC8a4k32s2,使用片上24MHZ晶振
如果使用其它型號單片機,延時要調(diào)節(jié)一下
;COM1,COM2和OUT可以在EQU中修改
;仿真的時候自己做一些修改就可以了,這是一個已經(jīng)在開發(fā)板上驗證過的程序*/
;===========================================================================
COM0 EQU P2.0
COM1 EQU P2.1
COM2 EQU P2.2
COM3 EQU P2.3 ;數(shù)碼管的4個位選端口
S1 BIT P1.5 ;按鍵
OUT EQU P0 ;PO用于顯示
P2M0 EQU 096H ;
P2M1 EQU 095H ;控制P2端口輸出模式的兩個寄存器
;===========================================================================
LED_1 DATA 030H ;顯示電壓用的LED位的個位
LED_10 DATA 031H ;顯示電壓用的LED位的十位
LED_100 DATA 032H ;顯示電壓用的LED位的百位
LED_1000 DATA 033H ;顯示電壓用的LED位的千位
DIV_L DATA 034H ;除法高位用的緩存器
DIV_H DATA 035H ;除法低位用的緩存器
DATA_BUF_L DATA 036H ;數(shù)據(jù)暫存器的低位
DATA_BUF_H DATA 037H ;數(shù)據(jù)暫存器的高位
DATA_K_L DATA 038H ;數(shù)據(jù)2000的低位
DATA_K_H DATA 039H ;數(shù)據(jù)2000的高位
;===================================================
ORG 0000H
LJMP MAIN
ORG 0100H
MAIN: MOV DATA_K_L,#00H
MOV DATA_K_H,#00H ;
MOV P2M1,#000H ;
MOV P2M0,#0FFH ;P2端口設(shè)定成強推挽輸出
;========================================
LOOP_0: JB S1,LOOP_1 ;
CALL S1_DISP ;調(diào)用按鍵處理子程序
LOOP_1: CALL DISPLAY ;
JMP LOOP_0 ;
;==============================================================================================================
;按鍵處理子程序
S1_DISP: CALL DISPLAY ;調(diào)用顯示一次,就當作是去抖動
JNB S1,S1_DISP ;這個可以不要,有的話就是當你按下按鍵不放的時候,顯示不會滅燈,
;數(shù)字也不會一直的加上去,調(diào)試的時候不要這條指令,就可以快速的調(diào)到2000循環(huán)
;========================
CLR C ;
MOV A,DATA_K_L ;
ADD A,#001H ;低位加1
MOV DATA_K_L,A ;
MOV A,DATA_K_H ;
ADDC A,#000H ;高位帶進位加0
MOV DATA_K_H,A ;
;========================
CLR C
MOV A,#LOW(2000) ;
SUBB A,DATA_K_L ;
MOV A,#HIGH(2000) ;
SUBB A,DATA_K_H ;
JNC S1_DISP_0 ;C進位標志位為0,就表示還沒有加到2000
MOV DATA_K_L,#00H ;
MOV DATA_K_H,#00H ;
S1_DISP_0:
RET ;返回
;===========================================================================
;顯示子程序
DISPLAY: MOV B,DATA_K_L
MOV A,DATA_K_H ;
CALL DATA_DISP ;2000的10進制數(shù)據(jù)拆分為4個倍數(shù),并存放在四個地址中
;===================================================
MOV A,LED_1
CLR COM0 ;打開位選
CALL DISP_LED ;數(shù)碼管通過查表顯示
CALL DELAY1MS ;延時1mS
SETB COM0 ;關(guān)閉位選
;===================================================
MOV A,LED_10
CLR COM1 ;打開位選
CALL DISP_LED ;數(shù)碼管通過查表顯示
CALL DELAY1MS ;延時1mS
SETB COM1 ;關(guān)閉位選
;===================================================
MOV A,LED_100
CLR COM2 ;打開位選
CALL DISP_LED ;數(shù)碼管通過查表顯示
CALL DELAY1MS ;延時1mS
SETB COM2 ;關(guān)閉位選
;===================================================
MOV A,LED_1000
CLR COM3 ;打開位選
CALL DISP_LED ;數(shù)碼管通過查表顯示
CALL DELAY1MS ;延時1mS
SETB COM3 ;關(guān)閉位選
;===================================================
RET
;=================================================================================================
;數(shù)碼管查表顯示
DISP_LED: MOV DPTR,#TABLE
MOVC A,@A+DPTR
MOV OUT,A ;
/* CALL DELAY1MS ;延時1mS,如果延時放在這里掃描顯示部分可以少一點,放在顯示那是為了方便理解而已*/
RET
;==================================================================================================
;這個是1mS的延時程序,在STC下載器中可以用軟件自動計算
;如果是仿真,可以相應(yīng)的減少延時的時長
DELAY1MS: PUSH 30H
PUSH 31H
MOV 30H,#32
MOV 31H,#39
NEXT: DJNZ 31H,NEXT
DJNZ 30H,NEXT
POP 31H
POP 30H
RET
;===================================================================================================
;DATA_DISP==============數(shù)據(jù)拆分,把一個數(shù)拆分成四個數(shù),用于顯示======================
;把16進制的高低兩個字節(jié)分別放到A和B,處理之后,個十百千會分別放到4個地址中,使用減法運算來達到除法的效果
;進入之前要先把高位數(shù)據(jù)存放到A,低位數(shù)據(jù)存放到B
DATA_DISP: MOV LED_1,#0
MOV LED_10,#0
MOV LED_100,#0
MOV LED_1000,#0 ;先把四個清除
MOV DATA_BUF_H,A ;
MOV DATA_BUF_L,B ;把數(shù)據(jù)傳送到緩沖器中
MOV R0,#0E8H ;
MOV R1,#03H ;1000的16進制為03E8H
MOV R2,#100
MOV R3,#10
MOV R4,#0
SUB_1000: CLR C
MOV A,DATA_BUF_L
SUBB A,R0
MOV DIV_L,A;
MOV A,DATA_BUF_H;
SUBB A,R1
MOV DIV_H,A
JC SUB_100
MOV DATA_BUF_L,DIV_L
MOV DATA_BUF_H,DIV_H
INC LED_1000
JMP SUB_1000
SUB_100: CLR C
MOV A,DATA_BUF_L
SUBB A,R2
MOV DIV_L,A
MOV A,DATA_BUF_H;
SUBB A,R4
MOV DIV_H,A
JC SUB_10
MOV DATA_BUF_L,DIV_L
MOV DATA_BUF_H,DIV_H
INC LED_100
JMP SUB_100
SUB_10: MOV A,DATA_BUF_L
MOV B,R3
DIV AB
MOV LED_10,A
MOV LED_1,B
RET
;===================================================================================
TABLE: DB 11111100B,01100000B,11011010B,11110010B,01100110B,10110110B,10111110B,11100000B,11111110B,11110110B ;表:共陰數(shù)碼管 0-9
END
|