📄 lcd1602_driver.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 + -