📄 ht0401a.asm
字号:
;*******************************************************************************
; Subject : HT0401A(Ver 2.00)APPS_PROGRAM
; Author : Fy.Liu
; Date : 2003.09.15
; Version : 1.01(modify, 2003.09.27)
; MCU : NT66P12
; LCD : BM6065
;*******************************************************************************
; SYSTEM REGISTERS DEFINE
;*******************************************************************************
IE EQU 00H
IRQ EQU 01H
T0M EQU 02H
T1M EQU 03H
T0L EQU 04H
T0H EQU 05H
T1L EQU 06H
T1H EQU 07H
PORTA EQU 08H
PORTB EQU 09H
PORTC EQU 0AH
PORTD EQU 0BH
LPD EQU 0CH
BDS EQU 0DH
TBR EQU 0EH
INX EQU 0FH
DPL EQU 10H
DPM EQU 11H
DPH EQU 12H
AC13 EQU 13H
AEC EQU 14H
DUTY EQU 15H
; Reserved $16 - $1F (16H - 1FH)
;*******************************
; WORK REGISTERS DEFINE
;*******************************
TEMP EQU 20H
CT0 EQU 21H
CT1 EQU 22H
DLY_T EQU 23H
ACC_B EQU 24H
;*******************************
CTStemp EQU 27H
CTBicon EQU 28H
CTBtemp EQU 29H
CTLseco EQU 2AH ;
CTHseco EQU 2BH ;Second
CTLminu EQU 2CH ;
CTHminu EQU 2DH ;Minute
CTLhour EQU 2EH ;
CTHhour EQU 2FH ;Hour
;*******************************
FLAG1 EQU 30H
; FLAG1.0: second icon blink falg
; FLAG1.1: heart & cool iccon blink flag
; FLAG1.2: display refresh flag
; FLAG1.3: timeover flag
FLAG2 EQU 31H
; FLAG2.0: system START falg
; FLAG2.1: SYS_EN flag
; FLAG2.2: reserved
; FLAG2.3: reserved
FLAG3 EQU 32H
; FLAG3.0: K1
; FLAG3.1: K2
; FLAG3.2: K3
; FLAG3.3: K4
;*******************************************************************************
; Main Program
;*******************************************************************************
LIST P=6612
ROMSIZE =2048
ORG 000H
JMP RESET
NOP
JMP TIMER0
NOP
NOP
;***************************************
RESET: LDI DUTY,1H ; LCD:1/4D 1/3B
LDI TEMP,00H
CALL CHK_LCD
CALL INITMCU
;***************************************
LOOP: LDI TEMP,0FH ; AC=0FH
EOR PORTB,0 ; AC<-AC^PORTB
BNZ $+2 ;a KEY pressed
LDI FLAG3,00H ;clear KEY_flag
CALL KB_HIT
LDI TEMP,0100B ;AC.2=1
EOR FLAG1,0 ;no modify FLAG
BA2 $+3 ;Display RefreshBit=0
CALL DISPLAY ;Display RefreshBit=1
ANDIM FLAG1,1011B ;claer Refresh_Bit
CALL OUTPUT
JMP LOOP
;***************************************
NOP
NOP
NOP
JMP RESET
;*******************************************************************************
; TIMER0 INTERRUPT PROCESS ( counts overflow from $FF to $00 )
;*******************************************************************************
TIMER0: STA ACC_B,0 ;Push AC
LDI IRQ,00H ;Clear interrupt flag
LDI IE ,0100B ;Enable tomer0 interrupt
ORIM FLAG1,0100B ;set DisplayRefreshBit
ADIM CTStemp,01H ;check 0.5 second REGISTER
ADIM CTBtemp,01H ;
ADIM CTBicon,01H ;
LDI TEMP,3 ;check ICON blink
SUB CTBicon,0
BNC $+7
LDI CTBicon,00H
LDA FLAG1,0
BA1 $+3
ORIM FLAG1,0010B
JMP $+2
ANDIM FLAG1,1101B
;***************
LDA FLAG1,0
BA3 QUIT ; TimeOver Flag=1,
LDA CTLminu,0
BNZ CONT
LDA CTHminu,0
BNZ CONT
LDA CTLhour,0
BNZ CONT
LDA CTHhour,0
BNZ CONT
JMP EXIT_T0 ;check Hour & Minute
CONT:
;***************
LDI TEMP,4 ;check ":" blink
SUB CTBtemp,0
BNC $+7
LDI CTBtemp,00H
LDA FLAG1,0
BA0 $+3
ORIM FLAG1,0001B
JMP $+2
ANDIM FLAG1,1110B
LDI TEMP,8 ;check SECOND
SUB CTStemp,0
BNC QUIT
;second
ADJs: LDI CTStemp,00H
LDA CTLseco,0 ; check second low nibble
BAZ $+2 ; =0? yes, check high nibble
JMP $+6 ; no, jump to "-1"
LDA CTHseco,0 ; check second high nibble
BAZ ADJm ; =0? yes, jump to ADJ_minute
LDI CTLseco,09H
SBIM CTHseco,01H
JMP QUIT
SBIM CTLseco,01H
JMP QUIT
;minute
ADJm: LDA CTLminu,0 ;check minute_L
BAZ $+2 ;if minute_L=0, then goto "check minute_H"
JMP $+8 ;else goto "minute_L-1"
LDA CTHminu,0 ;check minute_H
BAZ ADJh ;if minute_H=0, goto "adj_hour"
LDI CTLseco,09H
LDI CTHseco,05H ; restore Second counter
LDI CTLminu,09H
SBIM CTHminu,01H
JMP QUIT
LDI CTLseco,09H
LDI CTHseco,05H ; restore Second counter
SBIM CTLminu,01H ;minute_L - 1
JMP QUIT
;Hour
ADJh: LDI CTLseco,09H
LDI CTHseco,05H ; restore Second counter
LDA CTLhour,0 ;check Hour_L
BAZ $+2 ;if Hour_L=0, then goto "check Hour_H"
JMP $+8 ;else goto "Hour_L-1"
LDA CTHhour,0 ;check Hour_H
BAZ EXIT_T0
LDI CTLminu,09H
LDI CTHminu,05H ; restore minute counter
LDI CTLhour,09H
SBIM CTHhour,01H
JMP QUIT
LDI CTLminu,09H
LDI CTHminu,05H ; restore minute counter
SBIM CTLhour,01H
JMP QUIT
EXIT_T0: ORIM FLAG1,1000B ;set TimeOver flag =>FLAG1.3=1
QUIT: LDA ACC_B,0 ;POP AC
RTNI
;*******************************************************************************
; KEYBOARD EVENT PROCESS
;*******************************************************************************
KB_HIT:
; STA ACC_B,0 ;Push AC
LDI TEMP,0FH ;AC=0FH
EOR PORTB,0 ;AC<-AC^PORTB
BAZ EXIT_KB
LDI DLY_T,01H
CALL DELAY ;delay
LDI TEMP,0FH
EOR PORTB,0
BAZ EXIT_KB ;Confirm key_press
BA3 K1EVENT
BA2 K2EVENT
BA1 K3EVENT
BA0 K4EVENT
;-------
K1EVENT: ;ADJ_Hour
LDA FLAG2,0
BA1 $+2
JMP EXIT_KB
LDA FLAG3,0
BNZ EXIT_KB
LDA FLAG2,0 ;START_UP
BA0 EXIT_KB ;Dis_ADJ
LDI FLAG3,0001B
; LDI DLY_T,05H
; CALL DELAY
ORIM FLAG1,0100B ;set REFRESH flag
ADIM CTLhour,01H
LDI TEMP,10
SUB CTLhour,0
BNC EXIT_KB
ADIM CTHhour,01H
LDI CTLhour,00H
LDI TEMP,2
SUB CTHhour,0
BNC EXIT_KB
LDI CTHhour,00H ;Hour(MAX)=19
JMP EXIT_KB
;-------
K2EVENT: ;ADJ_Minute
LDA FLAG2,0
BA1 $+2
JMP EXIT_KB
LDA FLAG3,0
BNZ EXIT_KB
LDA FLAG2,0 ;START_UP,
BA0 EXIT_KB ;Dis_ADJ
LDI FLAG3,0010B
; LDI DLY_T,05H
; CALL DELAY
ORIM FLAG1,0100B ;set REFRESH flag
ADIM CTLminu,01H
LDI TEMP,10
SUB CTLminu,0 ;minute(L)-AC
BNC EXIT_KB ;CY=0, minute(L)<AC
ADIM CTHminu,01H ;minute(L)=10
LDI CTLminu,00H ;=> minute(L)=0, minute(H)=1
LDI TEMP,6
SUB CTHminu,0
BNC EXIT_KB
LDI CTHminu,00H ;Minute(MAX)=59
JMP EXIT_KB
;-------
K3EVENT: ;START
LDA FLAG2,0
BA1 $+2
JMP EXIT_KB
LDA FLAG3,0
BNZ EXIT_KB
LDI FLAG3,0100B
LDA FLAG2,0
BA0 EXIT_KB ;START flag = 1, disable K3
LDA CTLminu,0
BNZ ST_SYS
LDA CTHminu,0
BNZ ST_SYS
LDA CTLhour,0
BNZ ST_SYS
LDA CTHhour,0
BAZ EXIT_KB
ST_SYS: ORIM FLAG2,0001B ;Set START flag
LDI IRQ,00H ;Clear interrupt flag
LDI IE ,0100B ;Enable timer0 interrupt
JMP EXIT_KB
;-------
K4EVENT: ;Power
LDA FLAG3,0 ;check KEYBOARD flag
BA3 EXIT_KB
LDI FLAG3,1000B
LDA FLAG2,0 ;check SYS_EN flag
BA1 PWR_OFF ;if SYS_EN=1, goto "PWR_OFF"
PWR_ON:
ANDIM PORTA,0111B ;else light & disp_all
ORIM FLAG2,0010B ;set FLAG2.1 (SYS_EN flag)
; ANDIM FLAG2,1011B ;clr FLAG2.2 (SYS_DS flag)
LDI TEMP,0FH
CALL CHK_LCD
LDI DLY_T,0AH
CALL DELAY
ORIM FLAG1,0100B ;set REFRESH flag
JMP EXIT_KB
PWR_OFF:
ORIM PORTA,1110B
CALL INITMCU
LDI TEMP,00H
CALL CHK_LCD
ANDIM IE ,0000B
ANDIM IRQ,0000B
LDI DLY_T,0FH
CALL DELAY
;-------
EXIT_KB:
ORIM PORTB,1111B
RTNI
;*******************************************************************************
; OUTPUT CONTROL
;*******************************************************************************
OUTPUT: LDA FLAG2,0 ;Check START flag
BA0 $+2 ;if START=1, goto "check TimeOver flag"
JMP EXIT_OP ;else "exit"
LDA FLAG1,0 ;check TimeOver flag
BA3 COOL ;if TimeOver=1, goto "COOL"
CHK_TP: LDA PORTA,0 ;else "check PORTA.0"
BA0 HEAT ;if Port_A.0=1, Heat
ORIM PORTA,0111B ;Else, No_Heat,
JMP EXIT_OP
HEAT:
ORIM PORTA,0110B
ANDIM PORTA,0101B ;
JMP EXIT_OP
COOL:
ORIM PORTA,0110B
ANDIM PORTA,0011B ;
EXIT_OP:
; ORIM PORTA,0110B ;
RTNI
;*******************************************************************************
; DISPLAY PROCESS
;*******************************************************************************
DISPLAY:
; STA ACC_B,0
; LCD Address
LDI DPH, 06H
LDI DPM, 01H
LDI DPL, 09H ;data pointer ($319H)
; Load minu_L DATA
LDI TBR, 00H
ADI CTLminu,01H
CALL 0500H
; Write LCD RAM
STA INX, 0
SBIM DPL,01H ;get next address ($318H)
LDA FLAG1,0
BA3 $+5
BA1 $+3
ANDIM TBR,0111B
JMP $+2
ORIM TBR,1000B
LDA TBR, 0
STA INX, 0
;---------------
; Load minute_H DATA
SBIM DPL,01H ;get next address ($317H)
LDI TBR, 00H
ADI CTHminu,01H
CALL 0500H
; Write LCD RAM
STA INX, 0
SBIM DPL,01H ;get next address ($316H)
LDA FLAG1,0
BA3 $+3 ;TimeOver=1
LDA FLAG1,0
BA0 $+3
ORIM TBR,1000B ;display ":"
JMP $+2
ANDIM TBR,0111B
LDA TBR, 0
STA INX, 0
;---------------
; Load hour_L DATA
SBIM DPL,01H ;get next address ($315H)
LDI TBR, 00H
ADI CTLhour,01H
CALL 0500H
; Write LCD RAM
STA INX, 0
SBIM DPL,01H ;get next address ($314H)
LDA FLAG1,0
BA3 $+4
LDA TBR, 0
STA INX, 0
JMP $+6
BA1 $+3
ANDIM TBR,0111B
JMP $+2
ORIM TBR,1000B
JMP $-7
;---------------
; Load hour_H DATA
SBIM DPL,01H ;get next address ($313H)
LDA CTHhour,0
BAZ CLR_HH
BA0 DISP_1
BA1 DISP_2
CLR_HH: LDI TEMP,00H
JMP WR_HH
DISP_1: LDI TEMP,0101B
JMP WR_HH
DISP_2: LDI TEMP,0110B
; Write LCD RAM
WR_HH: STA INX, 0
; LDA ACC_B,0
RTNI
;***************************************
; Digit Model: XFED ABGC
;***************************************
ORG 0500H
TJMP ;jump by TJMP address
RTNW 07H,0DH ;0
RTNW 00H,05H ;1
RTNW 03H,0EH ;2
RTNW 01H,0FH ;3
RTNW 04H,07H ;4
RTNW 05H,0BH ;5
RTNW 07H,0BH ;6
RTNW 00H,0DH ;7
RTNW 07H,0FH ;8
RTNW 05H,0FH ;9
RTNW 06H,0FH ;A
RTNW 07H,03H ;b
RTNW 07H,08H ;C
RTNW 03H,07H ;d
RTNW 07H,0AH ;E
RTNW 06H,0AH ;F
;*******************************************************************************
; Delay time=DLY_T X ? mS
;*******************************************************************************
DELAY: SBIM DLY_T,01H ;judge DLY_T is >0 ?
BC $+2 ;no,delay one loop
RTNI ;yes,return to main program
LDI CT1,0AH ;set counter number
LDI CT0,0FH
SBIM CT0,01H ;counter down
BC $-1
SBIM CT1,01H
BC $-4
JMP DELAY
;*******************************************************************************
; Check LCD
;*******************************************************************************
CHK_LCD: LDI DPH, 06H
LDI DPM, 01H
LDI DPL, 09H ;data pointer ($319H)
LP_CHK: LDA TEMP,0
STA INX, 0
SBIM DPL,01H ;get next address ($318H)
BC LP_CHK
RTNI
;*******************************************************************************
; Initialization MCU
;*******************************************************************************
INITMCU:
;initialization work register
LDI PORTA,1111B
LDI CTStemp,00H
LDI CTBicon,00H
LDI CTBtemp,00H
LDI CTLseco,09h
LDI CTHseco,05h
LDI CTLhour,00h
LDI CTHhour,00h
LDI CTLminu,00h
LDI CTHminu,00h
LDI FLAG1,00H
LDI FLAG2,00H
; LDI FLAG3,00H ;********Don't clear KEY_flag
;set timer0
LDI T0M,02H ; 1/128 PRESCALER
LDI T0L,08H ;
LDI T0H,0FH ; T0=(256-8)
RTNI
;*******************************************************************************
END
;*******************************************************************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -