?? bikespeed.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 + -