很多朋友在制作各种电子设备时不会使用如LCD1602、LCD12864、LCD2004等液晶屏,LCD1602和LCD12864本文不再介绍,因为我前面发过各种贴子大家可以参照,这里只讲一
下LCD2004的显示,我会以通俗到不能再通俗的方法来教大家使用LCD2004这个液晶屏。我们拿到一个LCD液晶屏,首先要有它的显示地址列表,其次它会有官方的参考程序,以上
这两个是必需的。
这里是一个LCD2004显示地址定义列表,意思就是在这个屏上每个字符显示的地址位置。
这个列表的作用很简单,就是告诉你LCD2004液晶屏(每行显示20个字符,共四行)共显示
四行内容,每行每个字符的显示位置,另外就是要把它官方的参考程序部分有些东西复制下来,
具体做法:
1.新建一个LCD2004TEST.H文件
2.把它官方的参考程序中LCD2004 写数据、写指令、忙检测三部分复制到你新建的
LCD2004TEST文件中
//**************************************************************
//【LCD2004写数据】
//**************************************************************
void Wr_Data(uchar wr_data)
{
Rd_Status();
LCM_RS = 1;
LCM_RW = 0;
LCM_E = 1;
LCM_Data = wr_data;
LCM_E = 0; //若晶振速度太高可以在这后加小的延时
DelayMs(15);
}
//**************************************************************
//【LCD2004写指令】
//**************************************************************
void Wr_Command(uchar wr_command)
{
Rd_Status();
LCM_RS = 0;
LCM_RW = 0;
LCM_E = 1;
LCM_Data = wr_command;
LCM_E = 0; //若晶振速度太高可以在这后加小的延时
DelayMs(15);
}
//**************************************************************
//【LCD2004忙检测】
//**************************************************************
void Rd_Status(void)
{while(1)
{
LCM_RS = 0;
LCM_RW = 1;
LCM_E = 0;
LCM_Data = 0xFF;
LCM_E = 1;
if((LCM_Data & BUSY)==0)
break;
}
}
以上三个函数一定要用官网的,这样可以避免很多麻烦,因为官方的测试程序至少不需
要调试,直接可以正常显示,然后需要自己写一个向LCD2004写字符串的函数,具体如下:
//**************************************************************
//【向LCD发送一个字符串】
//**************************************************************
void LCDSendWord(u8 *p)
{
while(*p>0) //比如void LCDSendWord('HALOO');就是让LCD显示"HALOO"
{
Wr_Data(*p);
p++;
}
}
上面这个显示字符串的程序是经很多程序验证过的,可以灵活应用在LCD1602、LCD2004、
LCD12864、LCD19264等液晶屏中用来显示一串字符或汉字,当然用在LCD2004中只能用来显
示字符,就是发送汉字它也显示不出来。另外这段函数不限显示字符个数,只要屏装的下你只
管在LCDSendWord('HALOO')里面写就行了,这段函数还有一个好处就是不用管除了你要显示的字
符外,前后空余部分,有些函数除了要显示的文字内容外,还要把没显示的部分用空格占掉,
不然会显示乱码,这段函数不会。
最后再自己写一段函数,具体如下:
//**************************************************************
//【LCD2004写指令或者写数据】
//**************************************************************
void LCDTestWord(bit i,u8 word)
{
if(i==0)
{
Wr_Command(word); //i=0;则写入指令
}
else
{
Wr_Data(word); //i=1;则写入数据
}
}
这段函数的意思很明显,在C文件中用到LCD2004TEST.H这个文件的时候,你可以
写一行代码就可以写指令或写数据,区分指令还是数据只要用括号内的0和1就行了。比
如像下面这样的写法
LCDTestWord(0,0xc0); //在第二行第一个位置显示
这行代码的意思就是向LCD2004写指令,后面的0xc0就是说在LCD2004的第二
行第一个位置开始显示
LCDTestWord(1,(mon/16)+0x30); //月份十位显示
这行代码的意思就是向LCD2004写数据,把月十位的数据送到LCD2004去显示。
最后我们要做的就是把LCD2004TEST.H这个文件补齐,意思就是把前面的宏定义搞一下,
这个就算是新手应该都会,具体如下:
#include <STC12C5A60S2.h> //载入相应单片机头文件,防止程序出现意外错误
#include <hong.h> //载入宏定义文件,此文件中定义了延时函数等需要全局调用的函数
//**************************************************************
//【LCD2004引脚和宏定义】
//**************************************************************
sbit LCM_RS = P2^6 ;
sbit LCM_RW = P2^5 ;
sbit LCM_E = P2^7;
#define LCM_Data P0
#define BUSY 0x80 //用于检测 LCM 状态字中的 Busy 标
//以上是LCD相关引脚和宏定义
//**************************************************************
//**************************************************************
void Wr_Data(u8 wr_data); //写数据
void Wr_Command(u8 wr_command); //写指令
void Rd_Status(void); //读忙
void LCDInit(void); //初始化
void LCDSendWord(u8 *p); //向LCD发送一个字符串
void LCDTestWord(bit i,u8 word); //LCD2004写指令或者写数据
void LCDInit(void); //LCD2004初始化
void LCDClear(void); //LCD2004清屏
//**************************************************************
至此,一个完整的LCD2004TEST.H文件就完成了。
制作出来的实物图如下:
这个是实际显示效果,
在C文件MAIN函数中只要调用一下LCD2004的初始化函数和清屏函数就可以显示了
Keil代码下载:
LCD2004TEST.zip
(181.84 KB, 下载次数: 35)
这里附上程序,大家自行下载,程序中有两个警告,大家可以不必理会,是有两个函数暂时没用到,以后要用的。
|