找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4529|回复: 0
打印 上一主题 下一主题
收起左侧

【原创】四位总线驱动lcd1602-详细教学

[复制链接]
跳转到指定楼层
楼主
ID:37685 发表于 2013-9-5 13:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
四位总线驱动LCD1602
很多人都因为在使用LCD1602的液晶屏做电子制作时都有这样一个烦恼,LCD占用的IO口太多了,传统的八位总线驱动加上三个控制位就占用了11个接口。往往都是因为这个问题导致原本20脚单片机能做的事情现在得用28脚或40脚的单片机做了。有什么解决方案吗?.......当然是有啦。如果你正在被以上的问题困扰着,或者你是追求电路精简、完美的DIYer,那就继续看下去。这篇文章将会教你怎么用四位总线驱动LCD1602液晶屏,从11个IO口控制LCD变成7个IO口控制LCD将会大大减少你电路上的复杂度。

接线图
四位总线IO口改怎么驱动呢? 看看下面的接线图, Px.4接DB4 Px.5接DB5以此类推,接到DB7时就用了4个IO口,是不是大大的减少了电路上的复杂哈。
这是LCD的接口定义。看看就行 ,主要看上面的接线图

DB7测忙: 测忙就是看看LCD现在的状态看看他在不在忙处理你上次给他的命令,如果他忙完了,才可以给他发送下一个命令
注意:单片机每次对LCD进行读写时都需要对DB7进行监测,确保DB7为0才能读写。
void read_busy() //测忙的函数 看看LCD有空处理你的指令没,有空了,就可以给它发数据了
{ // 根据上面图片1.1读状态写函数。
RS=0;RW=1;//因为测忙是要从LCD读出状态,所以根据上面的操作时序表写程序就是这样,L就是0(低电平)H就是1(高电平)
DB7=1; //如果LCD不忙的话他就会给出一个低电平在DB7,我们这先拉高电平,做准备接他的低电平
E=1; //E=H所以拉高电平
while(DB7); //等待返回一个低电平就可以执行下一步了。
E=0; //E置0,方便下面的函数用
}
函数里面的RS、RW、E、DB7需要定义sbit 根据上面的接线图定义应该是:
sbit RW=P3^1;
sbit RS=P3^0;
sbit E =P3^5;
sbit DB7=P1^7;
void write_data(unsigned char c,unsigned char a) //发送指令函数。i=0写指令 i=1写数据
定义了两个子程序参数
{
read_busy(); //先测忙,调用了上面那个函数
RS=a;RW=0;//根据基本操作时序图,RS=1 RW=0时是写数据,也就是你要显示在LCD上的数据。RS=0 RW=0时是写指令,指令就是让它对自己的一些处理,下面图是指令说明
P1=c/16*16;//这里就是到送指令的命令了,送高四位
E=1;//每次送完要给E一个脉冲
E=0;//要拉低为下面的做准备
P1=c%16*16; //送低四位
E=1; //送完给E一个脉冲
E=0; //拉低E
}
程序说明:
P1=c/16*16;//这里就是到送指令的命令了,送高四位
E=1; //每次送完要给E一个脉冲
E=0; //要拉低为下面的做准备
P1=c%16*16; //送低四位
E=1; //送完给E一个脉冲
E=0; //拉低E
P1=c/16*16;//这里就是到送指令的命令了,送高四位
P1=c%16*16; //送低四位
c/16*16 这是把指令的高四位取出来 /就是整除
比如说 指令是0xAF; 经过这个公式的运算就出来就是 0xA0;高四位就出来了;
C%16*16 这是把指令的低四位取出来 %就是除余 得的是余数
经过这个公式的运算就出来就是 0xF0;低四位就出来了;
在分两次送入LCD。
送完一次要给E一个高脉冲就是E=1;E=0;
指令说明:

说明一下上面这个图怎么用(会LCD 8位总线的可以跳过)
比如4.1.2 显示开/关及光标设置
指令码是: 0 0 0 0 1 D C B D是开液晶屏的显示 1为开 所以D我们把它置1就是 0 0 0 0 1 1 C B 这样设置
例子:
我要开显示,不显示光标,光标闪烁 就是 D=1 C=0 B=1
指令码就是 0 0 0 0 1 1 0 1 这是2进制数,在C语言里要用16进制数,所以转换成16进制数就是0x0D
操作步骤:
有了上面那两个低层的函数。我们就可以对LCD进行操作了。
1、首先要多LCD进行初始化
要用到上面write_data的函数。我们用一个函数把他再次封装起来
void LCD_initialization()
{
write_data(0x28,0); // 告诉LCD我们要四位总线驱动 因为这是指令所有函数的参数就是(0x28,0)
write_data(0x01,0); //让他清屏,数据指针清零
write_data(0x06,0); //这个是上面指令码是 000001NS的设置 大家自己上去看看
write_data(0x0f,0); //设置光标 开显示,显示光标,光标闪烁
}//初始化用到的都是指令 所以write_data( ,0); 函数的第二个参数都是0
2、初始化完后就可以送入要显示的函数了,用到的函数
void print(unsigned char a,unsigned char *str) //送入显示的数据
{//函数参数说明,a你要送入的地址,看下图 如果是在第一行第二个显示就是0x01,*str这个就填你要显示的字
write_data(a | 0x80,0);
while(*str != '\0')
{
write_data(*str++,1); //因为送入的是显示的字所以第二个参数为1
}
*str = 0;
}

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表