原创 MCS51的LED1602液晶显示控制电路及程序

2008-10-25 16:56 9351 9 9 分类: MCU/ 嵌入式

1所示是80C51单片机与LED1602的接口电路。其中,74HC573作为地址锁存器。LED1602D0~D78位双向数据线;RS为寄存器选择,高电平选择数据寄存器,低电平选择指令寄存器;R/<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" /><?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />为读写信号线,高电平进行读操作,低电平进行写操作;E端为使能端,当E端由高电平跳变成低电平时,液晶执行命令;通过分析可知,图中LED液晶显示写入指令的地址为7FFCH,写入数据的地址为7FFDH,读出指令的地址为7FFEH


VDD5V正电源;VSS为电源地,接GNDVL为液晶显示器对比度调整端,使用时可以通过10K的电位器调整对比度;BLA为背光电源正级;BLK为背光电源负级,本实验中不使用背光,所以BLABLK悬空。


点击开大图


1LCD160280C51的接口电路


 


1602液晶模块内部的控制器共有11条控制指令,如表1所示。它的读写操作、屏幕和光标的操作都是通过指令编程实现的。


11602液晶模块内部的控制命令




指令


RS


RW


D7


D6


D5


D4


D3


D2


D1


D0


清显示


0


0


0


0


0


0


0


0


0


1


光标返回


0


0


0


0


0


0


0


0


1


*


置输入模式


0


0


0


0


0


0


0


1


I/D


S


显示开/关控制


0


0


0


0


0


0


1


D


C


B


光标或字符移位


0


0


0


0


0


1


S/C


R/L


*


*


置功能


0


0


0


0


1


DL


N


F


*


*


置字符发生存储器地址


0


0


0


1


字符发生存储器地址


置数据存储器地址


0


0


1


显示数据存储器地址


读忙标志或地址


0


1


BF


计数器地址


写数到CGRAMDDRAM


1


0


要写的数


CGRAMDDRAM读数


1


1


读出的数据


下面简单介绍一下本实验中用到的几个指令的功能:


指令1:清显示,光标复位到地址00H的位置。


指令3:光标和显示模式设置。I/D:光标移动方向,高电平右移,低电平左移;S:屏幕上所有文字是否左移或右移,高电平表示有效,低电平表示无效。


指令4:显示开关控制。D:控制整体显示的开与关,高电平表示开显示,低电平表示关显示;C:控制光标的开与关,高电平表示有光标,低电平表示无光标;B:控制光标是否闪烁,高电平闪烁,低电平不闪烁。


指令6:功能设置命令。DL:高电平时为4位总线,低电平为8位总线;N:低电平时为单行显示,高电平时双行显示;F:低电平时显示5*7的点阵字符,高电平时显示5*10的点阵字符。


指令9:读忙信号和光标地址。BF:忙标志,高电平表示忙,此时模块不能接受命令或数据,低电平表示不忙。


 

以下分别编写一段汇编程序和C程序实现LED液晶显示器在第一行依次显示19的数字。


1、汇编程序


                     ORG             0000H


                     AJMP          START


                     ORG            0033H


START:         MOV            SP,#60H


                     MOV         R6,#31H


MAIN:          ACALL        DELAY         ;判断液晶忙状态?


                     MOV            R2,#01H       ;写指令01H,清屏


                     ACALL        WRCOM


MOV      R2,#38H       ;写指令38H,设定LCD16*2显示,5*7点阵,8位数据接口


                     ACALL        WRCOM


                     MOV            R2,#0FH       ;写指令0FH,显示ON,光标ON,闪烁ON


                     ACALL        WRCOM


                     MOV            R2,#06H       ;写指令06,文字不动,光标自动右移


                     ACALL        WRCOM


                     MOV            R2,#80H       ;第一行第一个字符地址


                     ACALL        WRCOM


WRDATA:    ACALL      RDBUSY


                     MOV       DPTR, #7ffdH


                     MOV       A, R6


                     MOVX    @DPTR, A


                     INC             R6


                     CJNE            R6,#3AH,WRDATA                                                      


                     AJMP           $


WRCOM:     ACALL      RDBUSY                    ;写入控制命令的子程序


                     MOV       A, R2


                     MOV       DPTR, #7ffcH


                     MOVX    @DPTR, A


                     RET


RDBUSY:     MOV       DPTR, #7ffeH


                     MOVX    A, @DPTR


                     JB           ACC.7,DELAY          ;如果为高电平表示忙就循环等待


                     RET


                     END


2C51程序


#include<reg51.h>


#include<absacc.h>


#define uchar unsigned char


#define uint unsigned int


#define WRCOM XBYTE[0x7ffc]          /*写指令*/


#define WRDATA XBYTE[0x7ffd]   /*写数据*/


#define RDCOM XBYTE[0x7ffe]           /*读指令*/


sbit BF="ACC"^7;


uchar code s[] = {"123456789"};


void RD_busy(void)                         /*读忙标志子程序*/


{


       do


       {


              ACC=RDCOM;             /*查询BF标志*/


       }while(BF==1);


}


void WR_COM(uchar com)             /*写控制字子程序*/


{


       RD_busy();


       WRCOM=com;


}


void WR_DATA(uchar dat)              /*写数据子程序*/


{


       RD_busy();


       WRDATA=dat;


}


void lcd_init(void)                      /*初始化程序*/


{    


       WR_COM(0x01);                    /*清显示*/


       WR_COM(0x38);                    /*置功能;2行,5*7字符*/


       WR_COM(0x<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />0F);                    /*显示打开,显示光标,光标闪烁*/


       WR_COM(0x06);                    /*置输入模式:地址增量,显示屏不移动*/


}


void main(void)    


{


       uchar i="0";


       lcd_init();


       WR_COM(0x80);


       while(s!=0x00)                /*输出字符串*/


       {


              WR_DATA(s);


              i++;


       }


    while(1);


}


 
PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
我要评论
0
9
关闭 站长推荐上一条 /3 下一条