完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
本帖最后由 默默地努力 于 2013-12-8 05:56 编辑
LCD1602还有一种使用高4位数据线的接法,可以减少单片机的负担。另外,RW的控制也并非是必用的,如果仅仅是用于读取LCD1602“忙”的状态,就可以用稍事等待来代替。这样一来,RW就可以直接接地,使LCD1602永远处于写入的状态。那么,LCD1602和单片机之间就仅仅需要6条线了,这算是一种比较简洁的接法了。(还有只用两根线就可以控制的奥) 下面的一个例子是使用P1口的高4位连接到LCD1602的高4位数据线。 源代码: 相应的原理图: (备注:程序只用了数据线的高四位) /*========================================================== * 开发人员:laowang * 当前版本:V1.0 * 创建时间:12/8/2013 * 修改时间: * 功能说明:让1602显示“51Start:” “the best one!” *==========================================================*/ * 数据口:P1.4-P1.7 * 控制口:lcdrs=P3^2 lcdrw=P3^3 lcden=P3^4 * 传输方式:并口,四线(高四位) *==========================================================*/ #include #define uchar unsigned char #define uint unsigned int ***it lcdrs=P3^2; //数据/命令选择端,低电平为指令,高电平为数据 ***it lcdrw=P3^3; //读写控制端,低电平为写 ***it lcden=P3^4; //使能端 uchar code table1[]=" 51Start: "; uchar code table2[]=" the best one! "; void delay(uint x) //延时 x 毫秒 { uint i,j; for(i=x;i>0;i--) for(j=110;j>0;j--); } /*========================================================== *函数名称:Lcd_1602_write(uchar com,date) *功 能:向1602写数据/指令 *入口参数:com(com=0 写命令 com=1 写数据) *出口参数: *说 明:四线用的是1602的高四位DB4-DB7,单片机的数据口为P1口的高四位P1.4-P1.7 *==========================================================*/ void Lcd_1602_write(uchar com,date) { uchar i; lcdrw=0; //设置为写 lcdrs=com; //将形参传给lcdrs for(i=0;i<2;i++) //每次写四位,写完一个数据/命令(8位)需要两次 { lcden=1; P1=(P1&0x0f)|(date&0xf0); //将date的高四位送入P1,同时保持P1的低四位不变 //如果使用P1的低四位的话,则该处应该改为:P1=(P1&0xf0)|((date>>4)&0x0f); delay(3); //适当延时,数据稳定 lcden=0; //送入数据 date<<=4; //低四位左移到高四位 } } /*========================================================== *函数名称:void Lcd_1602_init() *功 能:对1602进行初始化 *入口参数: *出口参数: *说 明:用四线时,1602的初始化只需要高四位数据就可以完成,在初始化完成之后必须再传入四位数据,需注意。 * 执行完write_1602(0,0x28);之后液晶已经初始化,其实在执行了一半的时候就已经初始化完成,此时又传入了 四位数据(一个写语句会传入8位数据),这时候如果直接写数据的话,就会形成乱码 *==========================================================*/ void Lcd_1602_init() { Lcd_1602_write(0,0x28); //0x28=0010 1000,将液晶设置为16*2显示,5*7点阵,4位数据口 delay(5); // lcden=1; // lcden=0; Lcd_1602_write(0,0x28); //显示方式设置 Lcd_1602_write(0,0x0e); //设置开显示,不显示光标 Lcd_1602_write(0,0x06); //默认(0x06)写入新数据后光标右移 屏幕不移动 Lcd_1602_write(0,0x01); //显示清0,数据指针清0 } //主函数 void main() { uchar num; Lcd_1602_init(); Lcd_1602_write(0,0x80); //第一行 for(num=0;num<16;num++) { Lcd_1602_write(1,table1[num]); //写数据 delay(3); } Lcd_1602_write(0,0xc0); //第二行 for(num=0;num<16;num++) { Lcd_1602_write(1,table2[num]); delay(3); } while(1); } 评分 |
|
相关推荐
11 个讨论
|
|
666666666666666666
|
|
|
|
|
|
经过测试, 失败了, 看了程序有问题
|
|
|
|
|
|
只有小组成员才能发言,加入小组>>
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-21 16:55 , Processed in 0.998148 second(s), Total 81, Slave 65 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号