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

📄 cm-941.asm

📁 本程序是测试脂肪的程序,利用他可以测试一个人的身上有多少脂肪,但是精度不是很高的
💻 ASM
📖 第 1 页 / 共 5 页
字号:
.chip TM8726
.data
;00H
TempR0		EQU		00H
TempR1		EQU		01H
TempR2		EQU		02H
TempR3		EQU		03H
TempR4		EQU		04H
TempR5		EQU		05H
TempR6		EQU		06H				;temporary registers

T_SaveA		EQU		07H	
T_SaveFlgC_Z	EQU	08H				;used for tmr2 int

P_SaveA		EQU		09H				;used for pre_divider int
P_SaveFlgC_Z	EQU	0AH
R_2Hz		EQU		0BH
T_2Hz		EQU		0CH

s1			EQU		0DH
s2			EQU		0EH
s3			EQU		0FH
;-----------------------
Age1		EQU		10H				;parameters of measure fat 
Age2		EQU		11H
Height1		EQU		12H	
Height2		EQU		13H
Height3		EQU		14H
Height4		EQU		15H

Weight1		EQU		16H
Weight2		EQU		17H
Weight3		EQU		18H
Weight4		EQU		19H	

SData1		EQU		1AH
SData2		EQU		1BH	
SData3		EQU		1CH
SData4		EQU		1DH
SData5		EQU		1EH

FatTest4_1	EQU		1FH
;-----------------------
Sec_L		EQU		20H				;clock
Sec_H		EQU		21H
Min_L		EQU		22H
Min_H		EQU		23H
Hr_L		EQU		24H
Hr_H		EQU		25H

TSec_L		EQU		26H				;timer
TSec_H		EQU		27H	
TMin_L		EQU		28H
TMin_H		EQU		29H	

AlmMin_L	EQU		2AH				;alarm
AlmMin_H	EQU		2BH
AlmHr_L		EQU		2CH
AlmHr_H		EQU		2DH
FatTest4	EQU		2EH
s8			EQU		2FH

;-------------Operation Registers
R_A0		EQU		30H
R_A1		EQU		31H
R_A2		EQU		32H
R_A3		EQU		33h
R_A4		EQU		34H
R_A5		EQU		35H
R_A6		EQU		36H
R_AP		EQU		37H

R_B0		EQU		38H 
R_B1		EQU		39H 
R_B2		EQU		3AH 
R_B3		EQU		3BH 
R_B4		EQU		3CH 
R_B5		EQU		3DH
R_B6		EQU		3EH 
R_BP		EQU		3FH

R_W0		EQU		40H
R_W1		EQU		41H
R_W2		EQU		42H
R_W3		EQU		43H
R_W4		EQU		44H
R_W5		EQU		45H
R_W6		EQU		46H
R_W7		EQU		47H
R_WP		EQU		48H
R_Error		EQU		49H
;----
FatTest1	EQU		4AH
FatTest2	EQU		4BH
FatTest3	EQU		4CH

FatTest1_1	EQU		4DH
FatTest2_1	EQU		4EH
FatTest3_1	EQU		4FH

;-----------------------
BMI1		EQU		50H
BMI2		EQU		51H
BMI3		EQU		52H

P_FAT1		EQU		53H
P_FAT2		EQU		54H
P_FAT3		EQU		55H

TestFatCnt	EQU		56H             ; Measure fat in 3 times 
FatLevel	EQU		57H

M_Fat2hz	EQU		58H
Delay5s		EQU		59H
MaxM_FatTm	EQU		5AH

Result1		EQU		5BH
Result2		EQU		5CH
Result3		EQU		5DH

Result4		EQU		5EH
s5			EQU		5FH
;-----------------------------------
BuzzCount	EQU		60H
Buzz16sCnt1	EQU		61H
Buzz16sCnt2	EQU		62H
Buzz60sCnt1	EQU		63H
Buzz60sCnt2	EQU		64H				
KeyS1		EQU		65H
KeyS2		EQU		66H				; time pass 60s after key isn't pressed and sys. return mainmode0 
KeyS		EQU		67H				; long key count
Keyms		EQU		68H
KeySound	EQU		69H				; keytone  62.5ms
R180ms1		EQU		6AH
R180ms2		EQU		6BH
Count1		EQU		6CH
Count2		EQU		6DH

s6			EQU		6EH
s7			EQU		6FH
;;;;;;;;;;;;;;;;
Pendulum1	EQU		70H
Pendulum2	EQU		71H	
Dummy		EQU		72H
DisplayR	EQU		73H
MainMode	EQU		74H
Mode1		EQU		75H
FatModeFlg 	EQU		76H             ;B0--SetUnitModeFlg ,B1--Unit Flg, B2--Fat test at Default status
M_FatFlg	EQU		77H

KeyValue1	EQU		78H
KeyValue2	EQU		79H
KeyDoneFlg	EQU		7AH
OptionR		EQU		7BH				;B0--EnableTmr2Flg , B1-- left /rightFlg ,B2--Timer running   B3--F/M Flg
AlmFlg		EQU		7CH				;B0--Enable Alm Fuc. , B1--Alm arrive ,B2--Tmr arrive

PortA		EQU		7DH
FlgSet_12Hr	EQU		7EH				;B0--12/24hr Flg,	B1--A key /T key pressed Flg, B2--Keytone type Flg
IntDummy	EQU		7FH
.endd

.code
		ORG		000H
		JMP		Start
			
		ORG		01CH
		JMP		PDRint
		
		ORG		020H
;-----------------------------------------------------
Timer2Int:
		FAST			
		STA     T_SaveA		
		MAF		T_SaveFlgC_Z
		TM2X	000000011B           ;(000)512  4*512/32.768 =62.5ms
;;;;;;;;
;ProcessKeySound		
		ANDI	FlgSet_12Hr,	4    ;Keytone type  
		JNZ		KeySoundType1
									 ;Normal Keytone
		LDA		KeySound
		JZ		HoldKeyCnt
		DEC*	KeySound
		JNZ		HoldKeyCnt
		ALM		0
		JMP		HoldKeyCnt           
KeySoundType1:						 ;keytone of timer start running
		DEC*	KeySound
		JB0		$+4
		JZ		KeySoundType1_1
		ALM		80h
		JMP		HoldKeyCnt
		ALM		0
		JMP		$+2				    		
KeySoundType1_1:
		ANDI*	FlgSet_12Hr,	1011B		
;;;;;;;;;;
HoldKeyCnt:		
		LDA		Keyms 				 ; Count at holdkey
		JZ		$+2
		DEC*	Keyms                
;----
MeasureHiTime:
		LDA		M_FatFlg
		JZ		ProcessTimerBuzz				
		TM2X	001000011B			 ;(001)8*4/32.768=0.9765625ms
;;;;;;;;;;;;;; 						 ;portA.1 Output  puls in 180ms	
		DEC*	R180ms1				  
		JC		MeasureHiTime1
		DEC*	R180ms2
		JC		MeasureHiTime1
		LDS		R180ms1,	7
		LDS		R180ms2,	0BH
		EORI*	PortA,		1
		OPA		PortA										
MeasureHiTime1:						 ;Measure portA.4 hi level
		SUBI	M_FatFlg,		4
		JNZ		Exit_Timer2Int		
		INC*	FatTest1
		JNZ		Exit_Timer2Int	
		INC*	FatTest2
		JNZ		Exit_Timer2Int	
		INC*	FatTest3             			
		JMP		Exit_Timer2Int	
;;;;;;;;;;;
ProcessTimerBuzz:
		ANDI 	AlmFlg,	4				
		JZ		ProcessAlmBuzz
		
		LDA		BuzzCount
		OR		Buzz16sCnt1
		OR		Buzz16sCnt2
		JNZ		Buzzing
		ANDI*	AlmFlg,	1011B
		LDS		MainMode,	0
;;;;;;;;;;
ProcessAlmBuzz:
		LDA		MainMode
		JNZ	    Exit_Timer2Int
		ANDI 	AlmFlg,	2				
		JZ		Exit_Timer2Int
		
		LDA		BuzzCount
		OR		Buzz60sCnt1
		OR		Buzz60sCnt2
		JNZ		Buzzing
		ANDI*	AlmFlg,	1101B
		JMP		Exit_Timer2Int

Buzzing:
		DEC*	BuzzCount              	;125--hi,125--low,125--hi,625--low
		MRW		IntDummy,	BuzzCount
		
		SUBI	IntDummy,	0AH
		JZ		ALMOn
		SUBI 	IntDummy,  0BH
		JZ		ALMOn
		SUBI	IntDummy,	0EH
		JZ		ALMOn
		SUBI	IntDummy,	0FH
		JZ		ALMOn
ALMOff:		
		ALM		0H		
		JMP		Exit_Timer2Int
ALMOn:	
		ALM		80H      				;(2K)

Exit_Timer2Int:		
		TMSX 	001000000B		 		; After 8/32.768 ms ,system is awake
		LDA		T_SaveA
		MRA		T_SaveFlgC_Z
		SIE*	18H
		RTS	
;------------------------------
PDRint:
		FAST
		STA     P_SaveA		
		MAF		P_SaveFlgC_Z	
		
		SIE*	08H
		ANDI	OptionR,		1     
		JZ		$+2
		SIE*	18H
		
		INC*	R_2Hz
		INC*	T_2Hz					
		DEC*	KeyS				
;;;;;;;;;;;;;;;;;;;;;
;Process display and sound at  Measure Fat Mode		
		LDA		M_FatFlg			
		JZ		PDP						
		INC*	M_Fat2hz					
		LDS		IntDummy,	2
		SUB		M_Fat2hz
		JNZ		M_FatBuzz
		LDS		M_Fat2hz,	0
		
		DEC*	Delay5s
		JC		M_FatBuzz
		ALM		0
		LDS		Delay5s,	4
		DEC*	MaxM_FatTm
		JC		PDP
		RF		4H
		LDS		PortA,		2
		OPA		PortA		
		LDS		R_Error,	1
		LDS		M_FatFlg,	0
		LDS		KeySound,	0FH
		ALM		80H
		JMP		Exit_PDRint
M_FatBuzz:
		LDS		IntDummy,	4
		SUB		MaxM_FatTm
		JNZ		PDP
		
		LDA		Delay5s
		JNZ		$+3
		ALM		80H
		JMP		Exit_PDRint
		LDA		M_Fat2hz
		JNZ		$+3
		ALM		80
		JMP		Exit_PDRint
		ALM		0
		JMP		Exit_PDRint

PDP:		
;;;;;;;;;;;;;;;;;Pendulum  Display  Process	
		LDA		MainMode
		JNZ		Exit_PDRint
		
		ANDI	OptionR,		 2
		JNZ		ShiftRight
		
		LDA		Pendulum1
		JB3		ShiftRight1
ShiftLeft:		
		ANDI*	OptionR,	1101B
		SL0		Pendulum1
		SL0		Pendulum2
		JMP		Exit_PDRint
ShiftRight:
		LDA		Pendulum1
		JB0		ShiftLeft
ShiftRight1:		
		ORI*	OptionR,	2
		SR0		Pendulum1		
		SR0		Pendulum2
Exit_PDRint:		
;;;;;;;;;;;;;;;;;;;;		
		TMSX 	001000000B 			 	;8/32.768ms
		LDA		P_SaveA
		MRA		P_SaveFlgC_Z
		RTS
;--------------------------------				
Start:		
		NOP
		NOP
		RF		10010111B         	
		
		ALM		80H						;Enable alarm 
		SHE		02H
		PLC		02H
		TMSX	000000011B           	;(000)512  4*512/32.768 =62.5ms
		HALT
		ALM     0H					
		
		LDS		Dummy,	0FH				;All icon  display
		LCP		0,		Dummy
		LCP		1,		Dummy
		LCP		2,		Dummy
		LCP		3,		Dummy
		LCP		4,		Dummy
		LCP		5,		Dummy
		LCP		6,		Dummy
		LCP		7,		Dummy
		LCP		8,		Dummy
		LCP		9,		Dummy
		LCP		0AH,	Dummy
		
										;Initialize RAM
		LDS		TempR1,		0
		LDS		TempR2,		8	
		MVU		TempR1
Clear_Ram:							
		LDS		TempR0,		0
		MVH		TempR2	
		MVL		TempR1
		STA		@HL
		DEC*	TempR1
		JC		Clear_Ram
		DEC*	TempR2
		JC		Clear_Ram
									    ;Set  the porta all output 
		LDS		Dummy,	   2
		OPA		Dummy				
		SPA		10111B
		LDS		Dummy,	  0
		OPB		Dummy
		SPB		01111B
		
		LDS    	Hr_H,		1
		LDS		Hr_L,		2
		LDS		AlmHr_H,	1
		LDS		AlmHr_L,	2	
		LDS		FatModeFlg,	4			;Fat parameter is default paremeter
		LDS		Age2,		3
		LDS		Height4,	1
		LDS		Height3,	7
		LDS		Weight3,	6	
		LDS		Weight2,	5
		LDS		Pendulum1,	0010B
		LDS		Pendulum2,	0010B	
		PLC		02H
		TMSX	010000001B              ;010(32768)  2*32768/32.768=2S
		HALT
		PLC		18H
		SIE*	08H
		;SCC		01011100B				;x6 = 1 (bclk) ,x4 = 1(ioc),x3 = 1(iod),x2,1,0 = (100)ph6 2MS
;==========================
Main:	
		CALL	Clock
		CALL	Timer	
		CALL	KeyProcess
		CALL	DisplayProcess	
		CALL	MeasureFat
		
		LDA		M_FatFlg
		JNZ		Main
		
		SCA		18H							
		PLC		3
		HALT
		NOP
		NOP
		
		FAST
		JMP		Main	
;============================

;--------------------
;Adjust the clock
;---------------------
Clock:	LDS		TempR0,		2
		SUB		R_2Hz
		JNZ		Exit_Clock
		LDS		R_2Hz,		0
;;;;;;;Count 60S of  Alm  at mainmode 0	
		LDA		MainMode
		JNZ	    Count16s
		LDA		Buzz60sCnt1             
		OR		Buzz60sCnt2
		JZ		Count16s
		DEC*	Buzz60sCnt1
		JC		Count16s
		DEC*	Buzz60sCnt2
;;;;;;Count 16S of Buzz  at timer stop running
Count16s:		
		LDA		Buzz16sCnt1
		OR		Buzz16sCnt2
		JZ		ReturnNormal
		DEC*	Buzz16sCnt1
		JC		ReturnNormal
		DEC*	Buzz16sCnt2
;;;;;;;;;if no key pressed after 60s & not at mainmode0,sys. return mainmode0 automatically
ReturnNormal:
		LDA		MainMode
		JZ		CLKSec_L
		SUBI	MainMode,	3
		JNZ		$+3
		SUBI	Mode1,		2
		JZ		CLKSec_L
		
		DEC*	KeyS1
		JC		CLKSec_L
		DEC*	KeyS2
		JC		CLKSec_L
		LDS		MainMode,	0
CLKSec_L:
;(20H)		
		LDS		TempR2,		2
		LDS		TempR1,	    0
		MVU		TempR1
		MVH		TempR2
		MVL		TempR1
		CALL	AddSecMin
		
		LDA		Sec_L	
		OR		Sec_H	
		JNZ		Exit_Clock
		LDS		TempR1,		2
		MVL		TempR1
		CALL	AddSecMin
		
		LDA		Min_L
		OR		Min_H
		JNZ		CheckAlarm
		
		LDS		TempR1,		4
		MVL		TempR1
		CALL	AddHour
CheckAlarm:
		ANDI 	AlmFlg,		1
		JZ		Exit_Clock
		
		LDA 	AlmHr_H
		EOR 	Hr_H
		JNZ	   	Exit_Clock
  		LDA 	AlmHr_L
		EOR 	Hr_L
		JNZ	   	Exit_Clock
  		LDA 	AlmMin_H
		EOR 	Min_H
		JNZ	    Exit_Clock
  		LDA 	AlmMin_L
		EOR 	Min_L
		JNZ	   	Exit_Clock
		
		
		ORI*	AlmFlg,		2
		LDS 	BuzzCount,	0
		LDS		Buzz60sCnt1,0CH
		LDS		Buzz60sCnt2,3
		JMP 	ActiveTMR2
Exit_Clock:			
		RTS	
;------------------------
Timer:	
		ANDI	OptionR,	4
		JZ		Exit_Timer
		
		LDS		TempR0,		2
		SUB		T_2Hz
		JNZ		Exit_Timer
		LDS		T_2Hz,		0
		
		DEC*	SData1
		DAS*	SData1
		JC		Exit_Timer		
		DEC*	SData2
		JC		Exit_Timer
		LDS		SData2,		5
		DEC*	SData3
		DAS*	SData3
		JC		Exit_Timer
		DEC*	SData4
		DAS*	SData4
		JC		Exit_Timer
		
		LDS		SData1,		0
		LDS		SData2,		0
		LDS		SData3,		0
		LDS		SData4,		0
		ORI*	AlmFlg,		4
		LDS 	BuzzCount,	0
		LDS		Buzz16sCnt1,0
		LDS		Buzz16sCnt2,1
		ANDI*	OptionR,	1011B
		JMP 	ActiveTMR2
Exit_Timer:
		RTS		
;===========================		
KeyProcess:
		LDS		TempR0,		4
		SUB		MaxM_FatTm
		JZ		NoKey
KeyProcess1:		
		LDS		Count1,	0b
		LDS		Count2,	1             ;Read portC & portD in 50 times
		MWR		TempR1,	KeyValue1
		MWR		TempR2,	KeyValue2
KeyScan:		
		IPC  	KeyValue1
		EOR		TempR1
		JNZ		KeyProcess1
		IPD		KeyValue2
		EOR		TempR2
		JNZ		KeyProcess1
		
		DEC*	Count1
		JC		KeyScan
		DEC*	Count2
		JC		KeyScan

		LDA		KeyValue1
		OR		KeyValue2
		JZ		NoKey		    		;HaveKey?
;HaveKey
		
		LDS		KeyS1,		0CH
		LDS		KeyS2,		3			;if not MainMode0 & keypressed,return MainMode0  after 60s      
		
		SUBI	KeyValue1,	6
		JZ		A_T_Key					;enter set unit Mode
		SUBI	KeyValue1,	0CH
		JZ		T_F_Key		    		;Set Fat Parameter to defalt parameter
		
		ANDI	KeyDoneFlg,	1
		JNZ		LongKeyProcess
;ShortKeyProcess		
		
		LDS		KeyDoneFlg,	1
		LDS		KeyS,		4			;Long Key Count
		
		LDA		KeyValue1
		JNZ		$+3
		ANDI	KeyValue2,	1
		JNZ		S_Key
		
		LDA		MainMode
		JNZ		$+3
		LDS		Buzz60sCnt1,	0
		LDS		Buzz60sCnt2,	0
		
		
		SUBI	KeyValue1,	1
		JZ		C_Key
		SUBI	KeyValue1,	2
		JZ		A_Key
		SUBI	KeyValue1,	4
		JZ		T_Key
		SUBI	KeyValue1,	8
		JZ		F_Key
		
		RTS
;;;;;
C_Key:
		LDA		MainMode
		JZ		Clock_C_Key	
		SUBI	MainMode,	1
		JZ		SetClK_C_Key
		SUBI	MainMode,	2
		JZ		Alm_C_Key
		SUBI	MainMode,	3
		JZ		Tmr_C_Key
;---
;Fat_C_Key
		ANDI*	OptionR,	1011B
		LDS		M_FatFlg,	0
		LDS		R_Error,	0
		LDS		PortA,		2
		OPA		PortA	
		RF		4
		JMP		$+3
Tmr_C_Key:		
		LDS		Buzz16sCnt1,0
		LDS		Buzz16sCnt2,0
		LDS		MainMode,	0
		ANDI*	OptionR,	1011B	
		JMP		SetKeySound	
Alm_C_Key:
		LDS		MainMode,	0
		LDA		SData1
		STA		AlmMin_L
		LDA		SData2
		STA		AlmMin_H
		LDA		SData3
		STA		AlmHr_L
		LDA		SData4
		STA		AlmHr_H
		JMP		SetKeySound
SetClK_C_Key:	
		LDS		MainMode,	0	
		LDA		SData1
		STA		Min_L
		LDA		SData2
		STA		Min_H
		LDA		SData3
		STA		Hr_L
		LDA		SData4
		STA		Hr_H
		RTS
Clock_C_Key:
		ORI*	KeyDoneFlg,	4				;represent 12/24hr converting when no key pressed
		RTS

;;;;;;;;;;		
A_Key:
		LDA		R_Error
		JNZ		Exit_KeyProcess
		LDA		MainMode
		JZ		Clock_A_Key
		SUBI	MainMode,	1
		JZ		SetClock_A_Key
		SUBI	MainMode,	2
		JZ		Alarm_A_Key
		SUBI	MainMode,	3
		JZ		Timer_A_Key
Fat_A_Key:
		ANDI	FatModeFlg,	1
		JNZ		Fat_A_Key_1
		
		SUBI	Mode1,		1
		JZ		Fat_A_Key1
		SUBI	Mode1,		2
		JZ		Fat_A_Key2
		SUBI	Mode1,		3
		JZ		Fat_A_Key3
		SUBI	Mode1,		4	
		JZ		Fat_A_Key4
		RTS
;-----------------------------Convert Gender
Fat_A_Key4:
		LDS		TempR0,	8
		EOR*	SData1          ;select  F/M
		RTS
;---------------------------increase age
Fat_A_Key3:
		INC*	SData1
		DAA*	SData1
		JNZ		CheckAgeOverFlow
		INC*	SData2
		DAA*	SData2
		RTS
CheckAgeOverFlow:
		LDS		TempR0,		8
		SUB		SData2
		JNZ		Exit_KeyProcess
		LDS		SData1,		0
		LDS		SData2,		1
		RTS
;---------------------------increase height
Fat_A_Key2:
		ANDI	FatModeFlg,	2
		JNZ		H_inchOverFlow
		
		LDS		TempR0,	5
		ADD*	SData1
		DAA*	SData1
		JNC		CheckHOverFlow
		INC*	SData2
		DAA*	SData2
		JNZ		Exit_KeyProcess
		INC*	SData3
		DAA*	SData3
		JNZ		Exit_KeyProcess
		INC*	SData4
		RTS
;------------------------------210cm
CheckHOverFlow:
		LDS		TempR0,		2
		SUB		SData4
		JNZ		Exit_KeyProcess
		

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -