⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 跑步机.asm

📁 本程式为跑步机电子表显示的完整程式,有仔细的注解
💻 ASM
📖 第 1 页 / 共 4 页
字号:
	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 + -