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

📄 ht0401a.asm

📁 lcm测试程序,对LCM设计者有帮助,希望大家能用上.
💻 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 + -