- 1、本文档共9页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
液晶屏负像=
液晶屏负像
proteus截图。
实际显示效果:
因为我用的1602液晶第二排显示有问题(硬件原因),所以图片中的第二排只显示了一半,如果你们使用的液晶是正常的话绝对不会出现这种问题。 1602液晶是一款价格便宜使用方便的字符液晶,使用非常广泛,下面就来介绍一下这款液晶的使用方法。
要想驱动液晶正常显示字符,必需先弄清楚它的读写时序,弄清了时序其它就简单了。
下面是读写时序的简要文字说明(截图来自1602的datasheet)
下面再来看一下1602的具体时序图,弄清楚了这个写程序就不难了:
时序详细分析:以读状态为例分析,先将EN置低,RS置低,RW置高,等待Tsp1的时间,具体时间(datasheet中有说明),然后将EN拉高,持续tpw的时间,将EN拉低,紧接着读取IO口的数据就可以了,一个字节的读取就完毕了。
读数据,写数据的分析方法类似,在这里我就不在赘述。直接给出程序,大家一看就应该能明白。
void write_data(uchar date) //写数据程序{read_busy(); //都忙操作lcdrs=1;lcdrw=0;P0=date;lcden=1;delay(10);lcden=0;}
void write_com(uchar com) //写命令程序
{read_busy();lcdrs=0;lcdrw=0;P0=com;lcden=1;delay(10);lcden=0;}
下面是都忙操作的时序,都忙很重要,因为液晶反应比较慢,只有等待它不忙的时候我们才能进行读写操作,否则都是无效的,所以我们在进行读写操作时一定要进行读忙检测,才能确保每次读写数据都是有效的。
void read_busy() //读忙检测,每次对液晶进行读写操作是,都要进行读忙检测{?lcdrs=0;?lcdrw=1;?lcden=1;?while(P0 0x80);?lcden=0;}
下面贴出完整的程序:
/***************/zhangjiayue123/home********************程序功能:1602逐个字符显示
程序编译环境:keil4程序运行环境:QC1602-7测试板:hot 51整理人:张家越???QQ:435835181整理时间:2011-04-19
*******************/zhangjiayue123/home**********/#include reg52.h#define uchar unsigned char#define uint unsigned intuchar tab1[]=zhangjiayue;??? //将需要显示的字符先放在数组中,显示的时候直接调用uchar tab2[]=1990-09-29;sbit lcden=P2^7;????? //位定义sbit lcdrw=P2^6;sbit lcdrs=P2^5;
void delay(uint t)??????? //延时函数,液晶反应比较慢需要一定延时{?uint i,j;?for(i=120;i0;i--)?for(j=t;j0;j--);}
void delay1(uint i)???????? //短暂延时{?while(--i);}void read_busy()??????? //读忙检测,每次对液晶进行读写操作是,都要进行读忙检测{?lcdrs=0;?lcdrw=1;?lcden=1;?while(P0 0x80);?lcden=0;}void write_com(uchar com)????? //写命令程序
{?read_busy();?lcdrs=0;?lcdrw=0;?P0=com;?lcden=1;?delay(10);?lcden=0;
}void write_data(uchar date)????? //写数据程序{?read_busy();??? //先进行都忙操作?lcdrs=1;??????lcdrw=0;?P0=date;?lcden=1;?delay(10);?lcden=0;}void init()????????? //液晶初始化{ ?write_com(0x38);?write_com(0x0C);?write_com(0x06); }?void main(){??uchar m,n;
??write_com(0x01);?? //清屏显示?init();????? //1602的初始化?write_
文档评论(0)