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

📄 lcd12864_serial_char_img_cgram.asm

📁 好东西共享给大家,液晶显示的1502的,单片机51系列
💻 ASM
📖 第 1 页 / 共 2 页
字号:
;12864的8位控制方式
;内置8192个16*16点阵字符,128个16*8个ASCII字符,可显示8*4行行16*16点汉字
;4或8位并行控制
;8位通讯的设置,PSB端要置1,E在通信过程中一直要有效
;显示图形时,先写入水平(0到15)与垂直(0到32)的坐标,再写入两个8位的资料

    ;控制位定义
    CS EQU P2.0
    SID EQU P2.1
    SCLK  EQU P2.2
    PSB EQU P2.3
    RST EQU P2.5
    
    LCD_X EQU 20H    ;GDRAM水平坐标
    LCD_Y EQU 21H    ;GDRAM垂直坐标
;--------------------------
    ORG 0000H
    AJMP MAIN
;--------------------------
    ORG 0030H
MAIN:
    MOV SP,#5FH
    LCALL LCD12864_INI    ;初始化LCD
    
    MOV DPTR,#CGRAM1      ;将装入第一个CGRAM1
    MOV A,#40H
    LCALL LCD12864_CGRAM  ;
    
    MOV DPTR,#CGRAM2     ;将装入第二个CGRAM2
    MOV A,#50H
    LCALL LCD12864_CGRAM
    
    MOV DPTR,#CGRAM3    ;将装入第三个CGRAM3
    MOV A,#60H
    LCALL LCD12864_CGRAM
    
    MOV DPTR,#CGRAM4    ;将装入第四个CGRAM4
    MOV A,#70H
    LCALL LCD12864_CGRAM
    
    ;------------------------
MAIN_LP:
    LCALL LCD12864_CHRS   ;将四行字都显示出来

    MOV R4,#0FFH
    LCALL DELAYMS

    MOV R4,#0FFH
    LCALL DELAYMS

    MOV R4,#0FFH
    LCALL DELAYMS
   ;--------------------------
    MOV DPTR,#DIS_IMG     ;将DPTR所指的图片都装入GDRAM并显示出来
    LCALL LCD12864_IMG

    MOV R4,#0FFH
    LCALL DELAYMS

    MOV R4,#0FFH
    LCALL DELAYMS

    MOV R4,#0FFH
    LCALL DELAYMS
    ;-------------------------
    LCALL LCD12864_CGRAM_SHOW
    
    MOV R4,#0FFH
    LCALL DELAYMS

    MOV R4,#0FFH
    LCALL DELAYMS

    MOV R4,#0FFH
    LCALL DELAYMS
    ;-------------------------
    AJMP MAIN_LP
    ;END OF MAIN
;*********************************LCD12864**********************************************
;初始化程序,写指令,写数据,写行,忙检测
;------------------------
LCD12864_INI:
;初始化
  CLR PSB      ;串口方式
  SETB CS       ;令LCD12864被选中,高电平有效
  CLR SCLK      ;时钟置于低电平
  
  CLR RST       ;复位
  MOV R4,#60
  LCALL DELAYMS
  SETB RST
  NOP

  
  MOV B,#20H    ;基本指令操作(当并行时是4位并口方式,如果8位就是30H)
  LCALL LCD12864_WR_OP_NO_CHK
  
  MOV A,#01H    ;清屏
  LCALL LCD12864_WR_OP
  
  MOV A,#06H    ;指定资料写入或读取时,光标移动方向,AC自加1
  LCALL LCD12864_WR_OP
  
  MOV A,#0CH    ;开显示,关光标,不闪烁
  LCALL LCD12864_WR_OP
  
  CLR CS
  RET
;-----------------------失败,下面的程序没有效,不知道ICON RAM是怎么用的,理解有误
LCD12864_IRAM_SHOW:
;将"我爱你!"字符分别写在IRAM里并显示出来
    MOV A,#01H   ;清屏
    LCALL LCD12864_WR_OP
    
    MOV R4,#01H
    LCALL DELAYMS
    
    MOV A,#80H   ;移动到第一行
    LCALL LCD12864_WR_OP
    
    MOV A,#34H   ;用扩展命令
    LCALL LCD12864_WR_OP
    
    MOV A,#02H   ;允许输入IRAM地址
    LCALL LCD12864_WR_OP
    
    MOV A,#40H  ;输入IRAM地址,一个ICON RAM有16个双字节构成
    LCALL LCD12864_WR_OP
    
    MOV DPTR,#CGRAM1    ;字节储存空间
    MOV R1,#32
LIS_LP:
    CLR A
    MOVC A,@A+DPTR
    LCALL LCD12864_WR_DAT
    INC DPTR
    DJNZ R1,LIS_LP  ;输入16个双字节,即输入32个字节
    
   ; MOV A,#30H      ;用基本指令
   ; LCALL LCD12864_WR_OP
    RET
;-----------------------
LCD12864_CGRAM:
;入口参数1--DPTR,有16个双字节的用户自定义符号的CGRAM参数表的入口
;入口参数2--A,要写入CGRAM的哪一组(40H,50H,60H或70H可选)
;40H到4FH在0000显示   
;50H到5FH在0002显示    
;60H到6FH在0004显示    
;70H到7FH在0006显示    
;返回:无
    LCALL LCD12864_WR_OP   ;将要CGRAM的首地址写入
    MOV R1,#32
LCRAM_LP:
    CLR A
    MOVC A,@A+DPTR
    LCALL LCD12864_WR_DAT  ;写入第一个字节
    
    INC DPTR
    DJNZ R1,LCRAM_LP        ;一直到写入16个双字节
    RET
;------------------------
LCD12864_CGRAM_SHOW:
;将写入的CGRAM显示在第一行开始的四个单元
    MOV A,#01H              ;清屏
    LCALL LCD12864_WR_OP
    
    MOV R4,#01H
    LCALL DELAYMS
    
    MOV A,#80H             ;AC移动到第一行第一列
    LCALL LCD12864_WR_OP
    ;------
    MOV A,#00H             ;写入CGRAM双字节地址的第一个字节
    LCALL LCD12864_WR_DAT

    MOV A,#00H             ;写入CGRAM双字节地址的第二个字节
    LCALL LCD12864_WR_DAT
    ;------
    MOV A,#00H             ;写入CGRAM双字节地址的第一个字节
    LCALL LCD12864_WR_DAT

    MOV A,#02H             ;写入CGRAM双字节地址的第二个字节
    LCALL LCD12864_WR_DAT
    ;------
    MOV A,#00H             ;写入CGRAM双字节地址的第一个字节
    LCALL LCD12864_WR_DAT

    MOV A,#04H             ;写入CGRAM双字节地址的第二个字节
    LCALL LCD12864_WR_DAT
    ;------
    MOV A,#00H             ;写入CGRAM双字节地址的第一个字节
    LCALL LCD12864_WR_DAT

    MOV A,#06H             ;写入CGRAM双字节地址的第二个字节
    LCALL LCD12864_WR_DAT
    ;--------------------
    ;下面送字库的代码,显示我爱你!
    MOV DPTR,#DDROM
    MOV R1,#8
LCS_LP:
    CLR A
    MOVC A,@A+DPTR
    LCALL LCD12864_WR_DAT
    INC DPTR
    DJNZ R1,LCS_LP
    RET
;------------------------
LCD12864_IMG:
;把DPTR所指向的表里面的512个双字节数据装进GDRAM里,使其显示出来
;入口参数:DPTR
;返回:无
    MOV A,#01H               ;清除屏幕
    LCALL LCD12864_WR_OP
    
    MOV R4,#01H
    LCALL DELAYMS
    
    MOV A,#34H               ;选择扩充指令,在写入GDRAM时要关闭绘图显示
    LCALL LCD12864_WR_OP
    
    MOV LCD_X,#80H
    MOV LCD_Y,#80H      ;设定坐标在(0,0)处
    
    MOV R6,#2        ;上下半区,写后上半区后R6为1,写完下半区后R6为0,由此判断结束
    MOV R2,#32       ;写上(下)半区共32行
LI_LP2:
    MOV A,LCD_Y      ;先写垂直坐标
    LCALL LCD12864_WR_OP
    
    MOV A,LCD_X      ;后写水平坐标,返回开始处
    LCALL LCD12864_WR_OP
    
    MOV R1,#8        ;一行要写入8个双字节
LI_LP1:
    CLR A            ;写第一个字节
    MOVC A,@A+DPTR
    LCALL LCD12864_WR_DAT
    
    CLR A            ;写第二个字节
    INC DPTR
    MOVC A,@A+DPTR
    LCALL LCD12864_WR_DAT
    
    INC DPTR
    DJNZ R1,LI_LP1  ;写完一行
    
    MOV A,LCD_Y     ;使垂直坐标增加1,因为LCD不会自动对垂直坐标计算,只能在程序中作计算
    INC A
    MOV LCD_Y,A
    
    DJNZ R2,LI_LP2  ;写完上半区
    
    MOV LCD_X,#88H  ;指向下半区第一列
    MOV LCD_Y,#80H  ;重新回到第一行
    MOV R2,#32      ;再次写入32行
    
    DJNZ R6,LI_LP2 
    
    MOV A,#36H      ;扩充指令,打开绘图显示
    LCALL LCD12864_WR_OP
    
    MOV A,#30H     ;改回基本指令,并关闭绘图显示
    LCALL LCD12864_WR_OP
    
    RET
    
;-----------------------
LCD12864_CHRS:
;将表中的四行字都显示出来
    
    MOV A,#01H
    LCALL LCD12864_WR_OP

⌨️ 快捷键说明

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