单片机/MCU论坛
直播中

默默地努力

12年用户 388经验值
擅长:EDA/IC设计 处理器/DSP 控制/MCU RF/无线
私信 关注
[文章]

1602四线控制方法 ,超级精简...............

      一般情况下,LCD1602与单片机连接的线路共有11条,其中有8条数据线,3条控制线(其余的5条为电源和地)。如果把它们都连接上,将占用较多的单片机的接口。那么如何减少接口呢?
       LCD1602还有一种使用高4位数据线的接法,可以减少单片机的负担。另外,RW的控制也并非是必用的,如果仅仅是用于读取LCD1602“忙”的状态,就可以用稍事等待来代替。这样一来,RW就可以直接接地,使LCD1602永远处于写入的状态。那么,LCD1602和单片机之间就仅仅需要6条线了,这算是一种比较简洁的接法了。
      下面的一个例子是使用P1口的高4位连接到LCD1602的高4位数据线。
源代码:
1602.c (4.39 KB)
(下载次数: 280, 2013-12-10 18:41 上传)
对应的原理图:
51start单片机开发板V3.0.pdf (805.5 KB)
(下载次数: 431, 2013-12-10 18:42 上传)

(备注:程序中只使用了八位数据线的高四位)

/*==========================================================
* 开发人员: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);
}

回帖(29)

437341

2014-3-4 21:50:42
哈哈学习了{:1:}{:1:}{:1:}{:1:}
举报

phone360

2014-7-19 21:22:32
非常有用,多谢了
举报

鸟都不鸟

2014-7-28 09:26:58
哈哈哈哈哈哈哈哈
举报

h1654155830.9793

2014-8-25 14:16:29
受教了,感谢
举报

电路徒

2014-8-26 16:17:54
感谢版主拿干货出来。
举报

shingolily

2014-8-26 23:35:08
感谢楼主的分享,我正卡在这里呢!就是不能进行正常显示,出现乱码了。
举报

shingolily

2014-8-26 23:35:33
楼主的注释非常好,很清晰
举报

changjianqiyuan

2015-1-13 16:04:29
不错。。。。。。。。。。。。。。。
举报

九牛座

2015-1-13 23:25:28
楼主的注释非常好,不错。。。。。。。。。。。。。。。
举报

hzlxlzh

2015-3-31 14:00:42
感谢楼主,正好现在需要
举报

轻云骑

2015-4-20 18:33:37
好好好哈好好好哈哈哦
举报

luleeforever

2015-4-20 22:48:38
谢谢谢谢谢谢谢谢谢谢  确实不错
举报

godlovedaniel

2015-4-26 09:50:55
回复一下又不会怀孕!
举报

sdsdsd67

2015-5-2 23:03:54
牛啊!测试下。。。。
举报

肖邦的夜曲

2015-9-6 19:44:07
666666,学习了,受益匪浅
举报

张华

2015-9-6 21:47:16
基础技能,先下了看看吧。。。。
举报

zds110

2015-12-24 16:13:44
这个不错,IO不够用用这个办法解决
举报

在路上的ZYQ

2016-5-9 14:29:46
嘿嘿嘿,刚好看到这里 3Q
举报

jinrongjun

2016-5-20 11:04:11
感谢楼主。。。。。。。。。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分