📄 lib.asm
字号:
;**************************************;
;IF AGE & HEIGHT OUT OF RANGE,DISPLAY "ERR1" THEN INITIAL USER INFO.
CHK_USER_INFO: ;
LD EA,AGE ; AGE > 10 ?
LD WX,#10 ; |
SBS EA,WX ; |
JPS CHK_UI_1 ; |
JPS CHK_UI_3 ; NO.
CHK_UI_1: ; |
LD EA,AGE ; YES. AGE < 101 ?
LD WX,#101 ; |
SBS EA,WX ; |
JPS CHK_UI_3 ; NO.
LD EA,HEIGHT ; YES. HEIGHT >101 ?
LD WX,#100 ; |
SBS EA,WX ; |
JPS CHK_UI_2 ; |
JPS CHK_UI_3 ; NO.
CHK_UI_2: ; |
LD EA,HEIGHT ; YES. HEIGHT < 221 ?
LD WX,#221 ; |
SBS EA,WX ; |
JPS CHK_UI_3 ; NO.
RET ; YES.
CHK_UI_3: ;
BITS SEX ; LOAD DEFAULT VALUE TO THAT USER ......
LD EA,#HEIGHT_CON ;
LD HEIGHT,EA ;
LD EA,#AGE_CON ;
LD AGE,EA ;
BITS WRITE_EEP_EN ;
CALL RW_USER_INFO ;
JPS DISP_ERR1 ;
;**************************************;
;**************************************;
DLY5S_OFF_PWR: ;
LD EA,#0FFH ;
CALL DELAY_3MS ;
LD EA,#0FFH ;
CALL DELAY_3MS ;
TURN_OFF_PWR: ;
JPS SLEEP ;
;**************************************;
;***************************************************************************;
; SLEEP MODE ;
;***************************************************************************;
;**************************************;
SLEEP: ;
LD A,#SCALE_MODE_CON ;
LD RUN_MODE_REG,A ; RESET RUN MODE: SCALE MODE
;---------------------- ;
;SET LCD REGISTER: ;
BITR EMB ; <<<<<--------------
LD EA,#00H ;
LD SP,EA ; RESET STACK POINTER
LD LCON,A ; TURN OFF VLCD
LD WMOD,EA ; DISABLE WATCH TIMER
LD LMOD,EA ; TURN OFF DUTY AND BIAS
BITS P2.0 ;
LD A,#1101B ;
LD P3,A ; SET P3 PORT TO HIGHT LEVEL
LD A,#1111B ;
LD P6,A ; SET P6 PORT TO HIGHT LEVEL
LD A,#1100B ; P5.3 = 1 P5.2 = 1
LD P5,A ;
LD A,#0 ; 3 2 1 0
LD INTA,A ; IE4 IRQ4 IEB IRQB
LD INTB,A ; 0 0 IEW IRQW
LD INTC,A ; 0 0 IET0 IRQT0
LD INTD,A ; IE1 IRQ1 IE0 IRQ0
LD INTE,A ; IE1 IRQ1 IE0 IRQ0
BITR IRQ2 ;
BITS IE2 ;
STOP ; STOP !!! STOP !!! STOP !!! STOP !!!
NOP ;
NOP ;
NOP ;
NOP ;
BITR IE2 ;
DI ;
LD A,P7 ; READ KB PORT
CPSE A,#1111B ; SOME KEY PRESSED ?
JP SL_2 ; YES.
LD EA,#00H ; NO. TAPE ON PWR
LD SP,EA ; RESET STACK POINT
LD A,#0DH ;
LD BMOD,A ;
LD EA,#00H ;
LD WDMOD,EA ; ENABLE WATCHDOG TIMER
EI ;
JP $ ; WAIT FOR RESET ......
;-------------------------- ;
; SET/USER KEY TO WAKE UP SYSTEM ;
SL_2: CALL READ_KB ;
LD KB_BUF,EA ; SAVE KEY VALUE TO KB_BUF.
CPSE E,#00 ; E = 0 ?
JPS SL_21 ; NO.
JPS SLEEP ; YES. NO KEY PRESSED.
SL_21: LD WX,#SET_KEY_CON ;
CPSE EA,WX ; "SET" KEY PRESSED
JPS SL_22 ;
JPS SL_23 ;
SL_22: LD WX,#USER_KEY_CON ;
CPSE EA,WX ; "USER" KEY PRESSED
JPS SLEEP ;
SL_23: BITS KEYSCAN_EN ;
BITS KEY_PRESSED ;
LD KEY_VALUE,EA ;
LD A,#03H ;
LD KB_STATE,A ;
BITR VCC_CONTROL ; ENABLE VCC1
;----------------------- ;
;RESET LCD REGISTER: ;
BITS IEW ; FOR LCD DISPLAY
LD EA,#00000100B ;
LD WMOD,EA ; ENABLE WATCH TIMER, SELECT Fxx/128
LD A,#1 ;
LD LCON,A ; SET LCD TO NORMAL DISPLAY MODE
LD EA,#00011011B ; SET LMOD (1/3 DUTY, 1/2 BIAS )
LD LMOD,EA ; 1100 1010
;------------------------- ;
;SET INTERRUPT: ;
BITS IET0 ; SYSTEM CLICK
BITS IE0 ; EXTERNAL INT0
BITS IEB ; BASIC COUNTER
CALL GET_BENCHMARK ;
EI ;
BITS EMB ; <<<<<<---------
CALL SOFT_INIT_1 ;
JP MAIN ;
;**************************************;
;***************************************************************************;
; CALCULATE FAT_RATE ;
;***************************************************************************;
;FUNCTION:
;CALCULATE FAT_RATE,THE ROUTINE INCLUDE THREE PARTS: PART1,PART2 AND PART3.
;CONSTANT DEFINE
;------------------------------------------------------------\
FAT_A_CONH: EQU 024H ; |
FAT_A_CONM: EQU 09FH ; |
FAT_A_CONL: EQU 00H ; FAT_C_CON=27AC40H | ==> 249F00H
;-------------------- ; |
FAT_B_CON: EQU 0F0H ; FAT_B_CON = 0E4H | ===>0F0H
;-------------------- ; |
FAT_C_CONH: EQU 01DH ; FAT_C_CON = 1D10H | ===>1DB0
FAT_C_CONL: EQU 0B0H ; |
;-------------------- ; |
FAT_D_CONH: EQU 011H ; FAT_D_CON = 1108H |
FAT_D_CONL: EQU 008H ; |
;-------------------- ; |
FAT_E_CONH: EQU 14H ; FAT_E_CON =124F80H | ==> 142440
FAT_E_CONM: EQU 24H ; |
FAT_E_CONL: EQU 40H ; |
;------------------- ; |
FAT_F_CONH: EQU 076H ; FAT_F_CON = 76D4H |
FAT_F_CONL: EQU 0D4H ; |
;------------------- ; |
FAT_G_CONH: EQU 04EH ; FAT_G_CON = 4E20H |
FAT_G_CONL: EQU 020H ; |
;--------------------------------------|---------------------/
; LMB<=[(A+B+C)-(D+E+F)]/20000 (0.1KG) ;
; A = k*13.0 ;12 ( k = 200000)
; B = k*0.00114* HEIGHT * HEIGHT ;0.0012
; C = k*0.03720 * WEIGHT ;0.038
; D = k*0.218 * R ;
; E = k*6.00 * SEX ;6.6
; F = k*0.1521 * AGE ;
; FAT RATE = 1000 - LMB*1000/WEIGHT ;
;--------------------------------------;
; INPUT: ;
; [AGE] ;
; [SEX] ;
; [WEIGHT] ;
; [HEIGHT] ;
; [BODY_RES] ;
;R: ACC_BUF,BCC_BUF,CCC_BUF,SUM1,SUM2 ;
; ;
; OUTPUT: FAT_RAT (BCD) ;
;--------------------------------------;
;PART1: ;
; SUM1 <= A + B + C ;
; INPUT: A,B,C ;
; OUTPUT: SUM1 ;
CALCULATE_FAT: ;
PART1: SMB 1 ;
LD EA,#FAT_A_CONL ;
LD SUM1+0,EA ;
LD EA,#FAT_A_CONM ;
LD SUM1+2,EA ;
LD EA,#FAT_A_CONH ;
LD SUM1+4,EA ;
LD EA,#00H ;
LD SUM1+6,EA ; SUM1 <= #FAT_A_CON
SMB 0 ;
;------------------------ ;
LD EA,HEIGHT ;
LD ACC_BUF+0,EA ; ACC_BUF <= HEIGHT
LD CCC_BUF+0,EA ; CCC_BUF <= HEIGHT
LD EA,#00 ;
LD ACC_BUF+2,EA ;
LD CCC_BUF+2,EA ;
CALL CW_MUL ;
LD2B ACC_BUF,BCC_BUF ; ACC_BUF <= BCC_BUF <= HEIGHT * HEIGHT
LD EA,#FAT_B_CON ;
LD CCC_BUF+0,EA ;
LD EA,#00 ;
LD CCC_BUF+2,EA ; CCC_BUF <= #FAT_B_CON
CALL CW_MUL ; BCC_BUF <= ACC_BUF * CCC_BUF
LD HL,#(SUM1+0) ;
CALL SUM_BCC ; SUM1 <= #FAT_A_CON + HT* HT *FAT_B_CON
;------------------------ ;
LD2B ACC_BUF,WEIGHT ; ACC_BUF <= WEIGHT
LD EA,#FAT_C_CONL ;
LD CCC_BUF+0,EA ;
LD EA,#FAT_C_CONH ;
LD CCC_BUF+2,EA ; CCC_BUF <= #FAT_C_CON
CALL CW_MUL ; BCC_BUF <= WEIGHT * FAT_C_CON
LD HL,#(SUM1+0) ;
CALL SUM_BCC ; SUM1 <= SUM1 + WEIGHT* FAT_C_CON
;----------------------- ;
;SUM2 <= D+E+F ;
;INPUT: D,E,F ;
;OUTPUT:SUM2 ;
PART2: LD HL,#(SUM2+0) ;
CALL CLR_SUM ; CLR SUM2
LD EA,#FAT_D_CONL ; ACC_BUF <= FAT_D_CON
LD ACC_BUF+0,EA ;
LD EA,#FAT_D_CONH ;
LD ACC_BUF+2,EA ;
;------------------- ;
SMB 1 ;
LD EA,BODY_RES+0 ;
SMB 0 ;
LD CCC_BUF+0,EA ;
;------------------- ;
SMB 1 ;
LD EA,BODY_RES+2 ;
SMB 0 ;
LD CCC_BUF+2,EA ; CCC_BUF <= BODY_RES
;------------------- ;
CALL CW_MUL ; BCC_BUF <= BODY_RES * FAT_D_CON
LD HL,#(SUM2+0) ;
CALL SUM_BCC ; SUM2 <= SUM2 + BODY_RES * FAT_D_CON
;------------------------- ;
;CHECK SEX= FEMALE OR MALE ;
BTSF SEX ; SEX IS FEMALE ?
JPS PART2_1 ; NO.
LD EA,#FAT_E_CONL ; YES. THEN:
LD BCC_BUF+0,EA ; BCC_BUF <= FAT_E_CONL
LD EA,#FAT_E_CONM ;
LD BCC_BUF+2,EA ;
LD EA,#FAT_E_CONH ;
LD BCC_BUF+4,EA ;
LD HL,#(SUM2+0) ;
CALL SUM_BCC ; SUM2 <= SUM2 + FAT_E_CONL
;----------------------- ;
PART2_1:LD EA,#FAT_F_CONL ;
LD ACC_BUF+0,EA ;
LD EA,#FAT_F_CONH ;
LD ACC_BUF+2,EA ; ACC_BUF <= FAT_F_CON
LD EA,AGE+0 ;
LD CCC_BUF+0,EA ;
LD EA,#00H ; CCC_BUF <= AGE
LD CCC_BUF+2,EA ;
CALL CW_MUL ; BCC_BUF<= ACC_BUF * CCC_BUF
LD HL,#(SUM2+0) ;
CALL SUM_BCC ; SUM2 <= SUM2 + BCC_BUF
;----------------------- ;
;PART3: ;
; INPUT: SUM1,SUM2 ;
; OUTPUT:FAT_RATE ;
PART3: LD HL,#(SUM2+7) ; CHECK IF SUM1 < SUM2 ,DISPLAY "ERR" ;
LD WX,#(SUM1+7) ;
LD Z,#(16-8) ;
PART3_1:SMB 1 ;
PUSH HL ;
LD EA,WX ;
LD HL,EA ;
LD A,@HL ;
POP HL ;
CPSE A,@HL ; [WX] = [HL] ?
JPS PART3_11 ; NO.
DECS HL ; YES. HL + +
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -