📄 里程计数.asm
字号:
NOP
CLR VSCL
SETB VSDA
RET
MNACK: SETB VSDA
SETB VSCL
NOP
NOP
NOP
NOP
CLR VSCL
CLR VSDA
RET
CACK: SETB VSDA
SETB VSCL
CLR F0
MOV C,VSDA
JNC CEND
SETB F0
CEND: CLR VSCL
RET
WRBYT: MOV R0,#08H
WLP: RLC A
JC WR1
AJMP WR0
WLP1: DJNZ R0,WLP
RET
WR1: SETB VSDA
SETB VSCL
NOP
NOP
NOP
NOP
CLR VSCL
CLR VSDA
AJMP WLP1
WR0: CLR VSDA
SETB VSCL
NOP
NOP
NOP
NOP
CLR VSCL
AJMP WLP1
RDBYT: MOV R0,#08H
RLP: SETB VSDA
SETB VSCL
MOV C,VSDA
MOV A,R2
RLC A
MOV R2,A
CLR VSCL
DJNZ R0,RLP
RET
WRNBYT: MOV R3,NUMBYT
LCALL STA
MOV A,SLA
LCALL WRBYT
LCALL CACK
JB F0,WRNBYT
MOV R1,#MTD
WRDA: MOV A,@R1
LCALL WRBYT
LCALL CACK
JB F0,WRNBYT
INC R1
DJNZ R3,WRDA
LCALL STOP
RET
RDNBYT: MOV R3,NUMBYT
LCALL STA
MOV A,SLA
LCALL WRBYT
LCALL CACK
JB F0,RDNBYT
RDN: MOV R1,#MRD
RDN1: LCALL RDBYT
MOV @R1,A
DJNZ R3,ACK
LCALL MNACK
LCALL STOP
RET
ACK: LCALL MACK
INC R1
SJMP RDN1
;
;;;;;;;;;;;;;;;;;;;;
;;DISPLAY PROGRAM ;;
;;;;;;;;;;;;;;;;;;;;
; 显示程序。显示BCD码在70H-73H单元内,采用共阴LED数码管
DISPLAY: MOV R1,#70H ;显示单元首址
MOV R2,#0FEH ;扫描字
PLAY: MOV A,R2 ;扫描字入A
MOV P2,A ;放到端口
MOV A,@R1 ;取显示数据
ANL A,#0FH ;去掉高四位(为0)
MOV DPTR,#TAB ;取段码表首址
MOVC A,@A+DPTR ;查显示数据对应段码
MOV P0,A ;段码输出
LCALL DL1MS ;点亮1毫秒
INC R1 ;指向下一显示数据地址
MOV A,R2 ;取扫描字
JNB ACC.3,ENDOUT ;已扫描到第四位,转ENDOUT退出
RL A ;循环左移
MOV R2,A ;放回R2
AJMP PLAY ;转PLAY循环
ENDOUT: SETB P2.0 ;关扫描
SETB P2.1 ;关扫描
SETB P2.2 ;关扫描
SETB P2.3 ;关扫描
RET ;扫描结束
;共阴段码表(可显示0-F)
TAB: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H
DB 7FH,6FH,77H,7CH,39H,5EH,79H,71H
DB 00H
;
;;;;;;;;;;;;;;;;;;;;
;;SSS PROGRAM ;;
;;;;;;;;;;;;;;;;;;;;
; 里程处理程序,将自行车圈数据换算成公里数
SSS: MOV 19H,#64H ;除数最高位赋值
MOV 18H,#00H ; 除数赋值
MOV 17H,#00H ; 除数赋值
MOV 16H,#00H ; 除数赋值
MOV 11H,#00H ; 被除数赋值
MOV 12H,#00H ; 被除数赋值
MOV 13H,62H ; 被除数赋值
MOV 14H,61H ; 被除数赋值
MOV 15H,60H ; 被除数赋值
LCALL DIVST ; 调除法程序
LCALL BCDST ; 调二进制转BCD码程序
MOV A,25H ; 结果处理,将25H数移入A
ANL A,#0FH ; 将高四位置为0
MOV 70H,A ; 放入70H单元
MOV A,25H ; 25H数移入A
SWAP A ; 高低四位交换
ANL A,#0FH ; 将高四位置为0
MOV 71H,A ; 放入71H单元
MOV A,24H ; 24H数移入A
ANL A,#0FH ; 将高四位置为0
MOV 72H,A ; 放入72H单元
MOV A,24H ; 24H数移入A
SWAP A ; 高低四位交换
ANL A,#0FH ; 将高四位置为0
MOV 73H,A ; 放入73H单元
RET ;子程序返回
;
;
;;;;;;;;;;;;;;;;;;;;
;;VVV PROGRAM ;;
;;;;;;;;;;;;;;;;;;;;
; 时速处理程序,最大显示速度为99公里/小时(用作自行车)
VVV: MOV 18H,68H ; 除数赋值
MOV 17H,69H ; 除数赋值
MOV 16H,6AH ; 除数赋值
MOV 11H,#00H ; 被除数赋值
MOV 12H,#00H ; 被除数赋值
MOV 13H,#36H ; 被除数赋值
MOV 14H,#0EEH ; 被除数赋值
MOV 15H,#80H ; 被除数赋值
LCALL DIVST ; 调除法程序
MOV 14H,#00H ; 舍去一位
LCALL BCDST ;二进制转BCD码程序
MOV A,25H ;以下将速度值放入显示单元
ANL A,#0FH ;高四位为0
MOV 70H,A ;放入70H内
MOV A,25H ;再取数
SWAP A ;高低四交换
ANL A,#0FH ;高四位为0
MOV 71H,A ;放入71H内
MOV 72H,#00H ;72H为0(高二位LED显示0)
MOV 73H,#00H ;73H为0
RET ;子程序返回
;
;
;;;;;;;;;;;;;;;;;
; DL1MS ;;
;;;;;;;;;;;;;;;;;
;1毫秒延时程序,LED点亮用
DL1MS: MOV R6,#14H
DL1: MOV R7,#19H
DL2: DJNZ R7,DL2
DJNZ R6,DL1
RET
;
;;;;;;;;;;;;;;;;;
; DL0.5S ;;
;;;;;;;;;;;;;;;;;
;出错闪烁用延时(255毫秒)
DL5S: MOV R5,#0FFH
DL3: LCALL DL1MS
DJNZ R5,DL3
RET
;;;;;;;;;;;;;;;;;
; 除法子程序 ;;
;;;;;;;;;;;;;;;;;
;除法子程序,用作四位除法,除数在16H-19H,被除数在11H-15H。
DIVST: CLR C ;运算开始
MOV A,13H
SUBB A,18H
MOV A,12H
SUBB A,17H
MOV A,11H
SUBB A,16H
JNC LOOP4
MOV B,#10H
NDIV1: CLR C
MOV A,15H
RLC A
MOV 15H,A
MOV A,14H
RLC A
MOV 14H,A
MOV A,13H
RLC A
MOV 13H,A
MOV A,12H
RLC A
MOV 12H,A
MOV A,11H
RLC A
MOV 11H,A
MOV F0,C
CLR C
MOV A,13H
SUBB A,18H
MOV 1AH,A
MOV A,12H
SUBB A,17H
MOV 19H,A
MOV A,11H
SUBB A,16H
JB F0,NDIV2
JC NDIV3
NDIV2: MOV 11H,A
MOV A,19H
MOV 12H,A
MOV A,1AH
MOV 13H,A
INC 15H
NDIV3: DJNZ B,NDIV1
CLR F0
DIVEND: RET
LOOP4: SETB F0
SJMP DIVEND
;
;;;;;;;;;;;;;;;;; ;;
; BCD码转换程序 ;
;;;;;;;;;;;;;;;;; ;;
;将14H、15H单元内数据转换成十进制BCD码放在24H、25H单元内。
BCDST: MOV R7,#10H
CLR C
MOV 25H,#00H
MOV 24H,#00H
KKK: MOV A,15H
RLC A
MOV 15H,A
MOV A,14H
RLC A
MOV 14H,A
MOV A,25H
ADDC A,25H
DA A
MOV 25H,A
MOV A,24H
ADDC A,24H
DA A
MOV 24H,A
DJNZ R7,KKK
RET
;
END ;程序结束
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -