LCD1602驱动-89C52RC-汇编
$INCLUDE(STC89.INC)ORG 0000H
LJMP F_MAIN
T_TestString: DB "STC89C52RC",0
F_MAIN:
MOV SP,#7FH
LCALL F_LCD1602_Init
MOV R7,#0
MOV R6,#0
LCALL F_LCD1602_SetShowAddr
MOV A,#'A'
LCALL F_LCD1602_ShowChar
MOV A,#'B'
LCALL F_LCD1602_ShowChar
MOV A,#'C'
LCALL F_LCD1602_ShowChar
MOV R7,#13
MOV R6,#0
LCALL F_LCD1602_SetShowAddr
MOV A,#'E'
LCALL F_LCD1602_ShowChar
MOV A,#'F'
LCALL F_LCD1602_ShowChar
MOV A,#'G'
LCALL F_LCD1602_ShowChar
MOV R7,#13
MOV R6,#1
LCALL F_LCD1602_SetShowAddr
MOV A,#'H'
LCALL F_LCD1602_ShowChar
MOV A,#'I'
LCALL F_LCD1602_ShowChar
MOV A,#'J'
LCALL F_LCD1602_ShowChar
MOV R7,#0
MOV R6,#1
LCALL F_LCD1602_SetShowAddr
MOV DPTR,#T_TestString
LCALL F_LCD1602_ShowString
L_LOOP:
SJMP L_LOOP
DELAY100MS: ;@11.0592MHz
PUSH 30H
PUSH 31H
MOV 30H,#180
MOV 31H,#68
NEXT:
DJNZ 31H,NEXT
DJNZ 30H,NEXT
POP 31H
POP 30H
RET
;引脚定义
LCD1602_RS EQU P3.5
LCD1602_RW EQU P3.6
LCD1602_EN EQU P3.4
LCD1602_DATAEQU P0
; 功能描述: LCD1602 读取状态
; 入口参数:
; 出口参数: A: 状态
; 影响资源:
; 堆栈需求:
; 示 例1:
F_LCD1602_ReadState:
MOV LCD1602_DATA,#0FFH ;释放数据总线
CLR LCD1602_RS
SETBLCD1602_RW
;>30nS
SETBLCD1602_EN ;TA
;>100nS
MOV A,LCD1602_DATA
CLR LCD1602_EN ;TB
;TA + TB = >400nS
RET
; 功能描述: LCD1602 写入命令
; 入口参数: A: 命令
; 出口参数:
; 影响资源:
; 堆栈需求:
; 示 例1:
F_LCD1602_WriteCmd:
PUSHACC
L_LCD1602_WriteCmd_CheckBusy:
LCALL F_LCD1602_ReadState
ANL A,#80H
JNZ L_LCD1602_WriteCmd_CheckBusy ;检测 1602 液晶如果忙,等待
POP ACC
CLR LCD1602_RS
CLR LCD1602_RW
MOV LCD1602_DATA,A
;>40nS
SETBLCD1602_EN
;>150nS
CLR LCD1602_EN
;1->0->1: >400nS
RET
; 功能描述: LCD1602 写入数据
; 入口参数: A: 数据
; 出口参数:
; 影响资源:
; 堆栈需求:
; 示 例1:
F_LCD1602_WriteData:
PUSHACC
L_LCD1602_WriteData_CheckBusy:
LCALL F_LCD1602_ReadState
ANL A,#80H
JNZ L_LCD1602_WriteData_CheckBusy ;检测 1602 液晶如果忙,等待
POP ACC
SETBLCD1602_RS
CLR LCD1602_RW
MOV LCD1602_DATA,A
;>40nS
SETBLCD1602_EN
;>150nS
CLR LCD1602_EN
;1->0->1: >400nS
RET
; 功能描述: LCD1602 初始化
; 入口参数:
; 出口参数:
; 影响资源:
; 堆栈需求:
; 示 例1:
F_LCD1602_Init:
CLR LCD1602_EN
LCALL DELAY100MS
MOV A,#38H ;设置16*2显示,5*7点阵,8位数据接口
LCALL F_LCD1602_WriteCmd
MOV A,#0CH ;开显示
LCALL F_LCD1602_WriteCmd
MOV A,#06H ;读写一字节后地址指针加1
LCALL F_LCD1602_WriteCmd
MOV A,#01H ;清除显示
LCALL F_LCD1602_WriteCmd
RET
; 功能描述: LCD1602 设置显示地址
; 入口参数: R7: X 显示横坐标(向右为正方向) 0...16
; R6: Y 显示纵坐标(向下为正方向) 0..1
; 出口参数:
; 影响资源:
; 堆栈需求:
; 示 例1:
F_LCD1602_SetShowAddr:
PUSHACC
MOV A,#80H
CJNER6,#1,L_LCD1602_SetShowAddr_Y0
ADD A,#40H
L_LCD1602_SetShowAddr_Y0:
ADD A,R7
LCALL F_LCD1602_WriteCmd
POP ACC
RET
; 功能描述: LCD1602 显示字符
; 入口参数: A: 字符
; 出口参数:
; 影响资源:
; 堆栈需求:
; 示 例1:
F_LCD1602_ShowChar:
LCALL F_LCD1602_WriteData
RET
; 功能描述: LCD1602 显示字符串
; 入口参数: DPTR: 字符串地址
; 出口参数:
; 影响资源:
; 堆栈需求:
; 示 例1:
F_LCD1602_ShowString:
PUSHACC
L_LCD1602_ShowString_Check:
CLR A
MOVCA,@A+DPTR ;获取当前字符
JZ L_LCD1602_ShowString_Exit;检查字符串的末尾
INC DPTR ;递增字符串指针
LCALL F_LCD1602_WriteData ;发送当前字符
SJMPL_LCD1602_ShowString_Check ;检查下一步
L_LCD1602_ShowString_Exit:
POP ACC
RET
END
用汇编有点费脑子{:4_197:}{:4_167:} 感觉引脚定义和放在前面会好点。放程序中间还有点不好找。 soma 发表于 2024-9-22 08:26
感觉引脚定义和放在前面会好点。放程序中间还有点不好找。
想模块化的,汇编不知道怎么写 用管脚兼容的 8051U 来刷 LCD12864, LCD1602,
这样资源多,梁工亲自带大家点屏
8051U 数据手册
深圳国芯人工智能有限公司-产品_AI8051U系列 (stcai.com)
并口LCD12864用DMA直接刷新@AI8051U, 不占用CPU时间,管脚兼容 89C52 - TFT/LCD12864/LCD1602/红外遥控 国芯技术交流网站 - AI32位8051交流社区 (stcaimcu.com)
AI8051U驱动1.44寸黑白点阵LCD12864实验程序-SPI-DMA刷整屏523us,超高帧频 - DMA支持: QSPI, SPI, I2S, I2C, 4组串口, i8080/MC6800-TFT 国芯技术交流网站 - AI32位8051交流社区 (stcaimcu.com)
自从用了c,再也不愿意用汇编了,2004年我用汇编写过12K长的程序。写了45天。 邮箱 发表于 2024-9-22 10:56
想模块化的,汇编不知道怎么写
定义一些寄存器,参数赋值给寄存器,然后LCALL,一般都这么搞的
页:
[1]