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

📄 lcd1602_driver.asm

📁 ATMEGA16芯片+HS0038B红外接收头组成的遥控器测试程序
💻 ASM
字号:
;--------------------------------------------------------------------------------------------------------------
;LCD1602 ASCII 码定义	
.EQU	K_0             =0x30		;1
.EQU	K_1             =K_0+1
.EQU	K_2             =K_1+1
.EQU	K_3             =K_2+1
.EQU	K_4             =K_3+1
.EQU	K_5             =K_4+1
.EQU	K_6             =K_5+1
.EQU	K_7             =K_6+1
.EQU	K_8             =K_7+1
.EQU	K_9             =K_8+1

.EQU	K_a             =0x61
.EQU	K_b             =K_a+1
.EQU	K_c             =K_b+1
.EQU	K_d             =K_c+1
.EQU	K_e             =K_d+1
.EQU	K_f             =K_e+1
.EQU	K_g             =K_f+1
.EQU	K_h             =K_g+1
.EQU	K_i             =K_h+1
.EQU	K_j             =K_i+1
.EQU	K_k             =K_j+1
.EQU	K_l             =K_k+1
.EQU	K_m             =K_l+1
.EQU	K_n             =K_m+1
.EQU	K_o             =K_n+1
.EQU	K_p             =K_o+1
.EQU	K_q             =K_p+1
.EQU	K_r             =K_q+1
.EQU	K_s             =K_r+1
.EQU	K_t             =K_s+1
.EQU	K_u             =K_t+1
.EQU	K_v             =K_u+1
.EQU	K_w             =K_v+1
.EQU	K_x             =K_w+1
.EQU	K_y             =K_x+1
.EQU	K_z             =K_y+1

.EQU	K_CapA             =0x41
.EQU	K_CapB             =K_CapA+1
.EQU	K_CapC             =K_CapB+1
.EQU	K_CapD             =K_CapC+1
.EQU	K_CapE             =K_CapD+1
.EQU	K_CapF             =K_CapE+1
.EQU	K_CapG             =K_CapF+1
.EQU	K_CapH             =K_CapG+1
.EQU	K_CapI             =K_CapH+1
.EQU	K_CapJ             =K_CapI+1
.EQU	K_CapK             =K_CapJ+1
.EQU	K_CapL             =K_CapK+1
.EQU	K_CapM             =K_CapL+1
.EQU	K_CapN             =K_CapM+1
.EQU	K_CapO             =K_CapN+1
.EQU	K_CapP             =K_CapO+1
.EQU	K_CapQ             =K_CapP+1
.EQU	K_CapR             =K_CapQ+1
.EQU	K_CapS             =K_CapR+1
.EQU	K_CapT             =K_CapS+1
.EQU	K_CapU             =K_CapT+1
.EQU	K_CapV             =K_CapU+1
.EQU	K_CapW             =K_CapV+1
.EQU	K_CapX             =K_CapW+1
.EQU	K_CapY             =K_CapX+1
.EQU	K_CapZ             =K_CapY+1

.EQU	K_DY            =0x27
.EQU	K_DH            =0x2C	;,
.EQU	K_JH            =0x2E		;.
.EQU	K_XG            =0x2F		;/
.EQU	K_MI            =0x2D		;-
.EQU	K_EQ            =0x3D
.EQU	K_sp            =0x20
.EQU	K_FH            =0x3B

.EQU	K_NA			=0x29		;)
.EQU	K_EX			=0x21		;!
.EQU	K_AN			=0x26		;@
.EQU	K_CS			=0x23		;#
.EQU	K_DO			=0x24		;$
.EQU	K_PE			=0x25		;%
.EQU	K_AD			=0x26		;&
.EQU	K_XH			=0x2A	;*
.EQU	K_PA			=0x28		;(
.EQU	K_SY            	=0x22		;"
.EQU	K_SM            	=0x3C		;<
.EQU	K_BG            	=0x3E		;>
.EQU	K_QS            	=0x3F		;?
.EQU	K_BR            	=0x5F		;_
.EQU	K_PL            	=0x2B		;+
.EQU	K_MH            	=0x3A		;:
.EQU	K_LKH            	=0x5B		;[
.EQU	K_RKH           	=0x5D		;]


;--------------------------------------------------------------------------------------------------------------
	.EQU 	LCM_RS	=5	;PB.5 =0命令	=1数据
	.EQU	LCM_RW	=6	;PB.6 =0写		=1读
	.EQU	LCM_E		=7	;PB.7 =1

;********************************************************************************************************************
;** 程序名称: WriteCommandLCM
;** 功能描述: 写命令到LCM摸块
;** 输	入: temp6
;
;** 输	出:无
;********************************************************************************************************************/
WriteCommandLCM:
		PUSH	temp6
		RCALL	ReadStatusLCM		;检测忙

		LDI	temp1,0xFF			;=0输入 =1输出
		OUT	DDRA,temp1
		POP	temp6

		OUT	PORTA,temp6

		CBI	PORTB,LCM_RS		;LCM_RS =0
		RCALL	Delay_P

		CBI	PORTB,LCM_RW		;LCM_RW =0
		RCALL	Delay_P

		CBI	PORTB,LCM_E			;LCM_E =0
		RCALL	Delay_P
		NOP
		NOP
		SBI	PORTB,LCM_E			;LCM_E =1
		RCALL	Delay_P
		RET

;********************************************************************************************************************
;** 程序名称: WriteDataLCM
;** 功能描述: 写数据到LCM摸块
;** 输	入: temp6
;
;** 输	出:无
;********************************************************************************************************************/
WriteDataLCM:
		PUSH	temp6
		RCALL	ReadStatusLCM		;检测忙

		LDI	temp1,0xFF			;=0输入 =1输出
		OUT	DDRA,temp1

		POP	temp6
		OUT	PORTA,temp6

		SBI	PORTB,LCM_RS		;LCM_RS =1
		RCALL	Delay_P

		CBI	PORTB,LCM_RW		;LCM_RW =0
		RCALL	Delay_P

		CBI	PORTB,LCM_E			;LCM_E =0
		RCALL	Delay_P

		NOP
		NOP
		SBI	PORTB,LCM_E			;LCM_E =1
		RCALL	Delay_P
		RET


;********************************************************************************************************************
;** 程序名称: ReadDataLCM
;** 功能描述: 读数据
;** 输	入: 无

;** 输	出:temp6
;********************************************************************************************************************/
ReadDataLCM:

		LDI	temp1,0x00		;=0输入 =1输出
		OUT	DDRA,temp1
		LDI	temp1,0xFF
		OUT	PORTA,temp1

		SBI	PORTB,LCM_RS	;LCM_RS =1
		SBI	PORTB,LCM_RW	;LCM_RW =1
		CBI	PORTB,LCM_E		;LCM_E =0
		NOP
		NOP
		SBI	PORTB,LCM_E		;LCM_E =1
		IN	temp6,PINA

		LDI	temp1,0xFF		;=0输入 =1输出
		OUT	DDRA,temp1
		RET

;********************************************************************************************************************
;** 程序名称: ReadStatusLCM
;** 功能描述: 读状态
;** 输	入: 无

;** 输	出:temp6
;********************************************************************************************************************/
ReadStatusLCM:
		LDI	temp1,0x00		;=0输入 =1输出
		OUT	DDRA,temp1
		LDI	temp1,0xFF
		OUT	PORTA,temp1

		CBI	PORTB,LCM_RS	;LCM_RS =0
		SBI	PORTB,LCM_RW	;LCM_RW =1
		CBI	PORTB,LCM_E		;LCM_E =0

		LDI	temp1,200
		RCALL	Delay_NOP

		SBI	PORTB,LCM_E		;LCM_E =1

ReadStatusLCM_Wait:			;检测忙信号
		IN	temp1,PINA
		ANDI	temp1,0x80
			BRNE	ReadStatusLCM_Wait
		IN	temp6,PINA
		LDI	temp1,0xFF		;=0输入 =1输出
		OUT	DDRA,temp1
		RET


;********************************************************************************************************************
;** 程序名称: LCMInit
;** 功能描述: LCM初始化
;** 输	入: 无

;** 输	出: 无
;********************************************************************************************************************
LCMInit:
		LDI	temp1,0xFF		;IO口方向 =0输入 =1输出
		OUT	DDRA,temp1

		LDI	temp1,0xFF		;IO口方向 =0输入 =1输出
		OUT	DDRB,temp1

		LDI	temp1,0x00
		OUT	PORTA,temp1

		LDI	temp6,0x38		;三次显示模式设置,不检测忙信号
		RCALL	WriteCommandLCM
		RCALL	Delay_NOP_10ms

		LDI	temp6,0x38		;三次显示模式设置,不检测忙信号
		RCALL	WriteCommandLCM
		RCALL	Delay_NOP_10ms

		LDI	temp6,0x38		;三次显示模式设置,不检测忙信号
		RCALL	WriteCommandLCM
		RCALL	Delay_NOP_10ms

		RCALL	ReadStatusLCM
		LDI	temp6,0x38
		RCALL	WriteCommandLCM	;显示模式设置,开始要求每次检测忙信号


		RCALL	ReadStatusLCM
		LDI	temp6,0x08
		RCALL	WriteCommandLCM	;关闭显示

		RCALL	ReadStatusLCM
		LDI	temp6,0x01
		RCALL	WriteCommandLCM	;显示清屏


		RCALL	ReadStatusLCM
		LDI	temp6,0x06
		RCALL	WriteCommandLCM	;显示光标移动设置

		RCALL	ReadStatusLCM
		LDI	temp6,0x0C
		RCALL	WriteCommandLCM	;显示开及光标设置
		RET

;********************************************************************************************************************
;** 程序名称: DispOneChar
;** 功能描述: 按指定位置显示一个字符
;** 输	入: R_Position_X,R_Position_Y,temp6

;** 输	出: 无
;********************************************************************************************************************
DispOneChar:
		PUSH	temp6

		LDS	temp2,R_Position_X
		ANDI	temp2,0x0F
		STS	R_Position_X,temp2

		LDS	temp1,R_Position_Y
		ANDI	temp1,0x01
		STS	R_Position_Y,temp1	;限制X不能大于15,Y不能大于1
		CPI	temp1,0
			BREQ	DispOneChar_Y0

		ORI	temp2,0x40     		;当要显示第二行时地址码+0x40;

DispOneChar_Y0:
		ORI	temp2,0x80			;算出指令码
		PUSH	temp2

		RCALL	ReadStatusLCM

		POP	temp2
		MOV	temp6,temp2
		RCALL	WriteCommandLCM		;显示开及光标设置

		POP	temp6
		RCALL	WriteDataLCM
		RET
;********************************************************************************************************************
;** 程序名称: DispLCD1602Buf
;** 功能描述: 显示整个LCD1602缓冲区
;** 输	入: R_LCD1602Buf

;** 输	出: 无
;********************************************************************************************************************
DispLCD1602Buf:
		LDI	temp1,0
		STS	R_Position_X,temp1
		STS	R_Position_Y,temp1

		LDI	YL,low(R_LCD1602Buf)
		LDI	YH,high(R_LCD1602Buf)

		CLR	temp5
DispLCD1602Buf_Y0:
		LD	temp6,Y+
		RCALL	DispOneChar

		LDS	temp1,R_Position_X
		INC	temp1
		STS	R_Position_X,temp1
		INC	temp5
		CPI	temp5,16
			BRLO	DispLCD1602Buf_Y0

		LDI	temp1,0
		STS	R_Position_X,temp1
		LDI	temp1,1
		STS	R_Position_Y,temp1

		LDI	YL,low(R_LCD1602Buf+16)
		LDI	YH,high(R_LCD1602Buf+16)

		CLR	temp5
DispLCD1602Buf_Y1:
		LD	temp6,Y+
		RCALL	DispOneChar

		LDS	temp1,R_Position_X
		INC	temp1
		STS	R_Position_X,temp1
		INC	temp5
		CPI	temp5,16
			BRLO	DispLCD1602Buf_Y1

		RET

;********************************************************************************************************************
;** 程序名称: Delay_NOP
;** 功能描述: 延时
;** 输	入: temp1

;** 输	出: 无
;********************************************************************************************************************
Delay_P:
		NOP
		NOP
		NOP
		NOP
		NOP
		NOP
		NOP
		NOP
		NOP
		NOP
		RET

Delay_NOP:
		DEC	temp1
		CPI	temp1,0
			BRNE	Delay_NOP
		RET
;********************************************************************************************************************
;** 程序名称: CLR_LCD_Buf
;** 功能描述:清除LCD1602显示缓充区
;** 输    入: 无
;** 输    出: 无
;********************************************************************************************************************
CLR_LCD_Buf:
		LDI	YL,low(R_LCD1602Buf)	
		LDI	YH,high(R_LCD1602Buf)	
		LDI	temp3,high(R_LCD1602Buf+32)
CLR_LCD_Buf_Loop:
		LDI	temp1,0x02
		ST	Y+,temp1
		CPI	YL,low(R_LCD1602Buf+32)
		CPC	YH,temp3
			BRLO	CLR_LCD_Buf_Loop
		RET

;********************************************************************************************************************
;** 程序名称: Disp_OneChar
;** 功能描述: LCD1602对应显示一个文字
;** 输    入: temp1,R_Position_X,R_Position_Y
;** 输    出: 无
;********************************************************************************************************************
Disp_OneChar:		
		LDI	YL,low(R_LCD1602Buf)		;计算显存地址
		LDI	YH,high(R_LCD1602Buf)
		LDS	temp2,R_Position_Y
		LSL	temp2
		LSL	temp2
		LSL	temp2
		LSL	temp2		
		ADD	YL,temp2
		ADC	YH,R_Value0
		
		LDS	temp2,R_Position_X
		ADD	YL,temp2
		ADC	YH,R_Value0

		ST	Y+,temp1		
		RET				
;********************************************************************************************************************
;** 程序名称: Disp_LineMessage
;** 功能描述: LCD1602对应显示一行文字
;** 输    入: temp1,R_Position_X,R_Position_Y
;** 输    出: 无
;********************************************************************************************************************
Disp_LineMessage:		
		LDI	YL,low(R_LCD1602Buf)		;计算显存地址
		LDI	YH,high(R_LCD1602Buf)
		LDS	temp2,R_Position_Y
		LSL	temp2
		LSL	temp2
		LSL	temp2
		LSL	temp2		
		ADD	YL,temp2
		ADC	YH,R_Value0
				
		LDI	ZH,HIGH(LCD_Message_Tab*2)	;计算数据块地址
		LDI	ZL,LOW(LCD_Message_Tab*2)
		LSL	temp1
		LSL	temp1		
		LSL	temp1		
		LSL	temp1
		ADD	ZL,temp1
		ADC	ZH,R_Value0
		
		LDI	temp2,16
Disp_LineMessage_loop:			
		LPM	temp1,Z+
		ST	Y+,temp1
		DEC	temp2
			BRNE	Disp_LineMessage_loop
		RET		
		
LCD_Message_Tab:
		;www.mcutek.com
		.DB	K_LKH,K_w,K_w,K_w,K_JH,K_m,K_c,K_u,K_t,K_e,K_k,K_JH,K_c,K_o,K_m,K_RKH	
		;LCD1602 Test
		.DB	K_CapM,K_1,K_MH,K_MI,K_XH,K_XH,K_CapH,K_sp
		.DB	K_sp,K_CapM,K_2,K_MH,K_MI,K_XH,K_XH,K_CapH
	
		



	




		
		
		
		
		
		
		
		
		
		
		
		
		
		

⌨️ 快捷键说明

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