📄 cm-941.asm
字号:
.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 + -