打印

LCD1602自定义显示

[复制链接]
2398|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
dww123456|  楼主 | 2010-4-23 17:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
相信高手都知道1602液晶能自定义显示文字图像 但我还是自己总结了一下网上的资料和自己的一些体会 希望给初学者一点帮助,LCD1602是通过先定义LCD1602的CGRAM中的内容,然后就可以同调用DDRAM字符一样来调用自定义好的CGRAM中的字符了
  定义一行的内容,分两步:
1.设定行地址(CGRAM地址)命令:一般为40H
    RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
    0   0   0   1           DATA
  其中:DB5DB4DB3为字符号,也就是将来要显示该字符时要用到的字符地址,DB2DB1DB0为行号。
2.设定CGRAM数据(内容)指令码如下:
    RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
    1   0         字模数据
取模:我们要把所要编写的字符对应于5X8点阵的“字模”提取出来,我们可以通过相关的软件来提取,也可以手工提取。其实就是将点阵的某一行中有显示的点用1表示,无显示的点用0表示,以此形成该行对应的字模数据。设定CGRAM的内容,要一行一行的设定,每一行对应一个CGRAM,5X8点阵,每行5点,共8行,因此要将8行的字模数据都写入CGRAM。细心的朋友可能已经发现:要形成16进制数应该是8位,而每行5位还需要3位啊!?对!的确需要高3位,但是那3位可以是任意的数据,例如我要取“日”字的字模,高3位为000那么相应的字模为 DB 00H 1FH 11H 11H 1FH 11H 11H 1FH如果高3位为111则相应的字模加0E0H为0E0H 0FFH 0F1H 0F1H 0FFH 0F1H 0F1H 0FFH 这两个字模的显示效果是一样的。
1.1602显示时时直接从RAM中取数据显示,即使外部不刷新数据或断开RS RW EN P0口它也能显示
2.如果显示的是CGRAM中的数据,例如现在显示的是地址00H处的数据,这是利用单片机修改CGRAM中的数据,那么不管你以后是否刷新显示,则相应显示00H处的数据自动变为修改后的数据。
以下是我自己用汇编写的测试程序以通过测试  有不足之处欢迎大家共同交流
;@@@@@@@@@@@@@@@LCD1602自定义显示数据测试@@@@@@@@@@@@@@@@@@
;#####################硬件电路#########################
;STC12C5A16S2单片机   LCD1602
;DB0~DB7接P0口   RS接P1.5   RW接P1.6    EN接P1.7
;
;######################################################
;
ORG     0000H    ;程序执行开始地址
LJMP    MAIN    ;跳至MAIN执行
        RS      EQU P1.5
        RW      EQU P1.6
        LCDEN   EQU P1.7
MAIN:
        LCALL INIT  
         MOV A,#40H        ;向CGRAM写数据命令
        LCALL WRITE_LCD_COM
        MOV R1,#64       ;设置循环写次数
        MOV R0,#00H
LOOP1: MOV DPTR,#TABLE  ;查表写入CGRAM数据
        MOV A,R0
        MOVC A,@A+DPTR
        LCALL  WRITE_LCD_DATE
        INC R0
        DJNZ R1,LOOP1
        
START:
        MOV A,#0c0H           ;设置第二行显示
        LCALL WRITE_LCD_COM
        MOV A,#0               ;调用CGRAM中0位置的数据显示
        LCALL  WRITE_LCD_DATE
        MOV A,#1
        LCALL  WRITE_LCD_DATE
        MOV A,#2
        LCALL  WRITE_LCD_DATE
        MOV A,#3
        LCALL  WRITE_LCD_DATE
        MOV A,#4
        LCALL  WRITE_LCD_DATE
        MOV A,#5
        LCALL  WRITE_LCD_DATE
        MOV A,#6
        LCALL  WRITE_LCD_DATE
        MOV A,#7
        LCALL  WRITE_LCD_DATE
       AJMP START
TABLE:
        DB 000H 000H 000H 01FH 000H 000H 000H 000H;"二",
        DB 000H 000H 00EH 000H 000H 01FH 000H 000H;"三",
        DB 01FH 000H 00EH 000H 000H 01FH 000H 000H;"4",
        DB 004H 014H 014H 014H 01FH 004H 004H 004H;"5",
        DB 000H 01EH 010H 010H 01EH 002H 002H 01EH;"6",
        DB 000H 01EH 010H 010H 01EH 012H 012H 01EH;"7",
        DB 000H 01EH 002H 002H 002H 002H 002H 002H;"8",
        DB 000H 01FH 011H 011H 01FH 011H 011H 01FH;"日",
        AJMP START
;************初始化函数 ****************************
INIT:
         ;液晶1602初始化
         CLR RW
         CLR LCDEN
         MOV A,#38H            ;设置16*2显示5*7点阵8位数据端口
         LCALL WRITE_LCD_COM
         MOV A,#0CH            ;开显示不显示光标
         LCALL WRITE_LCD_COM
         MOV A,#06H            ;当读或写入一个字符后地址指针加1且光标加1   当写入1个字符整屏显示不移动
         LCALL WRITE_LCD_COM   ;
         MOV A,#01H            ;显示清屏
         LCALL WRITE_LCD_COM
         RET
;*********************************************************
;**********液晶写命令函数***************************
WRITE_LCD_COM:
              CLR RS          ;拉低RS写命令
              CLR LCDEN       ;拉低使能端准备写命令
              MOV P0,A        ;送命令
              MOV R5,#5       ;延时5毫秒
              LCALL DELAY1MS
              SETB LCDEN       ;拉高使能端写入命令
              MOV R5,#5        ;延时5毫秒
              LCALL DELAY1MS
              CLR LCDEN         ;释放使能端口线
              RET
;****************************************************
;***********液晶写数据函数**************************
WRITE_LCD_DATE:
               SETB RS      ;拉高RS写数据
               CLR LCDEN    ;拉低使能端准备写数据
               MOV P0,A     ;送数据
               MOV R5,#5    ;延时5毫秒
               LCALL DELAY1MS
               SETB LCDEN    ;拉高使能端写入数据
               MOV R5,#5      ;延时5毫秒
               LCALL DELAY1MS
               CLR LCDEN      ;释放使能端口线
               RET
;****************************************************
;**********延时函数1MS*R5 **************************
DELAY1MS:MOV R6,#66
         LCALL DELAY
         DJNZ R5,DELAY1MS
         RET
;***************************************************
;***********延时函数15us*R6*************************
   DELAY:MOV R7,#44
         DJNZ R7,$
         DJNZ R6,DELAY
         RET
;***************************************************

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:DWW 坚持就是胜利 770784441

0

主题

42

帖子

1

粉丝