fzhyw 发表于 2025-11-10 21:49:56

最简单的Lcd12864汇编程序

看到大多数关于lcd12864的程序都是C语言的,今天发一个汇编的程序,用于测试LCD12864。
;以下为8H8K64U调试通过:频率11.0592M

                        P2M1      DATA    095H                        ;端口模式寄存器地址命名
                        P2M0      DATA    096H
                        P3M1      DATA    0B1H
                        P3M0      DATA    0B2H
; LCD12864并行驱动程序 for STC8H8K64U (1T, 11.0592MHz)
; 液晶型号:QC12864B (控制器ST7920)
; 端口定义:
;   数据端口:P2
;   RS控制:P3.5
;   RW控制:P3.4
;   EN控制:P3.2

; 寄存器定义
RS      BIT P3.5   ; 数据/命令选择
RW      BIT P3.4   ; 读/写选择
EN      BIT P3.2   ; 使能信号
LCD_PORT EQU P2      ; 数据端口

                        ORG      0000H
                        JMP MAIN
                        ORG 0300H

MAIN:                                                                        ; 主程序
            MOV   P2M0, #00H
            MOV   P2M1, #00H
            MOV   P3M0, #00H
            MOV   P3M1, #00H

    ; 初始化端口
    MOV LCD_PORT, #0FFH ; P2设为推挽输出
    MOV P2M1, #00H
    MOV P2M0, #0FFH
   
    ; 控制端口初始化
      CLR      RS
      CLR RW
      MOV P2,#30H
      SETB EN
      CLR EN

      MOV P2,#0CH
      SETB EN
      CLR EN
      LCALL DELAY47US
      CLR      RS
      CLR RW
      MOV P2,#80H
      SETB EN
      CLR EN
      LCALL DELAY47US
      
      SETB RS
      CLR RW
      MOV P2,#'c'
      SETB EN
      CLR EN
      LCALL DELAY47US      
    SJMP $                              ;主循环
      
DELAY47US:                        ;@11.0592MHz
      PUSH      30H
      MOV                30H,#101    ;延时程序,最少是101,改成100就显不了!
NEXT:
      DJNZ      30H,NEXT
      POP                30H
      RET

END

fzhyw 发表于 2025-11-11 17:44:59

;===============================================================
;STC8H8K64U 驱动 LCD12864(ST7920)51汇编程序
;数据口:P2,控制口:P3.2(EN), P3.4(RW), P3.5(RS)
;直接连接
;===============================================================
;以下为8H8K64U调试通过:频率11.0592M
                        P0M1                DATA        093H
                        P0M0                DATA        094H
                        P2M1      DATA    095H                        ;端口模式寄存器地址命名
                        P2M0      DATA    096H
                        P3M1      DATA    0B1H
                        P3M0      DATA    0B2H
                               
RS      BITP3.5      ; 命令/数据选择
RW      BITP3.4      ; 读/写选择
EN      BITP3.2      ; 使能

      ORG0000H
      SJMP MAIN

;-------- 延时子程序 -----------------------------------------
DELAY:
      PUSH 07H
      PUSH 06H
      MOVR7,#10
DEL1:   MOVR6,#0
DEL2:   DJNZ R6,$
      DJNZ R7,DEL1
      POP06H
      POP07H
      RET

;-------- 写命令 ------------------------------------------------
WR_CMD:
      CLRRS
      SJMP WR_COMM
;-------- 写数据 ------------------------------------------------
WR_DAT:
      SETB RS
WR_COMM:
      CLRRW             ; 只写
      MOVP2,A         ; 数据送到P2口
      SETB EN
      CLREN
      LCALL DELAY
      RET

;-------- 主程序 ------------------------------------------------
MAIN:
      ;------ STC8H 端口模式设为双向(准双向)
      MOV        P0M1,#0
                MOV        P0M0,#0
                MOVP2M1,#0
      MOVP2M0,#0
      MOVP3M1,#0
      MOVP3M0,#0
               
      ;------ ST7920 初始化
      MOVA,#1CH               ; 功能设定:基本指令、8位并口00011100
      LCALL WR_CMD
      MOVA,#0CH         ; 显示开,游标关
      LCALL WR_CMD
      MOVA,#01H         ; 清屏
      LCALL WR_CMD
      MOVA,#06H         ; 地址自动+1
      LCALL WR_CMD

      ;------ 显示汉字“STC8 单片机”
      MOVDPTR,#HZ_TAB1
      MOVR0,#12          ; 2字节×5字
DISP_LP1:
      CLRA
      MOVC A,@A+DPTR
      LCALL WR_DAT
      INCDPTR
      DJNZ R0,DISP_LP1
;------------------------------               
                MOV        A,#90H
                LCALL WR_CMD
                MOVDPTR,#HZ_TAB2
                MOV        R0,#14
DISP_LP2:
                clr        a
      MOVC A,@A+DPTR
      LCALL WR_DAT
      INCDPTR
      DJNZ R0,DISP_LP2
;------------------------------               
                MOV        A,#88H
                LCALL WR_CMD
                MOVDPTR,#HZ_TAB3
                MOV        R0,#16
DISP_LP3:
                clr        a
      MOVC A,@A+DPTR
      LCALL WR_DAT
      INCDPTR
      DJNZ R0,DISP_LP3
;------------------------------
                MOV        A,#98H
                LCALL WR_CMD
                MOVDPTR,#HZ_TAB4
                MOV        R0,#14
DISP_LP4:
                clr        a
      MOVC A,@A+DPTR
      LCALL WR_DAT
      INCDPTR
      DJNZ R0,DISP_LP4
      SJMP $            ; 停机

;-------- 汉字码表(ST7920 内置编码) -------------------------
HZ_TAB1:
      DB'STC8单片机'
HZ_TAB2:
                DB        '2005年11月11日'
HZ_TAB3:                       
                db        '芯片出厂序列号 : '
HZ_TAB4:                       
                db        'F784C90401461C'       ; ST
      END

fzhyw 发表于 2025-11-11 17:49:29

我觉得汇编语言编写程序,对于硬件的理解会更加深刻。在汇编的基础上去学习,C语言的难点也会更容易突破!

liuzonggong 发表于 2025-11-20 16:58:59

fzhyw 发表于 2025-11-11 17:44
;===============================================================
;STC8H8K64U 驱动 LCD12864(ST7920 ...

SETB EN 和CLR EN之间最好留些时间
页: [1]
查看完整版本: 最简单的Lcd12864汇编程序