图1所示是80C51单片机与LED1602的接口电路。其中,74HC573作为地址锁存器。LED1602的D0~D7为8位双向数据线;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。
VDD接5V正电源;VSS为电源地,接GND;VL为液晶显示器对比度调整端,使用时可以通过10K的电位器调整对比度;BLA为背光电源正级;BLK为背光电源负级,本实验中不使用背光,所以BLA和BLK悬空。
图1、LCD1602与80C51的接口电路
1602液晶模块内部的控制器共有11条控制指令,如表1所示。它的读写操作、屏幕和光标的操作都是通过指令编程实现的。
表1、1602液晶模块内部的控制命令
指令 | 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 | 计数器地址 | ||||||
写数到CGRAM或DDRAM | 1 | 0 | 要写的数 | |||||||
从CGRAM或DDRAM读数 | 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液晶显示器在第一行依次显示1到9的数字。
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,设定LCD为16*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
2、C51程序
#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);
}
文章评论(0条评论)
登录后参与讨论