?? 乘法口決程序.asm
字號:
;**************************************************************
; 延時顯示乘法口決程序
; 每延時1S顯示一句口決,中間間隔2S顯示
; Date : 2006.3.06 12MHZ晶振
; Create by :逸飛 E-mail:mcu-yf@163.com
;版權所有 中國自動化資訊網(www.zidh.com) 逸飛(在您網上的用戶名:xfyyf)
;**************************************************************
;**************************************************************
; 偽定義
;**************************************************************
DISPBUF EQU 30H;定義顯示緩沖區首址,
; 從30H到35H都定義為顯示緩沖區
JI_GE EQU 36H
JI_SHI EQU 37H
DENGYU EQU 38H
SHU2 EQU 39H
DIAN EQU 3AH
SHU1 EQU 3BH
;**************************************************************
; 主 程 序
;**************************************************************
ORG 0000H ;程序執行開始地址
LJMP START ;跳到標號START執行
ORG 000BH ;定時器T0中斷程序入口
LJMP INTT0 ;跳至INTTO執行
ORG 0040H
START:
MOV R0,#30H ;清30H-3BH共11個內存單元
MOV R1,#0CH ;
CLEARDISP: MOV @R0,#00H ;
INC R0 ;
DJNZ R1,CLEARDISP ;
MOV DIAN,#10
MOV DENGYU,#11
MOV SHU1,#1
MOV SHU2,#1
MOV A,SHU1
MOV B,SHU2
MUL AB
MOV B,#10
DIV AB
MOV JI_SHI,A
MOV JI_GE,B
MOV 30H,36H ;送顯示緩沖區
MOV 31H,37H
MOV 32H,38H
MOV 33H,39H
MOV 34H,3AH
MOV 35H,3BH
MOV TMOD,#11H ;設T016位定時器
MOV TL0,#0B0H ;50MS定時初值(T0計時用)
MOV TH0,#3CH ;50MS定時初值
SETB EA ;總中斷開放
SETB ET0 ;允許T0中斷
SETB TR0 ;開啟T0定時器
MOV R4,#14H ;1秒定時用初值(50MS×20)
START1: LCALL DISPLAY ;調用顯示子程序
SJMP START1 ;P3.7口為1時跳回START1
;**************************************************************
; 延時1S顯示下一句子程序
;**************************************************************
;T0中斷服務程序
INTT0: PUSH ACC ;累加器入棧保護
PUSH PSW ;狀態字入棧保護
CLR ET0 ;關T0中斷允許
CLR TR0 ;關閉定時器T0
MOV TL0,#0B0H ;50MS定時初值(T0計時用)
MOV TH0,#3CH ;50MS定時初值
DJNZ R4, OUTT0 ;20次中斷未到中斷退出
ADDSS: MOV R4,#14H ;20次中斷到(1秒)重賦初值
CALL ADD_1
OUTT0:
POP PSW ;恢復狀態字(出棧)
POP ACC ;恢復累加器
SETB ET0 ;開放T0中斷
SETB TR0 ;開啟定時器T0
RETI ;中斷返回
;**************************************************************
; 加1生成下一句子程序
;**************************************************************
ADD_1:
CLR CY
MOV A,#1
ADD A,SHU1
MOV SHU1,A
CJNE A,SHU2,PD
AJMP XD
PD: JNC SHU1_OUT
XD: MOV A,SHU1
MOV B,SHU2
MUL AB
MOV B,#10
DIV AB
MOV JI_SHI,A
MOV JI_GE,B
MOV 30H,36H ;送顯示緩沖區
MOV 31H,37H
MOV 32H,38H
MOV 33H,39H
MOV 34H,3AH
MOV 35H,3BH
AJMP ADD_OUT
SHU1_OUT: MOV A,#1
ADD A,SHU2
MOV SHU2,A
MOV SHU1,#0
CJNE A,#10,ADD_OUT
MOV SHU2,#0
MOV SHU1,#0
ADD_OUT:
RET
;**************************************************************
; 顯示程序
;**************************************************************
; 琍0口輸出段碼數據,P2口作掃描控制,每個LED數碼管亮1MS時間再逐位循環。
DISPLAY: MOV R1,#DISPBUF ;指向顯示數據首址
MOV R5,#0FEH ;掃描控制字初值
PLAY: MOV A,R5 ;掃描字放入A
MOV P2,A ;從P2口輸出
MOV A,@R1 ;取顯示數據到A
MOV DPTR,#TAB ;取段碼表地址
MOVC A,@A+DPTR ;查顯示數據對應段碼
MOV P0,A ;段碼放入P1口
LCALL DELAY1MS ;顯示1MS
INC R1 ;指向下一地址
MOV A,R5 ;掃描控制字放入A
JNB ACC.5,ENDOUT ;掃到第六位時結束
RL A ;A中數據循環左移
MOV R5,A ;放回R5內
AJMP PLAY ;跳回PLAY循環
ENDOUT: SETB P2.5 ;一次顯示結束,P2口復位
MOV P0,#0FFH ;P0口復位
RET ;子程序返回
TAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,7FH,0B7H,0FFH
;共陽段碼表 "0""1""2" "3""4""5""6""7" "8""9"".""=""不亮"
;
;**************************************************************
; 延時程序
;**************************************************************
;
;1MS延時程序,LED顯示程序用
DELAY1MS: MOV R6,#2
DL1: MOV R7,#248
DL2: DJNZ R7,DL2
DJNZ R6,DL1
RET
END ;程序結束
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -