📄 bike.asm
字号:
mov R1,#00h
MOV SLA,#0A0H
MOV SUBA,#00H
CALL IWRNBYTE
call delay5ms
mov R1,#00h
MOV SLA,#0A0H
MOV SUBA,#01H
CALL IWRNBYTE
call delay5ms
mov R1,#00h
MOV SLA,#0A0H
MOV SUBA,#02H
CALL IWRNBYTE
call delay5ms
ret
qing_zong_licheng:
mov R1,#00h
MOV SLA,#0A0H
MOV SUBA,#03H
CALL IWRNBYTE
call delay5ms
mov R1,#00h
MOV SLA,#0A0H
MOV SUBA,#04H
CALL IWRNBYTE
call delay5ms
mov R1,#00h
MOV SLA,#0A0H
MOV SUBA,#05H
CALL IWRNBYTE
call delay5ms
ret
qing_shangci_licheng:
mov R1,#00h
MOV SLA,#0A0H
MOV SUBA,#06H
CALL IWRNBYTE
call delay5ms
mov R1,#00h
MOV SLA,#0A0H
MOV SUBA,#07H
CALL IWRNBYTE
call delay5ms
mov R1,#00h
MOV SLA,#0A0H
MOV SUBA,#08H
CALL IWRNBYTE
call delay5ms
ret
; 里程计数程序,用外中断0实现,计数用60H-62H内存单元
INTEX0: PUSH ACC ; 累加器堆栈保护
PUSH PSW ;状态字堆栈保护
mov 6dh,#00h
clr TR0
SETB ET1 ;开定时中断T1
setb TR1 ;第一次进入中断才开始启动定时器1
CLR EX0 ;关外中断0
jb flag1,no_out
ljmp outex12 ;如果flag1为0,说明是奇数次进入中断
;如果为1,说明是偶数次进入中断,
;定时器的值可以作为测速的数据
no_out:
JNB flag,INTEX112 ;溢出标志为0转INTEX11
clr TR1
MOV TL1,#0FFH ;溢出时计时单元赋#0FFH(显示速度为零)
MOV TH1,#0FFH ;
MOV 6CH,#0FFH ;
MOV 68H,TL1 ;将时间计数值移入暂存单元68H-6BH
MOV 69H,TH1 ;
MOV 6AH,6CH ;
clr flag
ljmp outex12
INTEX112: clr TR1
inc 4fh
mov a,4fh
subb a,#9 ;每100米纪录一次数据
jc no_100mi
mov 4fh,#00h
mov R1,40h ;没有清除当前的里程记忆
MOV SLA,#0A0H
MOV SUBA,#00H
CALL IWRNBYTE
call delay5ms
mov R1,41h
MOV SLA,#0A0H
MOV SUBA,#01H
CALL IWRNBYTE
call delay5ms
mov R1,42h
MOV SLA,#0A0H
MOV SUBA,#02H
CALL IWRNBYTE
call delay5ms
mov R1,43h ;总里程记忆,16711680米为一个上限
MOV SLA,#0A0H
MOV SUBA,#03H
CALL IWRNBYTE
call delay5ms
mov R1,44h
MOV SLA,#0A0H
MOV SUBA,#04H
CALL IWRNBYTE
call delay5ms
mov R1,45h
MOV SLA,#0A0H
MOV SUBA,#05H
CALL IWRNBYTE
call delay5ms
no_100mi: clr c
MOV 68H,TL1 ;将时间计数值移入暂存单元68H-6BH
MOV 69H,TH1 ;
MOV 6AH,6CH ;
CLR A ;清A
MOV TL1,A ;计时单元置0
MOV TH1,A ;
MOV 6CH,A ;
CLR flag ;清溢出标志
cpl flag1
ljmp ex1out
outex12: cpl flag1
ex1out:
INC 40H ;圈加1
CLR A ;清A
CJNE A,40H,INTEX0OUT2 ;计数没溢出转INTEX0OUT
INC 41H ;溢出进位(41H加1)
CJNE A,41H,INTEX0OUT2 ; 计数没溢出转INTEX0OUT
INC 42H ; 溢出进位(42H加1)
INTEX0OUT2:
INC 43H ;圈加1
CLR A ;清A
CJNE A,43H,INTEX0OUT ;计数没溢出转INTEX0OUT
INC 44H ;溢出进位(44H加1)
CJNE A,44H,INTEX0OUT ;计数没溢出转INTEX0OUT
INC 45H ;溢出进位(45H加1)
INTEX0OUT:
call lucheng_jisuan
call delay
SETB EX0 ;开外中断0
SETB ET0 ;开定时中断T0
setb TR0
POP PSW ;状态字恢复
POP ACC
RETI
; T1计数器中断服务程序。
INTT1: PUSH ACC ;堆栈保护
PUSH PSW ;
INC 6CH ;6CH计时 单元加1
MOV A,6CH ;移入A
subb a,#128
jc INTT11
setb flag
clr TR1
INTT11: clr c
POP PSW ;恢复堆栈
POP ACC
RETI
;定时器0中断服务程序,定时50ms,溢出50次为2.5s作为一个计数周期,如果在一个计数周期内没有
;外部脉冲即认为车子停止
intt0: PUSH ACC ;堆栈保护
PUSH PSW ;
INC 6dH ;6dH计时单元加1
MOV A,6dH ;移入A
subb a,#128
jc INTT01
setb flag
INTT01: clr c
POP PSW ;恢复堆栈
POP ACC
reti
LCD_INIT:
MOV A,#34H ;34H--扩充指令操作
LCALL SEND_I
MOV A,#30H ;30H--基本指令操作
LCALL SEND_I
MOV A,#01H ;清除显示
LCALL SEND_I
LCALL DELAY2
LCALL DELAY2
MOV A,#06H ;指定在资料写入或读取时,光标的移动方向
LCALL SEND_I
MOV A,#0CH ;开显示,关光标,不闪烁
LCALL SEND_I
RET
cls: MOV A,#01H
LCALL SEND_I
ret
;***********************************************
SEND_D: SETB RS_STU ;写数据子程序
MOV DA_IN,A
LCALL SERIAL_WR
RET
SEND_I: CLR RS_STU ;写指令子程序
MOV DA_IN,A
LCALL SERIAL_WR
RET
;$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
;DA_IN: 数据或指令
;RS_STU: 数据指令选择
;WR_COUNT1: 计数器1
;WR_COUNT2: 计数器2
SERIAL_WR: PUSH ACC
MOV A,DA_IN
SETB CS
MOV WR_COUNT1,#05H
SETB STD ;1
SERIAL_WR1: CLR SCLK
SETB SCLK
DJNZ WR_COUNT1,SERIAL_WR1
CLR STD ;RW
CLR SCLK
SETB SCLK
JNB RS_STU,CLR_RS
SETB STD ;写数据
SJMP SETB_RS
CLR_RS: CLR STD ;写指令
SETB_RS: CLR SCLK
SETB SCLK
CLR STD ;0
CLR SCLK
SETB SCLK
MOV WR_COUNT1,#02H
SERIAL_WR2: MOV WR_COUNT2,#04H
SERIAL_WR21: RLC A
MOV STD,C
CLR SCLK
SETB SCLK
DJNZ WR_COUNT2,SERIAL_WR21
MOV WR_COUNT2,#04H
CLR STD ;0
SERIAL_WR22: CLR SCLK
SETB SCLK
DJNZ WR_COUNT2,SERIAL_WR22
DJNZ WR_COUNT1,SERIAL_WR2
CLR SCLK
CLR CS
LCALL DELAY2
POP ACC
RET
HBCD: MOV B,#100 ;分离出百位,存放在R3中
DIV AB
MOV R3,A
MOV A,#10 ;余数继续分离十位和个位
XCH A,B
DIV AB
SWAP A
ORL A,B ;将十位和个位拼装成BCD码
RET
FSDT: LCALL MVR0
LCALL RLN
LJMP MOV0
FADD: CLR F0
SJMP AS
FSUB: SETB F0
AS: LCALL MVR1
MOV C,F0
RRC A
XRL A,@R1
MOV C,ACC.7
ASN: MOV PFB,C
XRL A,@R0
RLC A
MOV F0,C
LCALL MVR0
LCALL AS1
MOV0: INC R0
INC R0
MOV A,R4
MOV @R0,A
DEC R0
MOV A,R3
MOV @R0,A
DEC R0
MOV A,R2
MOV C,PFA
MOV ACC.7,C
MOV @R0,A
CLR ACC.7
CLR OV
CJNE A,#3FH,MV01
SETB OV
MV01: MOV A,@R0
RET
MVR0: MOV A,@R0
MOV C,ACC.7
MOV PFA,C
MOV C,ACC.6
MOV ACC.7,C
MOV R2,A
INC R0
MOV A,@R0
MOV R3,A
INC R0
MOV A,@R0
MOV R4,A
DEC R0
DEC R0
RET
MVR1: MOV A,@R1
MOV C,ACC.7
MOV PFB,C
MOV C,ACC.6
MOV ACC.7,C
MOV R5,A
INC R1
MOV A,@R1
MOV R6,A
INC R1
MOV A,@R1
MOV R7,A
DEC R1
DEC R1
RET
AS1: MOV A,R6
ORL A,R7
JZ AS2
MOV A,R3
ORL A,R4
JNZ EQ1
MOV A,R6
MOV R3,A
MOV A,R7
MOV R4,A
MOV A,R5
MOV R2,A
MOV C,PFB
MOV PFA,C
AS2: RET
EQ1: MOV A,R2
XRL A,R5
JZ AS4
JB ACC.7,EQ3
MOV A,R2
CLR C
SUBB A,R5
JC EQ4
EQ2: CLR C
MOV A,R6
RRC A
MOV R6,A
MOV A,R7
RRC A
MOV R7,A
INC R5
ORL A,R6
JNZ EQ1
MOV A,R2
MOV R5,A
SJMP AS4
EQ3: MOV A,R2
JNB ACC.7,EQ2
EQ4: CLR C
LCALL RR1
ORL A,R3
JNZ EQ1
MOV A,R5
MOV R2,A
AS4: JB F0,AS5
MOV A,R4
ADD A,R7
MOV R4,A
MOV A,R3
ADDC A,R6
MOV R3,A
JNC AS2
LJMP RR1
AS5: CLR C
MOV A,R4
SUBB A,R7
MOV B,A
MOV A,R3
SUBB A,R6
JC AS6
MOV R4,B
MOV R3,A
LJMP RLN
AS6: CPL PFA
CLR C
MOV A,R7
SUBB A,R4
MOV R4,A
MOV A,R6
SUBB A,R3
MOV R3,A
RLN: MOV A,R3
ORL A,R4
JNZ RLN1
MOV R2,#0C1H
RET
RLN1: MOV A,R3
JB ACC.7,RLN2
CLR C
LCALL RL1
SJMP RLN
RLN2: CLR OV
RET
RL1: MOV A,R4
RLC A
MOV R4,A
MOV A,R3
RLC A
MOV R3,A
DEC R2
CJNE R2,#0C0H,RL1E
CLR A
MOV R3,A
MOV R4,A
MOV R2,#0C1H
RL1E: CLR OV
RET
RR1: MOV A,R3
RRC A
MOV R3,A
MOV A,R4
RRC A
MOV R4,A
INC R2
CLR OV
CJNE R2,#40H,RR1E
MOV R2,#3FH
SETB OV
RR1E: RET
FMUL: LCALL MVR0
MOV A,@R0
XRL A,@R1
RLC A
MOV PFA,C
LCALL MUL0
LJMP MOV0
MUL0: LCALL MVR1
MUL1: MOV A,R3
ORL A,R4
JZ MUL6
MOV A,R6
ORL A,R7
JZ MUL5
MOV A,R7
MOV B,R4
MUL AB
MOV A,B
XCH A,R7
MOV B,R3
MUL AB
ADD A,R7
MOV R7,A
CLR A
ADDC A,B
XCH A,R4
MOV B,R6
MUL AB
ADD A,R7
MOV R7,A
MOV A,B
ADDC A,R4
MOV R4,A
CLR A
RLC A
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -