• 回复
  • 收藏
  • 点赞
  • 分享
  • 发新帖

自制玩具3——单片机实现I2C 两总线通信1602液晶+18B20温度传感显示温度

针对1602的液晶的学习,大多数初学者都是用并行的方式来驱动,这样需要用到大量的IO口,单片机的选型就会比较大,有点浪费资源。

后来想想如果能用到单片机内部资源I2C的串行的方式来驱动,就只用到两个IO口即可,一个SDA,一个SCL,选择一个8引脚的单片机就可以实现了。

 

下图就是选用的一款的PIC12F系列的8引脚单片机,两个IO驱动1602液晶,一个IO口驱动18B20温度传感,总共占用3个IO口,还多两个引脚可以干点别的。

当然I2C驱动1602液晶,还需要用到一个串行转并行的芯片PCF8574,改芯片支持I2C,该转换芯片也比较便宜,很容易购买到。

注意:PCF8574的8个数据口只能用到四4个数据口对接1602的高四位数据口,PCF8574剩下的四个口需要对接1602的RS位 RW位和EN使能位,所以

最终1602的驱动方式是四总线驱动。

希望感兴趣的朋友可以探讨一下。

全部回复(36)
正序查看
倒序查看
2014-04-28 15:44

目测楼主原理图为PFC+反激

0
回复
daihui713
LV.6
3
2014-04-28 15:51
@wangchuangwccc
目测楼主原理图为PFC+反激[图片]

呵呵 眼真尖啊  没错是的  PFC+QR 

0
回复
daihui713
LV.6
4
2014-04-28 16:16

先上关键程序——

I2C方式,四总线驱动1602液晶,写指令和写数据函数

void L1602_white_command(uchar command)

    uchar temp=0; 

    delay_us(20);          //代替忙检测 

    temp=(command&0xF0)|0x08;    //先送高四位对应1602高四位,同时RS=0,RW=0,EN=0 

    iic_white(temp); 

    temp|=0x04;         //拉高EN 

    iic_white(temp); 

    delay_us(20);  

    temp&=0xFB;       //拉低EN 

    iic_white(temp); 

    temp=(command<<4)|0x08;       //然后写命令的低四位 同时RS=0,RW=0,EN=0 

    iic_white(temp); 

    temp|=0x04;         //拉高EN 

    iic_white(temp); 

    delay_us(20);  

    temp&=0xFB;       //拉低EN 

    iic_white(temp);

}

void L1602_white_data(uchar data)

       uchar temp=0; 

        delay_us(20); 

        temp=(data&0xF0)|0x09;             //先送高四位对应1602高四位,同时RS=1,RW=0,EN=0 

        iic_white(temp); 

        temp|=0x04;          //拉高EN 

        iic_white(temp); 

        delay_us(20);  

        temp&=0xFB;       //拉低EN 

        iic_white(temp); 

        temp=(data<<4)|0x09;       //然后写命令的低四位 同时RS=1,RW=0,EN=0 

        iic_white(temp);

         temp|=0x04;         //拉高EN

         iic_white(temp); 

        delay_us(20);  

        temp&=0xFB;       //拉低EN 

        iic_white(temp);

}

 

0
回复
2014-04-28 16:28
@wangchuangwccc
目测楼主原理图为PFC+反激[图片]
王工厉害呀!
0
回复
2014-04-28 16:29
@daihui713
先上关键程序——I2C方式,四总线驱动1602液晶,写指令和写数据函数voidL1602_white_command(ucharcommand){     uchartemp=0;     delay_us(20);         //代替忙检测     temp=(command&0xF0)|0x08;   //先送高四位对应1602高四位,同时RS=0,RW=0,EN=0     iic_white(temp);     temp|=0x04;        //拉高EN     iic_white(temp);     delay_us(20);      temp&=0xFB;      //拉低EN     iic_white(temp);     temp=(command
思路不错值得借鉴!
0
回复
2014-04-28 16:31
@yueyunno1
思路不错值得借鉴!
戴工你这个液晶支持串口通信吗?只接高4位就能工作!
0
回复
daihui713
LV.6
8
2014-04-28 16:51
@yueyunno1
戴工你这个液晶支持串口通信吗?只接高4位就能工作!

乐云兄  这个本身是并口的  后面我加了一个串口转并口的芯片 PCF8754, 这个芯片支持I2C驱动,    这个芯片只接1602的高四位, 剩下四个口需要接RS RW EN

0
回复
shenx123
LV.10
9
2014-04-28 17:02
四总线, 有什么好处啊
0
回复
daihui713
LV.6
10
2014-04-28 17:25
@shenx123
四总线,有什么好处啊

其实我单片机是I2C两总线————对接串口转并口芯片PCF8754——————四总线对接1602液晶数据接口,剩下四个对接1602的RS RW 和EN使能位。

其实单片机并行驱动1602液晶需要用到11个IO口(包括8个数据口,RS RW EN共11),如果是四总线驱动的话就可以省下个数据口,也就是说如果是并行驱动1602液晶,采用4总线驱动,最终只需要7个IO口

当然如果采用I2C驱动的话就只要2个IO口,但是需要加一个串口转并口的芯片

0
回复
2014-04-28 17:30
@daihui713
其实我单片机是I2C两总线————对接串口转并口芯片PCF8754——————四总线对接1602液晶数据接口,剩下四个对接1602的RSRW和EN使能位。其实单片机并行驱动1602液晶需要用到11个IO口(包括8个数据口,RSRWEN共11),如果是四总线驱动的话就可以省下个数据口,也就是说如果是并行驱动1602液晶,采用4总线驱动,最终只需要7个IO口当然如果采用I2C驱动的话就只要2个IO口,但是需要加一个串口转并口的芯片
明白了,1602可以用4BIT驱动?是不是这个意思?我没有试过!
0
回复
daihui713
LV.6
12
2014-04-28 17:35
@yueyunno1
明白了,1602可以用4BIT驱动?是不是这个意思?我没有试过!

呵呵 是的 可以四线驱动 我也是最近试了才知道了    不过需要设置一下1602的控制字 把8线改成4线

0
回复
2014-04-28 21:38
@daihui713
呵呵是的可以四线驱动我也是最近试了才知道了   不过需要设置一下1602的控制字把8线改成4线
哦  这样我就明白了  还真没有注意这个问题,空了也试试!
0
回复
山东大汉
LV.10
14
2014-04-28 23:17
@daihui713
呵呵眼真尖啊 没错是的 PFC+QR 
做的板子真精巧, 程序如何?
0
回复
山东大汉
LV.10
15
2014-04-28 23:18
@daihui713
乐云兄 这个本身是并口的 后面我加了一个串口转并口的芯片PCF8754,这个芯片支持I2C驱动,   这个芯片只接1602的高四位,剩下四个口需要接RSRWEN
有具体的接法图吗?
0
回复
daihui713
LV.6
16
2014-04-28 23:49

因为东西小,比较简单,原理图我没有整理过,所以我都是直接焊接的调试的 ,主要就是PCF8574这个芯片要和1602液晶要对接好。

我是这样接的:

1. PCF8574的高四位P4 P5 P6 P7 分别接1602液晶的D4 D5 D6 D7

2. PCF8574的P0 P1 P2 分别接1602液晶的RS RW EN

3.PCF8574的I2C接口SDA SCL分别对应单片机的I2C接口SDA SCL ,PCF8574作为从机,单片机找到从机地址于它通信

整个通信过程都是写操作,没读的操作。

4.PCF8574的A0 A1 A2是从机的硬件地址,可以全部接地,也可以全部接VCC,只要在写从机地址分清楚就行

0
回复
2014-04-28 23:55
@daihui713
因为东西小,比较简单,原理图我没有整理过,所以我都是直接焊接的调试的 ,主要就是PCF8574这个芯片要和1602液晶要对接好。我是这样接的:1.PCF8574的高四位P4P5P6P7分别接1602液晶的D4D5D6D72.PCF8574的P0P1P2分别接1602液晶的RSRWEN3.PCF8574的I2C接口SDASCL分别对应单片机的I2C接口SDASCL,PCF8574作为从机,单片机找到从机地址于它通信整个通信过程都是写操作,没读的操作。4.PCF8574的A0A1A2是从机的硬件地址,可以全部接地,也可以全部接VCC,只要在写从机地址分清楚就行[图片]
这个科学,得顶!
0
回复
daihui713
LV.6
18
2014-04-29 15:17

这是PIC单片机内部I2C的模块化时序函数,基本上PIC单片机可以通用

void iic_white(uchar data)

    SSP1IF=0; 

    SEN=1; 

    while(!SSP1IF); 

    SSP1IF=0; 

    SSP1BUF=0x4E; 

    while(!SSP1IF); 

    SSP1IF=0; 

    //if(!ACKSTAT); 

    //else return; 

    SSP1BUF=data; 

    while(!SSP1IF); 

    SSP1IF=0; 

    //if(!ACKSTAT); 

    //else return; 

    PEN=1; 

    while(!SSP1IF); 

    SSP1IF=0;

}

0
回复
2014-04-29 15:57
@daihui713
这是PIC单片机内部I2C的模块化时序函数,基本上PIC单片机可以通用voidiic_white(uchardata){     SSP1IF=0;     SEN=1;     while(!SSP1IF);     SSP1IF=0;     SSP1BUF=0x4E;     while(!SSP1IF);     SSP1IF=0;     //if(!ACKSTAT);     //elsereturn;     SSP1BUF=data;     while(!SSP1IF);     SSP1IF=0;     //if(!ACKSTAT);     //elsereturn;     PEN=1;     while(!SSP1IF);     SSP1IF=0;}
戴工,感谢您写的好帖子,先顶后看!~
0
回复
心中有冰
LV.11
20
2014-04-29 17:06
虽然看不懂,但感觉好厉害的样子
0
回复
daihui713
LV.6
21
2014-04-29 17:57
@心中有冰
虽然看不懂,但感觉好厉害的样子

军长,您好,您是电源网的标杆,向您看齐, 单片机是我做电源6年以来的第二职业,目前主业还是电源,以后还得向您请教了

0
回复
daihui713
LV.6
22
2014-04-29 17:57
@电源网-娜娜姐
戴工,感谢您写的好帖子,先顶后看!~

感谢支持,共同学习!

0
回复
心中有冰
LV.11
23
2014-04-29 19:34
@daihui713
军长,您好,您是电源网的标杆,向您看齐,单片机是我做电源6年以来的第二职业,目前主业还是电源,以后还得向您请教了
兄弟过誉了。单片机我是门外汉,以后有问题可能还要向你请教呢。
0
回复
cltwolf
LV.5
24
2014-05-05 21:34
@wangchuangwccc
目测楼主原理图为PFC+反激[图片]

看到回帖才去看原理图的,目光给PIC吸引了。佩服wangchuangwccc,火眼金睛啊

0
回复
2014-05-08 19:58
@心中有冰
[图片]兄弟过誉了。单片机我是门外汉,以后有问题可能还要向你请教呢。
冰版太谦虚了,都是我们的榜样!向冰版敬礼!
0
回复
2014-07-29 11:18
@yueyunno1
冰版太谦虚了,都是我们的榜样!向冰版敬礼!
哈哈 这个帖子吸引好多大咖,推荐到社区经典~
0
回复
daihui713
LV.6
27
2014-07-29 14:57
@电源网-娜娜姐
哈哈这个帖子吸引好多大咖,推荐到社区经典~

师长威武!最近手头在忙一些公司运作以及新产品开发的事情,过些日子再整一两个贴出来支持一下师长工作

0
回复
wangsllyg
LV.2
28
2014-07-29 22:18

稍微发表一下不同意见   

1602 不判断盲状态的话 R/W脚是可以直接接地的 

这样 EN  RS  和4个数据线   总共只占用6个单片机I/O 口  

楼主的方案虽然采用I²C串行驱动 省掉了4个I/O 口   但多出了一个PCF8574芯片  个人感觉有点得不偿失      

不知道实际产品中是否有应用的例子

0
回复
daihui713
LV.6
29
2014-07-30 08:40
@wangsllyg
稍微发表一下不同意见   1602不判断盲状态的话R/W脚是可以直接接地的 这样EN RS  和4个数据线  总共只占用6个单片机I/O口  楼主的方案虽然采用I²C串行驱动省掉了4个I/O口   但多出了一个PCF8574芯片 个人感觉有点得不偿失      不知道实际产品中是否有应用的例子

嗯 你说的也没错,如果四总线并行驱动也只需6个口,也是可以的。但如果你使用的是8引脚的MCU就可能不足了,连复位引脚都得算上显然不合适。

0
回复
fzhlpp
LV.7
30
2014-08-09 20:32
@daihui713
嗯你说的也没错,如果四总线并行驱动也只需6个口,也是可以的。但如果你使用的是8引脚的MCU就可能不足了,连复位引脚都得算上显然不合适。
也想学习液晶显示,你这些是哪买的,多少银子?对液晶一窍不通,为什么叫1602...?
0
回复
daihui713
LV.6
31
2014-08-11 08:19
@fzhlpp
也想学习液晶显示,你这些是哪买的,多少银子?对液晶一窍不通,为什么叫1602...?

都是淘宝淘的,一般都在10块钱左右, 1602 代表一行可以显示16个字符或数字,总共有两行

0
回复