📄 bike.asm
字号:
;******************OCM4x8C串口******************
CS EQU P1.0
STD EQU P1.1
SCLK EQU P1.2 ;液晶控制口定义
RS_STU EQU 20H.0
flag equ 20h.1
flag1 equ 20h.2
ACK equ 20h.3
flagx equ 20h.4
qidong equ 20h.5
FLAG3 DATA 23H
PFA BIT FLAG3.7
PFB BIT FLAG3.6
PFC BIT FLAG3.5
PFD BIT FLAG3.4
READY BIT FLAG3.3
COUNT EQU 34H
DA_IN EQU 35H
WR_COUNT1 EQU 36H
WR_COUNT2 EQU 37H
SLA EQU 5eH
SUBA EQU 5fH
SCL bit P1.4
SDA bit P1.5
;***********************************************
ORG 0000H ;程序执行开始地址
LJMP main ;跳至START
ORG 0003H ;外中断0中断程序入口
LJMP INTEX0 ;跳至INTEX0中断服务程序
ORG 000BH ;定时器T0中断程序入口
ljmp intt0 ;中断返回
ORG 0013H ;外中断1中断入口
reti
; LJMP INTEX1 ; 跳至INTEX1中断服务程序
ORG 001BH ; 定时器T1中断程序入口
LJMP INTT1 ; 跳至INTT1中断服务程序
ORG 0023H ;串口中断入口地址
RETI ;中断返回
ORG 002BH ;定时器T2中断入口地址
RETI
main: ; call qing_dangqian_licheng
; call qing_shangci_licheng
; call qing_zong_licheng
call du_dangqian_licheng
mov 40h,74h
mov 41h,75h
mov 42h,76h
call du_zong_licheng
mov 43h,77h
mov 44h,78h
mov 45h,79h
MOV TMOD,#11H ;T1为16位外部控制定时器
SETB PX0 ;外中断0优先级为1
setb IT0 ;外中断0用边沿触发
SETB EA ;开中断允许
SETB EX0 ;开外中断0
CLR A ;清A
mov 4fh,A
MOV 20H,A ;清内存中特定单元
MOV 6CH,A ;
MOV 6DH,A ;
MOV 70H,A ;
MOV 71H,A ;
MOV 72H,A ;
MOV 73H,A ;
MOV 60H,A ;
MOV 61H,A ;
MOV 62H,A ;
MOV 63H,A ; 清内存中特定单元
mov 00h,a
mov Tl1,a
mov TH1,a
MOV 68H,A ;内存置数据#0FFH
MOV 69H,A ; 内存置数据#0FFH
MOV 6AH,A ; 内存置数据#0FFH
MOV 6BH,A ; 内存置数据#0FFH
mov 6ch,a
mov 6dh,a
mov 6eh,a
mov 22h,#00
mov TH0,#00h ;重装定时器
mov TL0,#00h
CALL LCD_INIT
LCALL cls
lcall delay ;加延时,防止乱码
setb flag
;***********************************************
LGS1: MOV DPTR,#D_CHESU ;显示当前车速
MOV COUNT,#08H
MOV A,#80H
LCALL SEND_I
LGS11: CLR A
MOVC A,@A+DPTR
LCALL SEND_D
INC DPTR
DJNZ COUNT,LGS11
MOV DPTR,#D_JULI ;显示行驶距离
MOV COUNT,#08H
MOV A,#90H
LCALL SEND_I
LGS21: CLR A
MOVC A,@A+DPTR
LCALL SEND_D
INC DPTR
DJNZ COUNT,LGS21
fan_lu1:
jnb flag,fan_lu
MOV A,#84H
LCALL SEND_I
mov a,#30h
LCALL SEND_D
mov a,#2eh
LCALL SEND_D
MOV A,#85H
LCALL SEND_I
mov a,#30h
LCALL SEND_D
mov a,#30h
LCALL SEND_D
MOV A,#86H ;Km
LCALL SEND_I
mov a,#4bh
LCALL SEND_D
mov a,#6dh
LCALL SEND_D
MOV A,#87H ;/h
LCALL SEND_I
mov a,#2fh
LCALL SEND_D
MOV A,#68H
LCALL SEND_D
call delay
ljmp no_qi1
fan_lu: clr c
call delay
call sudu_jisuan
call delay
no_qi1:
JB P1.3,fan_lu1
call delay
jnb p1.3,$
LCALL cls
LCALL delay
LGK:
MOV DPTR,#D_SJULI ;显示上次行驶
MOV COUNT,#08H
MOV A,#80H
LCALL SEND_I
LGS31: CLR A
MOVC A,@A+DPTR
LCALL SEND_D
INC DPTR
DJNZ COUNT,LGS31
MOV DPTR,#D_ZONGLU ;显示总里程
MOV COUNT,#06H
MOV A,#90H
LCALL SEND_I
LGS41: CLR A
MOVC A,@A+DPTR
LCALL SEND_D
INC DPTR
DJNZ COUNT,LGS41
call jisuan_shangci_lucheng ;选择清除后,当前路程会记录到这个位置,当前的里程会归零
call jisuan_zonglicheng ;在第二行显示总里程数
tel_b: LCALL delay
jb P1.3,tel_qing
call delay
jnb p1.3,$
LCALL cls
LCALL delay
LJMP LGS1
tel_qing: LCALL delay
jb p1.7,tel_b
call confirm
LCALL delay
tel_nex_2:
jb p1.3,tel_nex_1
call juli_genghuan
jmp LGK
tel_nex_1:
jb p1.7,tel_nex_2
call cls
jmp LGK
confirm: MOV DPTR,#D_COM1 ;显示是否要删除
MOV COUNT,#10H
MOV A,#80H
LCALL SEND_I
COM11: CLR A
MOVC A,@A+DPTR
LCALL SEND_D
INC DPTR
DJNZ COUNT,COM11
MOV DPTR,#D_COM2 ;显示是--上 否--下
MOV COUNT,#10H
MOV A,#90H
LCALL SEND_I
COM21: CLR A
MOVC A,@A+DPTR
LCALL SEND_D
INC DPTR
DJNZ COUNT,COM21
RET
lucheng_jisuan:
mov 50h,40h ;预处理最低位圈数40h,结果指向30h
call yuchuli
mov 30h,52h
mov 31h,53h
mov 32h,54h
mov r0,#30h
lcall btof
mov 50h,41h ;预处理中间位圈数41h,结果指向36h
call yuchuli
mov 36h,52h
mov 37h,53h
mov 38h,54h
mov r0,#36h
lcall btof
mov 33h,#03h ;中间位乘于255,结果指向36h
mov 34h,#25h
mov 35h,#60h
mov r0,#33h
lcall btof
mov r0,#36h
mov r1,#33h
lcall fmul
mov r1,#30h ;中间位加上最低位的圈数,结果指向36h
lcall fadd
mov 50h,42h ;预处理最高位圈数42h,结果指向3ch
lcall yuchuli
mov 3ch,52h
mov 3dh,53h
mov 3eh,54h
mov r0,#3ch
lcall btof
mov 39h,#05h ;最高位乘于65630,结果指向3ch
mov 3ah,#65h
mov 3bh,#53h
mov r0,#39h
lcall btof
mov r0,#3ch
mov r1,#39h
lcall fmul
mov r0,#3ch ;前面的结果加上最高位,算出总共的圈数,结果指向36h
mov r1,#36h
lcall fadd
mov 30h,#01h ;轮圈的周长数据,指向30h
mov 31h,#20h
mov 32h,#90h
mov r0,#30h
lcall btof
mov r0,#3ch ;轮圈的周长乘于总圈数,算出总共的行驶距离,结果指向3ch
mov r1,#30h
lcall fmul
lcall ftob
mov a,3ch
subb a,#04h
jc xiaoyu_1km
ljmp dayu_1km
xiaoyu_1km: clr c
mov a,3ch
cjne a,#03h,xiaoyu100m
call qing_wei ;后四个字位置清除
MOV A,#94H
LCALL SEND_I
mov a,3dh
swap a
anl a,#0fh
add a,#30h
LCALL SEND_D
mov a,3dh
anl a,#0fh
add a,#30h
LCALL SEND_D
MOV A,#95H
LCALL SEND_I
mov a,3eh
swap a
anl a,#0fh
add a,#30h
LCALL SEND_D
MOV A,#96H
LCALL SEND_I
mov a,#0c3h
LCALL SEND_D
mov a,#0d7h
LCALL SEND_D
ljmp out_lucheng_jisuan
xiaoyu100m:
call qing_wei ;后四个字位置清除
mov a,3ch
cjne a,#02h,xiaoyu10m
MOV A,#94H
LCALL SEND_I
mov a,3dh
swap a
anl a,#0fh
add a,#30h
LCALL SEND_D
mov a,3dh
anl a,#0fh
add a,#30h
LCALL SEND_D
MOV A,#95H ;米
LCALL SEND_I
mov a,#0c3h
LCALL SEND_D
mov a,#0d7h
LCALL SEND_D
ljmp out_lucheng_jisuan
xiaoyu10m: call qing_wei ;后四个字位置清除
MOV A,#94H
LCALL SEND_I
mov a,3dh
swap a
anl a,#0fh
add a,#30h
LCALL SEND_D
MOV A,#95H ;米
LCALL SEND_I
mov a,#0c3h
LCALL SEND_D
mov a,#0d7h
LCALL SEND_D
ljmp out_lucheng_jisuan
dayu_1km: mov a,3ch
cjne a,#04h,dayu_10Km
MOV A,#94H
LCALL SEND_I
mov a,3dh
swap a
anl a,#0fh
add a,#30h
LCALL SEND_D
mov a,3dh
anl a,#0fh
add a,#30h
LCALL SEND_D
MOV A,#95H
LCALL SEND_I
mov a,3eh
swap a
anl a,#0fh
add a,#30h
LCALL SEND_D
mov a,3eh
anl a,#0fh
add a,#30h
LCALL SEND_D
MOV A,#96H ;米
LCALL SEND_I
mov a,#0c3h
LCALL SEND_D
mov a,#0d7h
LCALL SEND_D
MOV A,#97H
LCALL SEND_I
mov a,#0a1h
LCALL SEND_D
mov a,#0a0h
LCALL SEND_D
jmp out_lucheng_jisuan
dayu_10Km: call qing_wei ;后四个字位置清除
MOV A,#94H
LCALL SEND_I
mov a,3dh
swap a
anl a,#0fh
add a,#30h
LCALL SEND_D
mov a,3dh
anl a,#0fh
add a,#30h
LCALL SEND_D
MOV A,#95H
LCALL SEND_I
mov a,#2eh
LCALL SEND_D
MOV A,#96H
LCALL SEND_I
mov a,3eh
swap a
anl a,#0fh
add a,#30h
LCALL SEND_D
mov a,3eh
anl a,#0fh
add a,#30h
LCALL SEND_D
MOV A,#97H ;Km
LCALL SEND_I
mov a,#4bh
LCALL SEND_D
mov a,#6dh
LCALL SEND_D
out_lucheng_jisuan:
ret
jisuan_shangci_lucheng:
call du_shangci_licheng
mov 50h,7ah ;预处理最低位圈数40h,结果指向30h
call yuchuli
mov 30h,52h
mov 31h,53h
mov 32h,54h
mov r0,#30h
lcall btof
mov 50h,7bh ;预处理中间位圈数41h,结果指向36h
call yuchuli
mov 36h,52h
mov 37h,53h
mov 38h,54h
mov r0,#36h
lcall btof
mov 33h,#03h ;中间位乘于255,结果指向36h
mov 34h,#25h
mov 35h,#60h
mov r0,#33h
lcall btof
mov r0,#36h
mov r1,#33h
lcall fmul
mov r1,#30h ;中间位加上最低位的圈数,结果指向36h
lcall fadd
mov 50h,7ch ;预处理最高位圈数42h,结果指向3ch
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -