邮箱 发表于 2024-9-21 21:26:48

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

邮箱 发表于 2024-9-21 21:30:14

lzl1okOK 发表于 2024-9-21 23:19:26

用汇编有点费脑子{:4_197:}{:4_167:}

soma 发表于 2024-9-22 08:26:58

感觉引脚定义和放在前面会好点。放程序中间还有点不好找。

邮箱 发表于 2024-9-22 10:56:44

soma 发表于 2024-9-22 08:26
感觉引脚定义和放在前面会好点。放程序中间还有点不好找。

想模块化的,汇编不知道怎么写

神农鼎 发表于 2024-9-22 12:29:33

用管脚兼容的 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)



liuzonggong 发表于 2024-9-23 08:57:24

自从用了c,再也不愿意用汇编了,2004年我用汇编写过12K长的程序。写了45天。

晓飛飛 发表于 2024-9-23 09:23:26

邮箱 发表于 2024-9-22 10:56
想模块化的,汇编不知道怎么写

定义一些寄存器,参数赋值给寄存器,然后LCALL,一般都这么搞的
页: [1]
查看完整版本: LCD1602驱动-89C52RC-汇编