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

📄 lcd2-458.dt

📁 用EM78P458 驱动LCM1602
💻 DT
字号:
;FOR SMC1602 液晶屏

;芯片为EM78P458AM
;内部RC,外接51K电阻
;振荡模式为4MHz晶振
;看门狗关,指令周期为2个CLOCK

;==============寄存器的定义========================
	R0 == 0X00
	TCC == 0X01
	PC == 0X02

	R3 == 0X03
	C==0
	DC==1
	Z==2
	P==3
	T==4
	PS0==5
	PS1==6
	CMPOUT==7

	R4 ==  0X04

	P5 == 0X05
	K1 == 0
	K2 == 1
	K3 == 2
	KPW == 3
	EB == 4
	CPW == 5
	RS == 6
	EA == 7

	P6 == 0X06
	AFA ==0
	RFA ==1
	AFB ==2
	RFB ==3
	D4  ==4
	D5  ==5
	D6  ==6
	D7  ==7

	IOCB == 0XB	;下拉控制
	IOCC == 0XC	;漏极开路控制
	IOCD == 0XD	;上拉控制

	R_F == 0XF	;中断状态寄存器
	IOCF== 0XF	;IOW中断屏蔽寄存器

;ADC Contro Registers
	ADDATA == 0XA	;MOV
	ADCONR == 0X9	;MOV
	ADRUN==4
	ADPD==3
	ADIS2==2	;模拟输入选择
	ADIS1==1
	ADIS0==0
	ADCONC == 0XA	;IOW
	VREFS==7	;参考电压,0为工作电压
	CE==6
	COE==5
	IMS2==4		;模拟和数据I/O口选择
	IMS1==3
	IMS0==2
	CKR1==1		;ADC时钟分频数
	CKR0==0
	GCON== 0X9	;IOW
	OP2E==7		;增溢放大器2,==0时OP2关闭
	OP1E==6
	G22==5		;增溢选择
	G21==4
	G20==3
	G12==2
	G11==1
	G10==0

;=============数组LINE1 LINE2==================================
;BANK0==================
	LINE1   == 0X20		;0X20-0X2F
	LINE2   == 0X30		;0X30-0X3F
;============用户寄存器========================================

	TMP	==0XB
	FG	==0XC		;低两位
;	DATA	==0XD
;	==0XE			;低两位
	S1      == 0X10		;通用寄存器
	S2      == 0X11
	S3      == 0X12

	CHANEL  == 0X14
	CHANELB == 0X15
	CN1	== 0X16
	CN2	== 0X17
	;DATA	== 0X18
	;ADDR	== 0X19
	TM1	== 0X1A
	TM2	== 0X1B
	TEM1	== 0X1C
	TEM2	== 0X1D
	LP_CNT0 == 0X1E
	LP_CNT1 == 0X1F
;==========================STAR0===============================
	ORG	0
	JMP	INITIAL
	ORG	1		;软件中断地址
	RETI
	ORG	8		;硬件中断地址
	RETI
	ORG	10
;=============================================================
TABLE:					;存放LCD显示数组数据
	ADD	PC, A
	RETL 	@0X86			;A0_864.6MHz
	RETL 	@0X46
	RETL 	@0X86			;A1_863.6MHz
	RETL 	@0X36
	RETL 	@0X86			;A2_862.6MHz
	RETL 	@0X26
	RETL 	@0X86			;A3_861.6MHz
	RETL 	@0X16
	RETL 	@0X85			;A4_806.3MHz
	RETL 	@0X86
	RETL 	@0X85			;A5_851.6MHz
	RETL 	@0X16
	RETL 	@0X84			;A6_848.6MHz
	RETL 	@0X86
	RETL 	@0X84			;A7_847.6MHz
	RETL 	@0X76
	RETL 	@0X84			;A8_846.6MHz
	RETL 	@0X66
	RETL 	@0X85			;A9_852.6MHz
	RETL 	@0X26
	RETL 	@0X85			;AA_857.6MHz
	RETL 	@0X76
	RETL 	@0X85			;AB_856.6MHz
	RETL 	@0X66
	RETL 	@0X85			;AC_855.6MHz
	RETL 	@0X56
	RETL 	@0X85			;AD_854.6MHz
	RETL 	@0X46
	RETL 	@0X85			;AE_853.6MHz
	RETL 	@0X36
	RETL 	@0X85			;AF_852.6MHz
	RETL 	@0X26
;B
	RETL 	@0X84			;B0_840.6MHz
	RETL 	@0X06
	RETL 	@0X83			;B1_839.6MHz
	RETL 	@0X96
	RETL 	@0X83			;B2_838.6MHz
	RETL 	@0X86
	RETL 	@0X83			;B3_837.6MHz
	RETL 	@0X76
	RETL 	@0X83			;B4_834.6MHz
	RETL 	@0X46
	RETL 	@0X82			;B5_827.6MHz
	RETL 	@0X76
	RETL 	@0X82			;B6_824.6MHz
	RETL 	@0X46
	RETL 	@0X82			;B7_823.6MHz
	RETL 	@0X36
	RETL 	@0X82			;B8_822.6MHz
	RETL 	@0X26
	RETL 	@0X82			;B9_828.6MHz
	RETL 	@0X86
	RETL 	@0X83			;BA_830.6MHz
	RETL 	@0X06
	RETL 	@0X81			;BB_819.6MHz
	RETL 	@0X96
	RETL 	@0X81			;BC_817.6MHz
	RETL 	@0X76
	RETL 	@0X81			;BD_815.6MHz
	RETL 	@0X56
	RETL 	@0X81			;BE_814.6MHz
	RETL 	@0X46
	RETL 	@0X81			;BF_813.6MHz
	RETL 	@0X36
;=============================================================
POWERONA:
	ADD	PC, A
	RETL	@0X20
	RETL 	@0X20
	RETL 	@0X20
	RETL 	@0X20
	RETL 	@0X20
	RETL 	@0X45		;E
	RETL 	@0X4D		;M
	RETL 	@0X4F		;O
	RETL 	@0X43		;C
	RETL 	@0X4C		;L
	RETL 	@0X45		;E
	RETL 	@0X57		;W
	RETL 	@0X20
	RETL 	@0X20
	RETL 	@0X20
	RETL 	@0X20
	
POWERONB:
	ADD	PC, A
	RETL 	@0X20
	RETL 	@0X4D		;M
	RETL 	@0X49		;I
	RETL 	@0X43		;C
	RETL 	@0X52		;R
	RETL 	@0X4F		;O
	RETL 	@0X50		;P
	RETL 	@0X48		;H
	RETL 	@0X4F		;O
	RETL 	@0X4E		;N
	RETL 	@0X45		;E
	RETL 	@0X20		;
	RETL 	@0X53		;S
	RETL 	@0X59		;Y
	RETL 	@0X53		;S
	RETL 	@0X20
;=============================================================
GCRAMTAB:
	ADD	PC, A
	RETL 	@0X1F
	RETL 	@0X1F
	RETL 	@0X1F
	RETL 	@0X1F
	RETL 	@0X1F
	RETL 	@0X1F
	RETL 	@0X1F
	RETL 	@0X00
	RETL 	@0X1F
	RETL 	@0X11
	RETL 	@0X0A
	RETL 	@0X04
	RETL 	@0X04
	RETL 	@0X04
	RETL 	@0X04
	RETL 	@0X00
;=======================写LCD命令字A屏===========================
;INPUT: A
;=======================
COMMAND_WA:
	BC	P5,EA
	BC	P5,RS
	MOV	TEM1,A
	MOV	A,P6
	AND	A,@0X0F
	MOV	TEM2,A
	MOV	A,TEM1
	AND	A,@0XF0
	OR	A,TEM2
	MOV	P6,A
	NOP
	NOP
	BS	P5,EA
	NOP
	NOP
	NOP
	BC	P5,EA
	
	SWAPA	TEM1
	AND	A,@0XF0
	OR	A,TEM2
	MOV	P6,A
	NOP
	NOP
	BS	P5,EA
	NOP
	NOP
	NOP
	BC	P5,EA
	RET
;=======================写LCD数据字A屏===========================
;INPUT: A
;=======================
DATA_WA:
	BC	P5,EA
	BS	P5,RS
	MOV	TEM1,A
	MOV	A,P6
	AND	A,@0X0F
	MOV	TEM2,A
	MOV	A,TEM1
	AND	A,@0XF0
	OR	A,TEM2
	MOV	P6,A
	NOP
	NOP
	BS	P5,EA
	NOP
	NOP
	NOP
	BC	P5,EA
	
	SWAPA	TEM1
	AND	A,@0XF0
	OR	A,TEM2
	MOV	P6,A
	NOP
	NOP
	BS	P5,EA
	NOP
	NOP
	NOP
	BC	P5,EA
	RET
;=======================写LCD命令字B屏===========================
;INPUT: A
;=======================
COMMAND_WB:
	BC	P5,EB
	BC	P5,RS
	MOV	TEM1,A
	MOV	A,P6
	AND	A,@0X0F
	MOV	TEM2,A
	MOV	A,TEM1
	AND	A,@0XF0
	OR	A,TEM2
	MOV	P6,A
	NOP
	NOP
	BS	P5,EB
	NOP
	NOP
	NOP
	BC	P5,EB
	
	SWAPA	TEM1
	AND	A,@0XF0
	OR	A,TEM2
	MOV	P6,A
	NOP
	NOP
	BS	P5,EB
	NOP
	NOP
	NOP
	BC	P5,EB
	RET
;=======================写LCD数据字B屏===========================
;INPUT: A
;=======================
DATA_WB:
	BC	P5,EB
	BS	P5,RS
	MOV	TEM1,A
	MOV	A,P6
	AND	A,@0X0F
	MOV	TEM2,A
	MOV	A,TEM1
	AND	A,@0XF0
	OR	A,TEM2
	MOV	P6,A
	NOP
	NOP
	BS	P5,EB
	NOP
	NOP
	NOP
	BC	P5,EB
	
	SWAPA	TEM1
	AND	A,@0XF0
	OR	A,TEM2
	MOV	P6,A
	NOP
	NOP
	BS	P5,EB
	NOP
	NOP
	NOP
	BC	P5,EB
	RET
;=======================初始化LCD===========================
INIT_LCD:
	CALL	DELAY5MS
	CALL	DELAY5MS
	CALL	DELAY5MS
	CALL	DELAY5MS
	MOV	A,@0X30
	CALL	COMMAND_WA
	MOV	A,@0X30
	CALL	COMMAND_WB
	CALL	DELAY5MS
	CALL	DELAY5MS
	MOV	A,@0X30
	CALL	COMMAND_WA
	MOV	A,@0X30
	CALL	COMMAND_WB
	CALL	DELAY5MS
	CALL	DELAY5MS
	MOV	A,@0X30
	CALL	COMMAND_WA
	MOV	A,@0X30
	CALL	COMMAND_WB
	CALL	DELAY5MS
	CALL	DELAY5MS
	MOV	A,@0X28			;4位数据,2行5x7点阵
	CALL	COMMAND_WA
	MOV	A,@0X28
	CALL	COMMAND_WB
	CALL	DELAY5MS
	MOV	A,@0X08			;关显示
	CALL	COMMAND_WA
	MOV	A,@0X08
	CALL	COMMAND_WB
	CALL	DELAY5MS
	CALL	DELAY5MS
	MOV	A,@0X01			;清显示
	CALL	COMMAND_WA
	MOV	A,@0X01
	CALL	COMMAND_WB
	CALL	DELAY5MS
	MOV	A,@0X06			;光标移动方--右移
	CALL	COMMAND_WA
	MOV	A,@0X06S
	CALL	COMMAND_WB
	CALL	DELAY5MS
	MOV	A,@0X0C			;开显示
	CALL	COMMAND_WA
	MOV	A,@0X0C
	CALL	COMMAND_WB
	CALL	DELAY5MS
;初始化自编字库
	MOV	A,@0X40
	CALL	COMMAND_WA
	MOV	A,@0X40
	CALL	COMMAND_WB
	CALL	DELAY50US
	CLR	S1
WRITE_LP:
	MOV	A,S1
	CALL	GCRAMTAB
	CALL	DATA_WA
	CALL	DELAY50US
	MOV	A,S1
	CALL	GCRAMTAB
	CALL	DATA_WB
	CALL	DELAY50US
	INC	S1
	MOV	A,S1
	XOR	A,@16
	JBS	R3,Z
	JMP	WRITE_LP
	RET
;=======================清数据缓冲区===========================
CLEARSTRING:
	MOV	A,@0X20
	MOV	R4,A
	MOV	A,@32
	MOV	S1,A
AGAIN:
	MOV	A,@0X20
	MOV	R0,A
	INC	R4
	DJZ	S1
	JMP	AGAIN
	CLR	R4
	RET
	
;=======================数据缓冲区初始化========================
INITSTRING:
	CALL    CLEARSTRING
	MOV	A,@0X52
	MOV	0X20,A
	MOV	A,@0X46
	MOV	0X21,A
	MOV	A,@0X41
	MOV	0X27,A
	MOV	A,@0X46
	MOV	0X28,A
	MOV	A,@0X43
	MOV	0X30,A
	MOV	A,@0X48
	MOV	0X30,A

	MOV	A,@0X2E
	MOV	0X3B,A
	MOV	A,@0X4D
	MOV	0X3D,A
	MOV	A,@0X48
	MOV	0X3E,A
	MOV	A,@0X7A
	MOV	0X3F,A
	CLR	R4
	RET
;=======================填充数据缓冲区========================
GETSTRING:
	CALL	CLEARSTRING
	CLR	TM1
SGL:
	INCA	TM1
	MOV	TM2,A
	MOV	A,@0XFF
	MOV	S1,A
SLG:	
	DEC	TM2
	INC	S1
	MOV	A,@0X20
	ADD	A,TM2
	MOV	R4,A
	MOV	A,S1
	CALL	POWERONA
	MOV	R0,A
	MOV	A,TM2
	SUB	A,@0X3F
	MOV	R4,A
	MOV	A,S1
	CALL	POWERONB
	MOV	R0,A
	MOV	A,TM1
	XOR	A,S1
	JBS	R3,Z
	JMP	SLG
	CALL	DISPLAYALL
	
	MOV	A,@0X32		;延时0.5S
	MOV	S2,A
STW:	CALL	DELAY5MS
	DJZ	S2
	JMP	STW

	CALL	DELAY5MS

	INC	TM1
	MOV	A,TM1
	XOR	A,@16
	JBS	R3,Z
	JMP	SGL
	CLR	R4
	RET
;=======================LCD数据显示===========================
DISPLAYALL:
	MOV	A,@0X80
	CALL	COMMAND_WA
	MOV	A,@0X80
	CALL	COMMAND_WB
	CALL	DELAY50US
	CALL	DELAY50US
	MOV	A,@LINE1		;缓冲区首址
	MOV	R4,A
LP_L1:
	MOV	A,R0
	CALL	DATA_WA
	MOV	A,R0
	CALL	DATA_WB
	CALL	DELAY50US
	INC	R4
	MOV	A,R4
	XOR 	A,@0X30
	JBS	R3, 2
	JMP	LP_L1
	CALL	DELAY50US

	MOV	A,@0XC0
	CALL	COMMAND_WA
	MOV	A,@0XC0
	CALL	COMMAND_WB
	CALL	DELAY50US
	CALL	DELAY50US
LP_L2:
	MOV	A,R0
	CALL	DATA_WA
	MOV	A,R0
	CALL	DATA_WB
	CALL	DELAY50US
	INC	R4
	MOV	A,R4
	XOR 	A,@0X40
	JBS	R3, 2
	JMP	LP_L2
	CALL	DELAY50US
	CLR	R4
	RET

;============================Delay=============================
DELAY5MS:						;延时5mS
	MOV	A, @10
	MOV	LP_CNT0, A
P0_DLY:
	NOP
	MOV	A, @199
	MOV	LP_CNT1, A
P0_LP:
	NOP
	NOP
	NOP
	DJZ	LP_CNT1			;5 X 199 (LP_CNT1 = 199) = 995
	JMP	P0_LP			;5  +  995(P0_LP所有的指令) = 1000
	DJZ	LP_CNT0			;1000 X 10 (LP_CNT0 = 2) = 10000
	JMP	P0_DLY			;10000 + 1 (CALL)+ 1(RET) + 2(2MOV) + 1(CALL) = 10005
	RET						;10005 * 0.5 = 5.0025(mS)
;------------------------------------------
DELAY50US:						;延时50uS
		MOV	A,@48
		MOV	LP_CNT0,A
DELAY_LOOP:
		DJZ	LP_CNT0
		JMP	DELAY_LOOP
		RET
;------------------------------------------
DELAY6US:						;延时6uS
		MOV	A,@4
		MOV	LP_CNT0,A
SHORT:
		DJZ	LP_CNT0
		JMP	SHORT
		RET
		
;====================================================================================
DISAF:
	MOV	A,@0X80		;
	SUB	A,TMP
	JBS	R3,C
	JMP	CH_AF2
	JBC	FG,0
	JMP	AF1B
	MOV	A,@0X00
	MOV	0X27,A
	MOV	0X26,A
	MOV	0X25,A
	MOV	0X24,A
	RET
AF1B:	MOV	A,@0X00
	MOV	0X37,A
	MOV	0X36,A
	MOV	0X35,A
	MOV	0X34,A
	RET
CH_AF2:
	MOV	A,@0X65		;
	SUB	A,TMP
	JBS	R3,C
	JMP	CH_AF3
	JBC	FG,0
	JMP	AF2B
	MOV	A,@0X20
	MOV	0X27,A
	MOV	A,@0X00
	MOV	0X26,A
	MOV	0X25,A
	MOV	0X24,A
	RET
AF2B:	MOV	A,@0X20
	MOV	0X37,A
	MOV	A,@0X00
	MOV	0X36,A
	MOV	0X35,A
	MOV	0X34,A
	RET
CH_AF3:
	MOV	A,@0X45		;50
	SUB	A,TMP
	JBS	R3,C
	JMP	CH_AF4
	JBC	FG,0
	JMP	AF3B
	MOV	A,@0X20
	MOV	0X27,A
	MOV	0X26,A
	MOV	A,@0X00
	MOV	0X25,A
	MOV	0X24,A
	RET
AF3B:	MOV	A,@0X20
	MOV	0X37,A
	MOV	0X36,A
	MOV	A,@0X00
	MOV	0X35,A
	MOV	0X34,A
	RET
CH_AF4:
	MOV	A,@0X30		;
	SUB	A,TMP
	JBS	R3,C
	JMP	CH_AF5
	JBC	FG,0
	JMP	AF4B
	MOV	A,@0X20
	MOV	0X27,A
	MOV	0X26,A
	MOV	0X25,A
	MOV	A,@0X00
	MOV	0X24,A
	RET
AF4B:	MOV	A,@0X20
	MOV	0X37,A
	MOV	0X36,A
	MOV	0X35,A
	MOV	A,@0X00
	MOV	0X34,A
	RET
CH_AF5:
	JBC	FG,0
	JMP	AF5B
	MOV	A,@0X20
	MOV	0X24,A
	MOV	0X25,A
	MOV	0X26,A
	MOV	0X27,A
	RET
AF5B:	MOV	A,@0X20
	MOV	0X34,A
	MOV	0X35,A
	MOV	0X36,A
	MOV	0X37,A
	RET
;====================================================================================
DISFQA:
	
	
	
;============================================================================
;====================================MAIN====================================
;============================================================================
INITIAL:
	MOV	A,@0B11110000	;
	IOW	IOCB
	MOV	A,@0B11111111	;
	IOW	IOCC
	MOV	A,@0B11111111	;
	IOW	IOCD
	MOV	A,@0B00001111	;
	IOW	P5
	MOV	A,@0B00001111	;
	IOW	P6
	MOV	A,@0B00001111
	MOV	P6,A
	MOV	A,@0B00001111
	MOV	P5,A
	DISI

	CALL	DELAY5MS
	CALL	DELAY5MS
	CALL	DELAY5MS
	CALL	DELAY5MS
	
	CALL	INIT_LCD	;初始化LCD
	CALL	DELAY5MS
	
	CALL	GETSTRING
	
	MOV	A,@0XFF		;延时1S
	MOV	S2,A
WOO:	CALL	DELAY5MS
	DJZ	S2
	JMP	WOO
	
	CALL	INITSTRING
	MOV	A,@0XFF
	MOV	CHANELB,A

WHILE:
	MOV	A,P5		;检测K1-K5(0-31)
	AND	A,@0X07
	MOV	CHANEL,A
	XOR	A,CHANELB
	JBC	R3,Z
	JMP	CH_ANT1
	MOV	A,CHANEL
	MOV	CHANELB,A
	
	BC	R3,C
	RLC	CHANEL
	MOV	A,CHANEL
	CALL	TABLE
	MOV	S3,A
	SWAPA	S3
	AND	A,@0X0F
	ADD	A,@0X30
	MOV	0X28,A			;BIT8频点数据1
	MOV	A,S3
	AND	A,@0X0F
	ADD	A,@0X30
	MOV	0X29,A			;BIT9频点数据2
	INCA	CHANEL
	CALL	TABLE
	MOV	S3,A
	SWAPA	S3
	AND	A,@0X0F
	ADD	A,@0X30
	MOV	0X2A,A			;BIT10频点数据3
	MOV	A,S3
	AND	A,@0X0F
	ADD	A,@0X30
	MOV	0X2C,A			;BIT12频点数据4

	MOV	A,CHANEL
	ADD	A,@32
	MOV	CHANEL,A
	CALL	TABLE
	MOV	S3,A
	SWAPA	S3
	AND	A,@0X0F
	ADD	A,@0X30
	MOV	0X38,A			;BIT8频点数据1
	MOV	A,S3
	AND	A,@0X0F
	ADD	A,@0X30
	MOV	0X39,A			;BIT9频点数据2
	INCA	CHANEL
	CALL	TABLE
	MOV	S3,A
	SWAPA	S3
	AND	A,@0X0F
	ADD	A,@0X30
	MOV	0X3A,A			;BIT10频点数据3
	MOV	A,S3
	AND	A,@0X0F
	ADD	A,@0X30
	MOV	0X3C,A			;BIT12频点数据4
;-------------------------------------------------
CH_ANT1:
	JBS	P6,ANT1
	JMP	ANT_10
	MOV	A,@0X41
	MOV	0X20,A
	JMP	CH_ANT2
ANT_10:	MOV	A,@0X20
	MOV	0X20,A
CH_ANT2:JBS	P6,ANT2
	JMP	ANT_20
	MOV	A,@0X42
	MOV	0X30,A
	JMP	INIADC
ANT_20:	MOV	A,@0X20
	MOV	0X30,A

INIADC:
	MOV	A,@0B00001100	;工作电压作参考,AD0-AD3模拟输入,T=fosc/4
	IOW	ADCONC
	CLR	R_F
	MOV	A,ADCONR
	AND	A,@0XF8		;AN0(AF1)输入
	MOV	ADCONR,A
	BS	ADCONR,ADPD	;启动AD采样
	MOV	A,@0B00000000
	IOW	GCON		;关增溢放大器
	CALL	DELAY6US
	BS	ADCONR,ADRUN	;启动AD转换
CH_AFA:	JBC	ADCONR,ADRUN
	JMP	CH_AFA
;	CALL	DELAY6US
;	CALL	DELAY6US
;	CALL	DELAY6US
	BC	ADCONR,ADPD	;关闭AD采样
	MOV	A,ADDATA
	MOV	TMP,A
	BC	FG,0
	CALL	DISAF
	
	CLR	R_F
	MOV	A,ADCONR
	AND	A,@0XF8
	OR	A,@0X02		;AD2(RF1)输入
	MOV	ADCONR,A
	BS	ADCONR,ADPD	;启动AD采样
	CALL	DELAY6US
	BS	ADCONR,ADRUN	;启动AD转换
CH_AFB:	JBC	ADCONR,ADRUN
	JMP	CH_AFB
;	CALL	DELAY6US
;	CALL	DELAY6US
;	CALL	DELAY6US
	BC	ADCONR,ADPD	;关闭AD采样
	MOV	A,ADDATA
	MOV	TMP,A
	BS	FG,0
	CALL	DISAF
	MOV	A,@0B00000000	;AD0模拟输入,AD1-AD7O数字I/O输入,T=fosc/4
	IOW	ADCONC
	NOP
	CALL	DISPLAYALL
	JMP	WHILE
	END

⌨️ 快捷键说明

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