液晶显示技术HD44780U的使用C语言.docx
- 文档编号:25772724
- 上传时间:2023-06-13
- 格式:DOCX
- 页数:21
- 大小:65.49KB
液晶显示技术HD44780U的使用C语言.docx
《液晶显示技术HD44780U的使用C语言.docx》由会员分享,可在线阅读,更多相关《液晶显示技术HD44780U的使用C语言.docx(21页珍藏版)》请在冰豆网上搜索。
液晶显示技术HD44780U的使用C语言
HD44780U的使用(C语言)
字符型液晶显示模块的接口技术
字符型液晶显示模块的外接口信号实际上就是HD44780U与计算机接口部的信号,信号时序为M6800系列时序。
当使用8080时序的AT89C51系列的计算机与其连接时,关键就是注意E信号的使用。
计算机与字符型液晶显示模块的连接方法有两种,一种为直接访问方式,另一种为间接控制方式。
本书将分别详细地介绍这两种方法的接口技术。
1直接访问方式
直接访问方式是计算机把字符型液晶显示模块作为存储器或I/O设备直接挂在计算机的总线上。
在这种方式下,控制信号由AT89C51的读操作信号RD和写操作信号WR与地址信号合成产生。
本文推荐的直接访问方式的实用接口电路如图1所示。
图1直接访问方式的接口电路
上图所示的电路,对于完成液晶显示模块的显示来说,所用的硬件是相对比较少的,但是如果计算机需要进行扩展的话,使用上图的话不是很经济(浪费了太多的地址空间)。
这个时候,可以考虑使用全地址译码或者部分地址译码的方式。
在上图所示的电路中:
●8位数据总线与AT89C51的数据总线连接
●E信号由WR和RD信号逻辑与非后产生,然后由地址A15选通控制
●R/W由地址A14提供
●RS信号由地址A13提供
这样就确定了AT89C51操作字符型液晶显示模块的唯一地址选择。
图中的电位器为V0提供了可调的驱动电压,用以实现显示对比度的调节。
同时,上图所示的电路不经过任何改变就可以仿真出4位计算机对字符型液晶显示模块的接口,主要是驱动软件的改变。
以下将给出直接访问方式的8位和4位接口的驱动程序。
(1)地址定义
#include
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
#definenop()_nop_()
xdataucharWC_ADD_at_0x8000;
xdataucharRC_ADD_at_0xC000;
xdataucharWD_ADD_at_0xA000;
xdataucharRD_ADD_at_0xE000;
(2)读入BF与AC的值
8位接口:
ucharRdBFAC(void)
{
ucharstatus;
status=RC_ADD&0x80;/*屏蔽低7位*/
returnstatus;
}
4位接口:
ucharRdBFAC(void)
{
ucharstatus,temp;
status=RC_ADD;
temp=RC_ADD;
status=status&0x80;/*屏蔽低7位*/
returnstatus;
}
(3)写指令代码
8位接口:
voidWRCMD(ucharCMD)
{
uchartemp;
do
{
temp=RdBFAC();
}
while(temp>=0x80);
WC_ADD=CMD;
}
4位接口:
voidWRCMD(ucharCMD)
{
uchartemp;
do
{
temp=RdBFAC();
}
while(temp>=0x80);
WC_ADD=CMD;
CMD<<=4;
WC_ADD=CMD;
}
(4)写显示数据
8位接口:
voidWRDAT(ucharDAT)
{
uchartemp;
do
{
temp=RdBFAC();
}
while(temp>=0x80);
WD_ADD=DAT;
}
4位接口:
voidWRDAT(ucharDAT)
{
uchartemp;
do
{
temp=RdBFAC();
}
while(temp>=0x80);
WD_ADD=DAT;
DAT<<=4;
WD_ADD=DAT;
}
(5)读显示数据
8位接口:
ucharRdDAT(void)
{
ucharDAT,temp;
do
{
temp=RdBFAC();
}
while(temp>=0x80);
DAT=RD_ADD;
returnDAT;
}
4位接口:
ucharRdDAT(void)
{
ucharDAT,DATtemp,temp;
do
{
temp=RdBFAC();
}
while(temp>=0x80);
DAT=RD_ADD;
DATtemp=RD_ADD;
DAT=DAT|(DATtemp>>=4);
returnDAT;
}
2间接控制方式
间接控制方式是计算机把字符型液晶显示模块作为终端与计算机的并行接口连接,计算机通过对该并行接口的操作间接的实现对字符型液晶显示模块的控制。
本文以AT89C51的P1和P2接口为并行接口与字符型液晶显示模块连接,图2给出了本文推荐的实用接口电路。
图2间接控制方式的接口电路
图中的电位器为V0提供了可调的驱动电压,用以实现显示对比度的调节。
在编制驱动函数的时候,要注意时序的配合,根据M6800时序的规范:
●在写操作时,使能信号E的下降沿有效,在软件设置顺序上,先设置RS、R/W状态,再设置数据,然后产生E信号的脉冲,最后复位RS和R/W状态
●在读操作时,使能信号E的高电平有效,所以在软件设置顺序上,先设置RS,R/W状态,再设置E信号为高,这时从数据口读取数据,然后将E信号置低,最后复位RS和R/W状态。
间接控制方式通过软件执行产生操作时序,所以在时间上是足够满足要求的。
因此间接控制方式能够实现高速计算机与字符型液晶显示模块的连接。
同时,上图所示的电路不经过任何改变就可以实现4位计算机对字符型液晶显示模块的接口,主要是驱动软件的改变。
以下将给出间接控制方式的8位和4位接口的驱动程序。
(1)接口定义
#include
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
#definenop()_nop_()
sbitE=P2^7;
sbitRW=P2^6;
sbitRS=P2^5;
(2)读入BF与AC的值
8位接口:
ucharRdBFAC(void)
{
ucharstatus;
P1=0xFF;
RS=0;
RW=1;
E=1;
status=P1;
E=0;
status=status&0x80;/*屏蔽低7位*/
returnstatus;
}
ucharRdBFAC(void)
{
ucharstatus,temp;
P1=0xF0;
RS=0;
RW=1;
E=1;
status=P1;
E=0;
P1=0xF0;
E=1;
temp=P1;
E=0;
status=status&0x80;/*屏蔽低7位*/
returnstatus;
}
(3)写指令代码
8位接口:
voidWRCMD(ucharCMD)
{
uchartemp;
do
{
temp=RdBFAC();
}
while(temp>=0x80);
RW=0;
P1=CMD;
E=1;
nop();
E=0;
}
4位接口:
voidWRCMD(ucharCMD)
{
uchartemp;
do
{
temp=RdBFAC();
}
while(temp>=0x80);
RW=0;
P1=CMD;
E=1;
nop();
E=0;
CMD<<=4;
P1=CMD;
E=1;
nop();
E=0;
}
(4)写显示数据
8位接口:
voidWRDAT(ucharDAT)
{
uchartemp;
do
{
temp=RdBFAC();
}
while(temp>=0x80);
RS=1;
RW=0;
P1=DAT;
E=1;
nop();
E=0;
}
4位接口:
voidWRDAT(ucharDAT)
{
uchartemp;
do
{
temp=RdBFAC();
}
while(temp>=0x80);
RS=1;
RW=0;
P1=DAT;
E=1;
nop();
E=0;
DAT<<=4;
P1=DAT;
E=1;
nop();
E=0;
}
(5)读显示数据
8位接口:
ucharRdDAT(void)
{
ucharDAT,temp;
do
{
temp=RdBFAC();
}
while(temp>=0x80);
RS=1;
RW=1;
P1=0xFF;
E=1;
DAT=P1;
E=0;
returnDAT;
}
4位接口:
ucharRdDAT(void)
{
ucharDAT,DATtemp,temp;
do
{
temp=RdBFAC();
}
while(temp>=0x80);
RS=1;
RW=1;
P1=0xF0;
E=1;
DAT=P1;
E=0;
nop();
P1=0xF0;
E=1;
DATtemp=P1;
E=0;
DAT=DAT|(DATtemp>>=4);
returnDAT;
}
字符型液晶显示模块的应用软件
本节提供的一些应用程序实例是为了进一步说明软件指令的使用技巧。
接口电路为图1和图2所示的实用电路,驱动程序也为上一节所提供的。
适用于单片HD44780U进行控制的双行显示的字符型液晶显示模块。
1延迟函数
voidDelayms(uinti)
{
uinttemp;
while((i--)!
=0)
{
for(temp=1000;temp!
=0;temp--);
}
}
2初始化
初始化的重点在工作方式设置指令的参数选择上。
(1)直接访问方式
ucharCMDByte8[]={0x38,0x01,0x06,0x0F};
ucharCMDByte4[]={0x32,0x01,0x06,0x0F};
voidInit(void)
{
uchartemp;
WC_ADD=0x30;
Delayms(5);
WC_ADD=0x30;
Delayms
(1);
WC_ADD=0x30;
/*8位接口*/
for(temp=0;temp<4,temp++)WRCMD(*(CMDByte8+temp));
/*4位接口*/
//for(temp=0;temp<4,temp++)WRCMD(*(CMDByte4+temp));
}
(2)间接控制方式
voidInit(void)
{
uchartemp;
RS=0;
RW=0;
P1=0x30;
E=1;
nop();
E=0;
Delayms(5);
P1=0x30;
E=1;
nop();
E=0;
Delayms
(1);
P1=0x30;
E=1;
nop();
E=0;
/*8位接口*/
for(temp=0;temp<4,temp++)WRCMD(*(CMDByte8+temp));
/*4位接口*/
//for(temp=0;temp<4,temp++)WRCMD(*(CMDByte4+temp));
}
3光标移动与画面滚动
光标移动与画面滚动主要是对“输入方式设置(EnterModeSet)”指令的进一步说明。
(1)光标左移输入方式
ucharcodeDis_tab_CL[]={"CursorLeftScroll"};
voidCursorLeft(void)
{
uchartemp;
WRCMD(0x04);
WRCMD(0x90);
for(temp=18;temp>0;temp--)WRDAT(*(Dis_tab_CL+temp-1));
}
(2)光标右移输入方式
ucharcodeDis_tab_CR[]={"CursorRightScroll"};
voidCursorRight(void)
{
uchartemp;
WRCMD(0x06);
WRCMD(0x80);
for(temp=0;temp<19;temp++)WRDAT(*(Dis_tab_CR+temp));
}
(3)画面向左滚动输入方式
ucharcodeDis_tab_DL[]={"DisLeftScroll"};
voidDisLeft(void)
{
uchartemp;
WRCMD(0x07);
WRCMD(0x90);
for(temp=0;temp<15;temp++)WRDAT(*(Dis_tab_DL+temp));
}
(4)画面向右滚动输入方式
ucharcodeDis_tab_DR[]={"DisRightScroll"};
voidDisRight(void)
{
uchartemp;
WRCMD(0x05);
WRCMD(0x90);
for(temp=16;temp>0;temp--)WRDAT(*(Dis_tab_DL+temp-1));
}
4光标画面滚动
光标或画面滚动(CursorOrDisplayShift)指令与输入方式设置(EnterModeSet)指令都可以产生光标或画面的滚动,区别在于该指令专门用于滚动功能,执行一次,显示呈现一次滚动效果。
而输入方式设置指令仅是完成了一种字符输入方式的设置,仅在计算机对DDRAM等进行操作时才能产生滚动的效果。
voidDisWrite(void)
{
uchartemp;
WRCMD(0x80);
for(temp=0;temp<80;temp++)
{
WRDAT(0x21+temp);
Delayms(200);
}
}
voidScroll(void)
{
uchartemp;
DisWrite();
WRCMD(0x90);
for(temp=0;temp<8;temp++)
{
WRCMD(0x10);
Delayms(200);
}
WRCMD(0x90);
for(temp=0;temp<8;temp++)
{
WRCMD(0x14);
Delayms(200);
}
WRCMD(0x90);
for(temp=0;temp<8;temp++)
{
WRCMD(0x18);
Delayms(200);
}
WRCMD(0x90);
for(temp=0;temp<8;temp++)
{
WRCMD(0x1C);
Delayms(200);
}
}
5回归起始位
上述的函数代码将画面进行滚动操作,这个时候可以执行归home位指令,将显示画面拉回到起始位。
这个时候只有AC被复位,DDRAM中的内容保持不变。
voidReturnHome(void)
{
WRCMD(0x02);
}
6自定义CGRAM的建立与使用
(1)CGRAM自定义字模库的建立
建立自定义CGRAM的一般步骤如下:
●用相关软件建立字符的字模数组;
●定义各字符的字符代码;
●将字模数组写入到CGRAM中去。
ucharcodeDis_CGRAM={
/*!
*/
0x20,0x20,0x20,0x20,0x20,0x00,0x20,0x00,
/*#*/
0x50,0x50,0xF8,0x50,0xF8,0x50,0x50,0x00,
/*$*/
0x20,0x78,0xC0,0x70,0x28,0xF0,0x20,0x00,
/*%*/
0xC0,0xC8,0x10,0x20,0x40,0x98,0x18,0x00,
/*&*/
0x40,0xA0,0xA0,0x40,0xA8,0x90,0x68,0x00,
/*'*/
0x30,0x20,0x40,0x00,0x00,0x00,0x00,0x00,
/*(*/
0x10,0x20,0x40,0x40,0x40,0x20,0x10,0x00,
/*)*/
0x40,0x20,0x10,0x10,0x10,0x20,0x40,0x00
};
voidWrCGRAM(void)
{
uchartemp;
WRCMD(0x40);
for(temp=0,temp<64,temp++)WRDAT(*(Dis_CGRAM+temp))
}
(2)CGRAM自定义字模库的使用
当建立了上述的CGRAM字模库后,就可以使用了。
voidDisCGRAM(void)
{
uchartemp0,temp1;
WRCMD(0x80);
for(temp0=0,temp0<10,temp0++)
{
for(temp1=0,temp1<8,temp1++)WRDAT(temp1);
}
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 液晶显示 技术 HD44780U 使用 语言