📄 跑步机.asm
字号:
CALL DISPLAY
JNB F_CLR,MLP5
JMP MCLR
MLP5: JB SW_START,MLP6
JMP MAIN
MLP6: CLR F_RUNEN
MOV NUM_RUN,#0
MOV R0,#SET_TIMEH
MOV R1,#SET_TIMEL
MOV A,@R0
ADD A,@R1
JNZ MLP7
MOV DISM_TIME,#0
MLP7: MOV R0,#SET_CALOL
MOV R1,#SET_CALOH
MOV A,@R0
ADD A,@R1
JNZ MLP8
MOV DISM_CALO,#0
MLP8: MOV R0,#SET_DISL
MOV R1,#SET_DISH
MOV A,@R0
ADD A,@R1
JNZ MLP9
MOV DISM_DIS,#0
MLP9: JMP MSTAND
;----------------------------------------------------------
MSTAND:
CALL SWCLR
SETB F_BUEN
CLR F_BLK_TIM
CLR F_BLK_DIS
CLR F_BLK_CALO
CLR F_PAU
CLR F_END
CLR F_BLK_SPD
MOV CNT_STA,#5
SETB F_STAND
PUSH NUM_RUN
PUSH DISM_TIME
MOV DISM_SPD,#0
MOV DISM_TIME,#2
MOV NUM_RUN,#20
MSTAND1:CALL DISPLAY
SETB PTST
JNB PTST,MSTAND2
JMP MAIN
MSTAND2:
JB F_STAND,MSTAND1
POP DISM_TIME
POP NUM_RUN
;----------------------------------------------------------
MSTA:
CALL SWCLR
SETB F_GO
CLR F_GOOD
SETB F_SCAN
SETB F_BLK_RUN
MSTA1: SETB F_START
MOV CNT_BUS,#5
SETB F_BUENQ
CLR F_BUEN
CLR F_BUENS
MSTA2: JB F_BUENQ,MSTA2
SETB F_SPD_DISF
MOV A,CNT_DAT_PRO
ADD A,#BUFADD1
MOV R0,A
MOV R1,#SPEED
MOV A,@R0
MOV @R1,A
MOV A,R0
ADD A,#16
MOV R0,A
MOV R1,#INCL
MOV A,@R0
MOV @R1,A
CALL DC2AMPL
MSTA5:
CALL SWTSPD
CALL C_SPDSET
CALL DISPLAY
JB F_DAT_OVER,MSTA6
JB F_SET_OVER,MSTA7
JB SW_STOP,MSTA8
JB SW_START,MSTA8
JB F_ERR,MSTA9
SETB PTST
JB PTST,MSTA9
JMP MSTA5
MSTA6: CLR F_DAT_OVER
INC CNT_DAT_PRO
MOV A,CNT_DAT_PRO
CJNE A,#16,MSTA61
MOV CNT_DAT_PRO,#0
CLR C
MOV A,CNT_MODE
SUBB A,#2
JNC MSTA62
MSTA61: JMP MSTA1
MSTA62: JMP MEND
MSTA7: JMP MEND
MSTA8: JMP MSTOP
MSTA9: JMP MAIN
;----------------------------------------------------------
MEND:
SETB F_SCAN
SETB F_END
SETB F_GOOD
MOV CNT_BUS,#10
SETB F_BUENS
JMP MSTOP1
;----------------------------------------------------------
MSTOP:
SETB F_BUEN
SETB F_SCAN
SETB F_PAU
MSTOP1:
CLR F_GO
CLR F_BLK_RUN
MOV R0,#SPEED
MOV @R0,#0
MSTOP2: SETB PTST
JB PTST,MSTOP7
CALL C_SPDSET
CALL DISPLAY
MOV A,C_SPD
JNZ MSTOP2
MOV TM_CLR,#0
CLR F_CLRS
CLR F_CLR
CLR F_START
SETB F_BLK_SPD
MOV A,#10
CALL DELAY
MOV A,#10
CALL DELAY
JB SW_STOP,MSTOP6
CALL SWCLR
MSTOP3: CALL JYTST
CALL SCANTST
CALL DISPLAY
MOV A,#3
JNB F_PAU,MSTOP4
JB SW_START,MSTOP5
JB F_CLR,MSTOP6
MOV A,#2
JMP MSTOP41
MSTOP4:
JB F_CLRS,MSTOP6
MSTOP41:MOV DISM_SPD,A
SETB PTST
JB PTST,MSTOP7
JMP MSTOP3
MSTOP5: JMP MSTAND
MSTOP6: JMP MCLR
MSTOP7: JMP MAIN
;----------------------------------------------------------
SCANTST:
RET
SCANTEND:
;----------------------------------------------------------
C_SPDSET:
CLR C
MOV R0,#SPEED
MOV A,C_SPD
SUBB A,@R0
JZ C_SPDSETEND
C_SPDSET1:
JNB F_SPDSET,C_SPDSETEND
JNC C_SPDSET2
INC C_SPD
JMP C_SPDSET3
C_SPDSET2:
DEC C_SPD
C_SPDSET3:
CLR F_SPDSET
MOV A,C_SPD
MOV B,#5
DIV AB
MOV SPD_D,A
C_SPDSETEND:
RET
;----------------------------------------------------------
;测脂模式下的模式按键检测
FATMTST:
JNB SW_MODE,FATMTSTEND
CLR SW_MODE
SETB F_BUEN
MOV A,CNT_BMI
CJNE A,#4,FATMTST1
RET
FATMTST1:
INC CNT_BMI
RET
FATMTSTEND:
;----------------------------------------------------------
LMTFAT:
MOV A,CNT_BMI
CJNE A,#0,LFT1
JMP LMTSEX
LFT1: CJNE A,#1,LFT2
JMP LMTAGE
LFT2: CJNE A,#2,LFT3
JMP LMTHHT
LFT3: JMP LMTWHT
;========================================================
;调整性别
LMTSEX:
JNB F_ADD,LMTSEX1
CLR F_ADD
SETB F_BUEN
MOV SEX,#1
JMP LMTSEXEND
LMTSEX1:
JNB F_SUB,LMTSEXEND
CLR F_SUB
SETB F_BUEN
MOV SEX,#2
LMTSEXEND: RET
;======================================================
;调整年龄
LMTAGE:
JNB F_ADD,LMTAGE1
CLR F_ADD
MOV A,AGE
CJNE A,#99,LMTAGE0
JMP LMTAGEEND
LMTAGE0:SETB F_BUEN
INC AGE
JMP LMTAGEEND
LMTAGE1:JNB F_SUB,LMTAGEEND
CLR F_SUB
MOV A,AGE
CJNE A,#10,LMTAGE2
JMP LMTAGEEND
LMTAGE2:DEC AGE
SETB F_BUEN
LMTAGEEND:
RET
;=======================================================
LMTHHT:
JNB F_ADD,LMTHHT1
CLR F_ADD
MOV A,HHT
CJNE A,#240,LMTHHT0
JMP LMTHHTEND
LMTHHT0:SETB F_BUEN
INC HHT
JMP LMTHHTEND
LMTHHT1:JNB F_SUB,LMTHHTEND
CLR F_SUB
MOV A,HHT
CJNE A,#100,LMTHHT2
JMP LMTHHTEND
LMTHHT2:DEC HHT
SETB F_BUEN
LMTHHTEND:
RET
;=====================================================
LMTWHT:
JNB F_ADD,LMTWHT1
CLR F_ADD
MOV A,WHT
CJNE A,#160,LMTWHT0
JMP LMTWHTEND
LMTWHT0:SETB F_BUEN
INC WHT
JMP LMTWHTEND
LMTWHT1:JNB F_SUB,LMTWHTEND
CLR F_SUB
MOV A,WHT
CJNE A,#20,LMTWHT2
JMP LMTWHTEND
LMTWHT2:DEC WHT
SETB F_BUEN
LMTWHTEND:
RET
;-----------------------------------------------------
;体质指数计算
;((W*100/H)*100/H)+SEX+AGE/25
;体重单位==KG
;身高单位==CM
;偏廋<19
;正常19--26
;超重26--30
;肥胖>30
BMISET:
MOV A,WHT
MOV B,#100
MUL AB
MOV R4,B
MOV R5,A
MOV R6,#0
MOV R7,HHT
CALL DIVI16
MOV A,R5
MOV B,#100
MUL AB
MOV R4,B
MOV R5,A
MOV R6,#0
MOV R7,HHT
CALL DIVI16
MOV A,R5
ADD A,SEX
MOV BMI,A
DEC BMI
MOV A,AGE
MOV B,#26
DIV AB
ADD A,BMI
MOV BMI,A
RET
;----------------------------------------------------------
;模式/程式按键检测
MODETST:
JNB SW_MODE,PROTST
MOV A,CNT_MODE
CLR C
SUBB A,#3
JNC MODETSTEND
CLR SW_MODE
SETB F_BUEN
INC CNT_MODE
MOV A,CNT_MODE
CLR C
SUBB A,#3
JC MODETST1
MOV CNT_MODE,#0
MODETST1:
JMP MODETSTS
PROTST: JNB SW_PRO,MODETSTEND
CLR SW_PRO
SETB F_BUEN
MOV A,CNT_MODE
CLR C
SUBB A,#3
JNC PROTST1
MOV CNT_MODE,#2
PROTST1:
CLR C
INC CNT_MODE
MOV A,CNT_MODE
SUBB A,#16
JC MODETSTS
MOV CNT_MODE,#0
MODETSTS:
CALL SETLRES
CALL SPD2RAM
MOV TM_PUL,#0
CLR F_EN_PUL
MODETSTEND:
RET
;----------------------------------------------------------
FLZTST:
RET
; JNB SW_FLZ,FLZTEND
; SETB F_BUEN
; CLR SW_FLZ
; CPL FLZ
FLZTEND:RET
;----------------------------------------------------------
JYTST:
RET
; JNB SW_JY,JYTEND
; CLR SW_JY
; CPL JY
; SETB F_BUEN
JYTEND: RET
;----------------------------------------------------------
;内置程式查表头
;入口: CNT_MODE
P2TAB:
CLR C
MOV A,CNT_MODE
SUBB A,#3
JNC P2T0
CLR C
MOV A,LSPD
CJNE A,#10,P2TA
MOV DPTR,#TABV00
RET
P2TA: MOV DPTR,#TABV0
RET
P2T0: MOV R0,A
CJNE R0,#0,P2T1
MOV DPTR,#TABV1
RET
P2T1: CJNE R0,#1,P2T2
MOV DPTR,#TABV2
RET
P2T2: CJNE R0,#2,P2T3
MOV DPTR,#TABV3
RET
P2T3: CJNE R0,#3,P2T4
MOV DPTR,#TABV4
RET
P2T4: CJNE R0,#4,P2T5
MOV DPTR,#TABV5
RET
P2T5: CJNE R0,#5,P2T6
MOV DPTR,#TABV6
RET
P2T6: CJNE R0,#6,P2T7
MOV DPTR,#TABV7
RET
P2T7: CJNE R0,#7,P2T8
MOV DPTR,#TABV8
RET
P2T8: CJNE R0,#8,P2T9
MOV DPTR,#TABV9
RET
P2T9: CJNE R0,#9,P2T10
MOV DPTR,#TABV10
RET
P2T10: CJNE R0,#10,P2T11
MOV DPTR,#TABV11
RET
P2T11: MOV DPTR,#TABV12
RET
;----------------------------------------------------------
;当前速度与扬升移入RAM
CSPD2RAM:
MOV A,CNT_MODE
CLR C
SUBB A,#3
JC CSI2RAM_MODE
CSI2RAM_PRO:
MOV A,CNT_DAT_PRO
ADD A,#BUFADD1
MOV R2,A
CSI2RAM1:
MOV A,R2
MOV R0,A
MOV R1,#SPEED
MOV A,@R1
MOV @R0,A
MOV A,#16
ADD A,R2
MOV R0,A
MOV R1,#INCL
MOV A,@R1
MOV @R0,A
RET
CSI2RAM_MODE:
MOV R2,#BUFADD1
CSI2RAM_M1:
MOV A,R2
MOV R0,A
MOV R1,#SPEED
MOV A,@R1
MOV @R0,A
MOV A,#16
ADD A,R2
MOV R0,A
MOV R1,#INCL
MOV A,@R1
MOV @R0,A
INC R2
CJNE R2,#BUFADD2,CSI2RAM_M1
RET
;----------------------------------------------------------
;程式的速度与扬升值移入RAM
SPD2RAM:
CALL P2TAB
MOV R0,#BUFADD1
MOV R3,#0
S2R1: MOV A,R3
MOVC A,@A+DPTR
MOV @R0,A
INC R3
INC R0
CJNE R0,#BUFADD3,S2R1
RAM2SPD:MOV A,CNT_DAT_PRO
ADD A,#BUFADD1
MOV R0,A
MOV R1,#SPEED
MOV A,@R0
MOV @R1,A
MOV A,#16
ADD A,R0
MOV R0,A
MOV R1,#INCL
MOV A,@R0
MOV @R1,A
RET
;----------------------------------------------------------
;模式参数初始化
SETLRES:
MOV R0,#SET_TIMEH
MOV @R0,#0
MOV R0,#SET_DISL
MOV R1,#SET_DISH
MOV @R0,#0
MOV @R1,#0
MOV R0,#SET_CALOL
MOV R1,#SET_CALOH
MOV @R0,#0
MOV @R1,#0
SETLR0: MOV A,CNT_MODE
CLR C
SUBB A,#3
JC SETLRESEND
SETLR3: MOV R0,#SET_TIMEH
MOV @R0,#30
SETLRESEND:
RET
;----------------------------------------------------------
;加减键设置程式/模式运动时间
PTMSET:
MPTSET:
MOV R0,#SET_TIMEH
JNB F_ADD,PTS5
CLR F_ADD
SETB F_STPBLK
MOV A,@R0
JNZ PTS0
MOV @R0,#8
SETB F_BUEN
MOV A,@R0
MOV L_PRODAT,A
JMP PTSEND
PTS0: CLR C
SUBB A,#99 ;极值判断
JNC PTS1 ;大于转
INC @R0
SETB F_BUEN
MOV A,@R0
MOV L_PRODAT,A
JMP PTSEND
PTS1: JB F_SOVER,PTSEND
SETB F_SOVER
SETB F_BUEN
JMP PTSEND
PTS5: JNB F_SUB,PTSEND
CLR F_SUB
SETB F_STPBLK
MOV A,@R0
CLR C
SUBB A,#9
JC PTS1
DEC @R0
SETB F_BUEN
MOV A,@R0
MOV L_PRODAT,A
PTSEND: RET
;--------------------------------------------------------
;模式热量参数设定
MPCSET:
MOV R0,#SET_CALOH
MOV R1,#SET_CALOL
JNB F_ADD,MPCS5
CLR F_ADD
SETB F_STPBLK
MOV A,@R0
JNZ MPCS0
MOV A,@R1
JNZ MPCS0
MOV @R0,#0
MOV @R1,#10
SETB F_BUEN
JMP MPCSEND
MPCS0: CLR C
MOV A,@R1
SUBB A,#0E8H ;极值判断
MOV A,@R0
SUBB A,#03H
JNC MPCS1 ;大于转
MOV A,#1
ADD A,@R1
MOV @R1,A
MOV A,#0H
ADDC A,@R0
MOV @R0,A
SETB F_BUEN
JMP MPCSEND
MPCS1: JB F_SOVER,MPCSEND
SETB F_SOVER
SETB F_BUEN
JMP MPCSEND
MPCS5: JNB F_SUB,MPCSEND
CLR F_SUB
SETB F_STPBLK
CLR C
MOV A,@R1
SUBB A,#11
MOV A,@R0
SUBB A,#0
JC MPCS1
CLR C
MOV A,@R1
SUBB A,#1
MOV @R1,A
MOV A,@R0
SUBB A,#0H
MOV @R0,A
SETB F_BUEN
MPCSEND: RET
;---------------------------------------------------------
;模式里程参数设定
MPDSET:
MOV R0,#SET_DISH
MOV R1,#SET_DISL
JNB F_ADD,MPDS5
CLR F_ADD
SETB F_STPBLK
MOV A,@R0
JNZ MPDS0
MOV A,@R1
JNZ MPDS0
MOV @R0,#0
MOV @R1,#50
SETB F_BUEN
JMP MPDSEND
MPDS0: CLR C
MOV A,@R1
SUBB A,#010H ;极值判断
MOV A,@R0
SUBB A,#027H
JNC MPDS1 ;大于转
MOV A,#10
ADD A,@R1
MOV @R1,A
MOV A,#0H
ADDC A,@R0
MOV @R0,A
SETB F_BUEN
JMP MPDSEND
MPDS1: JB F_SOVER,MPDSEND
SETB F_SOVER
SETB F_BUEN
JMP MPDSEND
MPDS5: JNB F_SUB,MPDSEND
CLR F_SUB
SETB F_STPBLK
CLR C
MOV A,@R1
SUBB A,#60
MOV A,@R0
SUBB A,#0
JC MPDS1
CLR C
MOV A,@R1
SUBB A,#10
MOV @R1,A
MOV A,@R0
SUBB A,#0H
MOV @R0,A
SETB F_BUEN
MPDSEND: RET
;-----------------------------------------------------------
DELAY:
MOV DLYCNT,#0
CJNE A,DLYCNT,$
RET
;-----------------------------------------------------------------
CLRALL:
CALL SCLR
MOV A,#10
CALL DELAY
CALL SWCLR
RET
;-----------------------------------------------------------------
;所有按键清0
;-----------------------------------------------------------------
SWCLR:
MOV A,#0H
MOV FLAG_SW,A
MOV FLAG_SW1,A
CLR F_ADD
CLR F_SUB
CLR F_UP
CLR F_DWN
RET
;----------------------------------------------------------
;功能:双字节二进制无符号数除法
;入口条件:被除数在R2、R3、R4、R5中,除数在R6、R7中。
;出口信息:OV=0 时,双字节商在R2、R3中,OV=1 时溢出。
;影响资源:PSW、A、B、R1~R7 堆栈需求: 2字节
;----------------------------------------------------------
DIVI16:
DIVD: MOV R2,#0
MOV R3,#0
DVD1: MOV B,#10H ;计算双字节商
DVD2: CLR C ;部分商和余数同时左移一位
MOV A,R5
RLC A
MOV R5,A
MOV A,R4
RLC A
MOV R4,A
MOV A,R3
RLC A
MOV R3,A
XCH A,R2
RLC A
XCH A,R2
MOV F0,C ;保存溢出位
CLR C
SUBB A,R7 ;计算(R2R3-R6R7)
MOV R1,A
MOV A,R2
SUBB A,R6
ANL C,/F0 ;结果判断
JC DVD3
MOV R2,A ;够减,存放新的余数
MOV A,R1
MOV R3,A
INC R5 ;商的低位置一
DVD3: DJNZ B,DVD2 ;计算完十六位商(R4R5)
MOV A,R4 ;将商移到R2R3中
MOV R2,A
MOV A,R5
MOV R3,A
RET
;--------------------------------------------------------------------
;速度值转化为里程与卡路里计数常数
;--------------------------------------------------------------------
DC2AMPL:
MOV R4,#08CH
MOV R5,#0A0H
MOV R6,#0
MOV R1,#SPEED
MOV A,@R1
MOV R7,A
CALL DIVI16 ;求里程比较值
MOV DAMPH,R4
MOV DAMPL,R5
MOV R4,#02EH
MOV R5,#0E0H
MOV R6,#0
MOV R1,#SPEED
MOV A,@R1
MOV R7,A
CALL DIVI16
MOV CAMPH,R4
MOV CAMPL,R5
RET
;---------------------------------------------------------------------
;加减按键标志处理:
;主要用于运动中调速
;---------------------------------------------------------------------
SWTSPD:
MOV R0,#SPEED
MOV A,#0
JNB SW_2KM,SWTSP1
MOV A,#20
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -