标题: 成功了!任意2个io直接驱动LCD1602,并且不需外加芯片。 [打印本页]

作者: zhu123    时间: 2013-8-6 15:39
标题: 成功了!任意2个io直接驱动LCD1602,并且不需外加芯片。
上次在51hei论坛发了个人肉驱动LCD1602的帖子,没什么技术含量,居然得裤子,有点不好意思,正好这几天有点时间,于是就再做一个小试验,用尽量少的IO来驱动1602,以适应在某些引脚较少的MCU,如Tiny系列等。废话少说,先上图,如果大家觉得有意思请起个哄...






说明一下,连接LCD1602的四根引线,除了红黑两根电源,两根黄色的就是信号线,其中一根传送RS和E信号,另一根传送D4~D7信号,即用四位总线驱动。

电路和程序整理中,迟些上传。[已上传]



=====================================================================================================================
更新:

挑战一下极限,再减少一根线,仍然好使,不过要另加一个电容和一个二极管。



=====================================================================================================================
更新:

无线馈电及传送数据。





===更新程序和电路===============================================
这就是电路,细心的朋友会发现实物图中有几个贴片的阻容件,秘密就在这里,利用电容的记忆效应,把并行的数据转为串行。


示范程序很简单,不用多注释应该都能看懂。作为演示用途,其中有些长时间延时没有没有使用定时器,在多任务系统中当然要用定时中断来代替了。

//         Drive a LCD1602 with 2 wire
//===================================================
//ICC-AVR application builder : 2010-10-3 19:30:02
// Target : M16
// Crystal: 4.0000Mhz

#include <iom16v.h>
#include <macros.h>

#define Set_E PORTB|=2
#define Clr_E PORTB&=~2
#define Set_D PORTB|=1
#define Clr_D PORTB&=~1
#define Set_xy(y,x) Send(0,(y<<6)|(x&15)|0x80)

//===================================================
void init_devices(void)
{
  CLI(); //disable all interrupts
  DDRB  = 0x03;
  MCUCR = 0x00;
  GICR  = 0x00;
  SEI(); //re-enable interrupts
}

//===================================================
void Delay(unsigned int i)
{
  while(i--);
}        

//===================================================
void Send(unsigned char RS, unsigned char dat)
{
  unsigned char i;
  for (i = 2; i > 0; i--)
  {
    if (dat & 0x80) Set_D; else Clr_D;
    Delay(10608);//14520us
    if (RS) Set_E;
    if (dat & 0x40) Set_D; else Clr_D;
    Delay(462);  //660us
    if (dat & 0x20) Set_D; else Clr_D;
    Delay(18);   //30us
    Set_E;
    if (dat & 0x10) Set_D; else Clr_D;
    _NOP();      //0.5us < t < 1.36us
    Clr_E;
    dat <<= 4;
  }        
}

//===================================================
void init_1602(void)
{
  unsigned char i = 3;
  Clr_D;
  Clr_E;
  Delay(10608);
  do{
    Clr_D;
    Delay(462);
    Set_D;
    Set_E;
    Delay(18);
    if (i == 0) Clr_D;
    _NOP();_NOP();_NOP();
    Clr_E;
    }while(i--);
  Send(0,0x28);
  Send(0,0x01);
  Send(0,0x0f);
}

//===================================================
void Send_S(unsigned char *p)
{
  while(*p) Send(1,*p++);
}        

//===================================================
void main(void)
{
  unsigned char i;
  init_devices();
  init_1602();
  
  Set_xy(0,2);
  Send_S("Hello world!");
  Set_xy(1,3);
  Send_S("I'm COWBOY.");
  for (i=0;i<255;i++) Delay(10000);
  
  Send(0,0x01);
  Set_xy(0,3);
  Send_S("Welcome to");
  Set_xy(1,1);
  Send_S("12345678");
  while(1);
}



=============================================================
回复蓝色天空
一个管脚通过rc,实现4个端口有点危险,
建议改成3个管脚实现。
-----------------------------------------------------------------------

回复longquan 巅
原来如此,靠相差很大的时间常数实现的
-----------------------------------------------------------------------

回复millwood0
"靠相差很大的时间常数实现的"
yes. that points to the problem with this approach: the time to send multi-bits gets exponentially longer.

-----------------------------------------------------------------------

    上面各位都看出了门道,为了保证数据传输的可靠性,相邻的两bit数据,RC时间常数相差需很大,我这里设定为22倍左右,差距越大,可靠性就越高。事实上,我试了12倍的间隔,仍能正常工作,但考虑到阻容的误差和温漂,以及电磁干扰等因素,选用了22倍间隔。太长的等比间隔,会带来了数据传送速度很慢的问题,如楼主位的RC参数,传送一字节数据约需32ms,正如millwood0所说,连续发送多个字节时,通讯线将会忙不过来,必须等待。为解决此问题,我另外写了个程序,设立发送缓冲区,环状FIFO结构,来暂存待显示的内容,并用定时中断来完成自动发送。IO是省了,却带来几十字节的内存开销,还要占用一个定时器。
    比较实用的方案,正如 zhonghua_li 蓝色天空 所说,多用一个IO,这样每个IO只驱动LCD1602的两个PIN,上面问题就能得到完美解决,包括RC时间常数的选择,也大大放宽了要求,传送速度和普通的驱动方式相当。
    大多数人会有疑问,就那么几个阻容,能可靠工作吗?我也考虑了这问题,在实际的应用中,常常看到数据线上都有小电阻与小电容组成的低通滤波网络来提高数据传输的可靠性。这里的RC用法类似,选用更大的RC,理论上对抵抗外界EMC干扰更有效,设计上只要保证时钟脉冲的下降沿时刻,各数据线的上电平符合LCD1602的要求(VH>4V,VL<1V)。实际测试表现如何?用了简单的方法进行模拟:1.不断发送数据,然后打通手机瞬间,把手机天线紧靠数据线,未发现异常。 2.用工作中的示波器信号线的地线,不断触碰LCD1602相关引脚,也未发现异常。当然这种测试并不规范,所以这种驱动方式玩玩可以,用在产品上还得慎重考虑。

=========================================================================


挑战一下极限,再减少一根线,仍然好使,不过要另加一个电容和一个二极管。



=====更新===========================================================


回复 winmcu

要不要再狠一点,只用一个io一条地线就可以了呢。貌似sony已经有这技术用于数据通信(基于芯片完成的数据通信)。
-----------------------------------------------------------------------

winmcu说的是类似消防总线的通讯方式吧,直接把串行数据调制在电源线上,不过这是需要专用芯片来解调,不能光靠几个RC就能搞掂。类似的方式,我两年前也做过,不知大家对下面这张图片是否熟悉,这就是之前我发过的贴子中一张图片,参照:http://www.51hei.com/bbs/dpj-19840-1.html
其中的示范程序中就提及到 One Wire 总线的驱动,显示模块解调所用的芯片也不是什么专用芯片,只是一片我们最熟悉不过的 74HC595 ,就能完成任务。



当时为了方便没在电源上加载数据,而单独引了一根数据线,所以看到是三根引线(VCC,GND,DAT),实际上完全可以把数据加载在电源上。
发个显示模块的底面图,就可以看到利用一片 74HC595 解调 OneWire 通讯,并驱动三位数码管的情况。
发送端(MCU)的调制也很简单,就一个IO输出,加一个三极管扩流。
如果大家有兴趣,有空时我可以另开个贴子讨论。
不过种方式用在LCD1602上,不另加芯片,我还是没想到好办法,除非外围电路弄得很复杂,但这样就失去意义了。





哈哈,没想到这个贴子会有这么多回复
貌似讨论技术的不多,其实还没到实用阶段,显示更新速度是最大缺陷,希望有人能改进。

=======================================================
回复yutianyiren
看了解释,不知道理解为单总线合不合理,也就是通过rc时间常数去控制两位数据传输时的间隔,没四位数据为一个单元,另外的一个端口相当于使能端口,控制数据与命令间的切换,不知道理解的是否正确。
-----------------------------------------------------------------------
一根线是传D4~D7,另一根是传RS和E,和你理解的差不多。

回复fshunj
cowboy,你桌面那本是什么电子电器维修书啊.后面写着貌似很多这些书籍.
你平时就是看这些书籍的吗...
-----------------------------------------------------------------------
那本书我只是收藏,没怎看。收藏价值可搜索本坛“子母电容”

回复flyhouse 丷_丷
st7920驱动的液晶就2根数据线,不过价格是1602的约5倍!
另外还有个办法,用片5元的mcu+12元的1602,亦可。
-----------------------------------------------------------------------
LCD1602 + 74HC595 组合,就能用SPI三线方式驱动。

===========================================================
SkyGz 网友提供了一个创意,一根线都不要接...
于是,就想起无线供电,应该也很有趣,弄了大半天,就有了下面的玩意,可惜距离太短了,如果能做到50CM就好了。






这个一个简单的高频振荡器,频率约3MHz,mega16的输出端对其进行ASK调制。




这是接收部分和解调部分,接收到的高频电磁波稳压后给LCD1602供电,左侧的芯片是HC595,串并转换用,焊得很丑陋~~~



回复hameyou
能不能把无线的电路贴出来,让大家都学学!
-----------------------------------------------------------------------

无线部分没实用价值,只是玩玩,距离太近了,效率很低。无线馈电我不熟悉,坛内有用无线点亮40W灯泡的贴子,可以参考。
电路贴出来,学习就免了,倒是大家可以看看如何改进,使传得更远。

点击图片看清晰大图:


左则为发射部分,右侧为接收部分,收发线圈相当于空心变压器。发射线圈是6圈,直径9CM,中心抽头。接收线圈约36圈,直径11CM。

要用无线传送数据,要解决单个信道串行传送数据问题,由于楼主位的驱动方式用两个I0驱动LCD1602,用两通道无线传输较复杂。所以,这里要先解决一个IO驱动LCD的问题。下图是一个IO通过74HC595转换后驱动LCD的原理图,单线的关键原理基本上还是利用了不同RC常数,把串行数据、时钟、锁存信号混合一起传送。观察各点的波形图可以大致看出其工作的详细情况。
单线传送方式实现后,就可以通过单通信的无线传送方式把这根线代替了。

点击图片查看清晰大图:


回复cddyy
楼主的无线传送是125khz,100% ask调制吗?
-----------------------------------------------------------------------

回复wjccui
无线馈电及传送数据???我很想知道那个是怎么回事,望高人指点。
-----------------------------------------------------------------------

回复up101
只是想请教一下无线传输电力和数据的知识,lz能讲解一下吗
-----------------------------------------------------------------------

是1MHz的100% ask调制,也叫OOK。前面的贴子也说过了,我本身对无线数传和馈电也不熟悉,只是随便弄。


回复richards
楼主 大哥 我想把这个移植到 51单片机上去 请问我应该改写什么东西?O(∩_∩)O谢谢
-----------------------------------------------------------------------

只需修改#define中对应的IO口操作方法,以及匹配延时函数中的参数与实际一致。
硬件上要求IO口具有推拉输出。

作者: zhu123    时间: 2013-8-6 15:40
原理图和程序如果顶的人多 近期就放出
作者: ymh1314520    时间: 2013-8-6 16:01
很不错。。 51hei有你更精彩!!!!!!!!
作者: aimei    时间: 2013-8-10 00:08
单片机是怎么机震的。。。

无线那个不错。。。。51hei有你更精彩!!
作者: dyun1988    时间: 2013-8-18 10:23
不错!!!!!!!!!!!!!!有程序就好!!
作者: cq201zhaoyu    时间: 2013-8-24 06:20
创意不错,学习学习。
作者: le_mf    时间: 2013-9-7 18:29
我对无线的那个比较感兴趣
作者: tgjfjeg    时间: 2013-9-22 16:58
顶,顶,这个我很要要的,就是没搞懂
作者: sunaiming    时间: 2013-9-23 11:49

辛苦了!谢谢楼主分享。
作者: smartphone    时间: 2013-9-28 00:44
大侠级别的人啊!
作者: 13620819446    时间: 2013-9-28 13:39
在哪里看啊~~
作者: xiaoafei    时间: 2013-10-4 20:21
好好学习,天天向上
作者: 二十出头    时间: 2013-10-5 21:09
楼主焊工不错!
作者: I_love_文芳    时间: 2013-10-28 07:19
51hei有你更精彩!!
作者: dengjianw    时间: 2013-11-2 15:45
好狂顶
作者: liusheng    时间: 2013-11-10 18:40
{:soso_e179:}{:soso_e179:}
作者: zerxon    时间: 2013-11-21 12:53
哇,超赞,坐等楼主共享
作者: 16062399    时间: 2013-11-25 20:33
高手,学习了!
作者: 金属蒙皮    时间: 2013-11-25 23:11
我对无线的那个比较感兴趣
作者: m182892    时间: 2013-12-15 10:04
真是牛人,厉害。
作者: xjlfh    时间: 2013-12-24 13:41
游客 220.179.174.x 发表于 2013-11-25 23:20
麻烦看看ocmj4x8c-3不显示啊,请教了。数据口接89c51哪口呢?

#include   

/******************************************************************/
//* 定义接口信息*/
//******************************************************************/
sbit RS =P2^4;        P2.4        RS   D/I
sbit WRD=P2^5;      P2.5        R/W   SID
sbit E= P2^6;          P2.6       EN    SCLK
sbit PSB=P2^1;       P2.1       PSB
sbit RES=P2^3;       P2.3       RST
作者: xzxlove    时间: 2013-12-25 15:51
楼主很有创新的头脑啊,顶你
作者: amgpj    时间: 2014-2-27 22:59
太有创意
作者: dengxianqin    时间: 2014-3-19 17:29
好东西啊
作者: LIUBZ258    时间: 2014-4-1 00:41
不错!!!顶一个!!!
作者: combat579    时间: 2014-5-6 11:30
顶一个 51hei有你更精彩!!
作者: zonghedui    时间: 2014-5-22 10:08
好东西学习了
作者: 蓝灵魔君    时间: 2014-7-2 14:43
这个就是液晶发送串行数据吧,听老师说过,可以穿行,也可以并行
作者: xwzaa    时间: 2014-7-3 10:04
太厉害了!
作者: wo_sxc    时间: 2014-8-29 19:46
牛啊!!!!!!!!!
作者: 折断的影子    时间: 2014-8-29 19:52
求分享
作者: 爱德华    时间: 2014-8-30 07:25
真心羡慕,求资料!
作者: 937166474    时间: 2014-9-1 21:20
楼主,快点方程序吧
作者: yds1024    时间: 2014-9-13 08:25
顶啊,必须顶。要看原理图和程序

作者: xing3198    时间: 2014-9-17 23:57
顶啊,必须顶。要看原理图和程序

作者: tianxing    时间: 2014-10-14 17:05
这个很实用的。
作者: 露露    时间: 2014-10-15 20:32
我 要原理图和程序啊
作者: tianxing    时间: 2014-10-17 20:40
希望能有机会学习。
作者: yuner    时间: 2014-10-17 21:33
鼓掌,学习一下
作者: yuner    时间: 2014-10-17 21:33
很有创意
作者: ynuman    时间: 2014-11-16 14:11
高人,创意无限
作者: szzheng    时间: 2014-11-20 11:31
學習中
作者: cdljb789    时间: 2014-11-25 10:49
创意无限
作者: 大家觉    时间: 2014-11-28 20:06
1602原来还可以串口啊
作者: xing3198    时间: 2014-12-1 00:11
很有用的资料,谢谢分享!!
作者: pigpighhkk    时间: 2014-12-3 12:43
頂一個
作者: 幸运阿风    时间: 2014-12-6 14:29
无线啊。。厉害
作者: liht1634    时间: 2014-12-6 15:10
无线馈电及传送数据,这个我喜欢,不过线圈是不是太大了
作者: whqh    时间: 2014-12-7 19:27
谢谢了,望早点分享到。
作者: fengye615    时间: 2014-12-15 11:51

不错!!!!!!!!!!!!!!有程序更好!
作者: ying97421    时间: 2014-12-24 20:56
很厉害,学习一下
作者: 986861262    时间: 2015-2-3 17:24
不错不错
作者: 13328730780    时间: 2015-3-21 00:59
好啊.学习了
作者: jy11    时间: 2015-3-21 04:24
一般般
作者: 子慕love    时间: 2015-3-21 09:53
碉堡了  颠覆了我对1602的世界观。。。。。
作者: 51hei电控2112312    时间: 2015-3-21 22:59
VERY  GOOD!!!
作者: miuifen    时间: 2015-3-22 16:42
有1602你这版本的说明书  就好了  你是用I2c驱动吗   
作者: khuohuo    时间: 2015-3-25 11:14
顶,顶,这个我很要要的
作者: 2316888    时间: 2015-3-30 17:58
这元件搭得太好了。
作者: yq11999    时间: 2015-3-31 20:55
牛人的贴,必须得顶!!!
作者: hai861017    时间: 2015-4-1 10:53
楼主真牛!
作者: dingmingzhou    时间: 2015-4-1 20:30
数据口为P0
作者: fanxb    时间: 2015-4-2 14:49

作者: 6ningning    时间: 2015-4-12 14:49
这个列害呀。
作者: l754768458    时间: 2015-4-18 15:28
不错不错
作者: lsl1002    时间: 2015-4-18 22:17
顶,确实很牛
作者: jack88    时间: 2015-4-22 12:29
撸主真厉害,佩服佩服
作者: jjbboox    时间: 2015-5-18 16:57
希望楼主能把原理讲讲清楚
看了半天还是不清楚并行口怎么就能串行输入的。
貌似是靠电容进行物理移位过去的,但是也没看到1602上有电容啊?(2根线的方式)

看代码也无法倒推出原理啊
作者: 华人科技    时间: 2015-6-8 13:29
顶是必须的
作者: dely2009    时间: 2015-6-14 10:15
楼主高人,玩出的境界还是不一般地.....
作者: PLA    时间: 2015-6-16 13:10
高手呀!
作者: holkin    时间: 2015-6-25 10:31
大神啊!直接跪拜!
作者: mtkmt6225    时间: 2015-8-21 09:33
好,收藏了!
作者: hslcac    时间: 2015-8-29 23:19
无线充送系统很先进啊,学习了订楼组
作者: beautiful-life    时间: 2015-8-30 08:44
楼主,我怎么没看到单片机振荡电路呢?这也能工作,好神奇!
作者: 岳达    时间: 2015-8-30 10:05
牛逼啊
作者: 为了女    时间: 2015-9-6 22:56
高手在民间,顶!
作者: 血一    时间: 2015-9-7 14:19
感觉不错哦,顶起
作者: TRANSHUMAN    时间: 2015-9-8 11:21
创意不错,学习学习。
作者: somexu    时间: 2015-10-13 16:58
嘆為觀止啊
作者: yangkai3bu    时间: 2015-10-21 15:58
大神啊,拜倒了。
作者: 798265341    时间: 2015-10-23 16:03
狂人,真是大神望有更多的经典
作者: mjh630    时间: 2016-3-21 10:25
e有时可以看到,有时不行啊
作者: weimada    时间: 2016-4-4 13:09
厉害! 51hei有你更精彩!!
作者: dragon19790000    时间: 2016-4-8 11:03
学习了,真的不错!!
作者: captainiron    时间: 2016-5-9 21:49
真厉害
作者: 爱玩单片机    时间: 2016-5-17 14:04
太精彩了正需要
作者: lizhendong    时间: 2016-10-4 16:57
51hei ,你太牛了,真给力
作者: 雪玉寐影    时间: 2016-10-31 17:36
果然没有最简,只有更简,1602只用1根数据线,电路还如此简单,简直绝了
作者: vs795    时间: 2016-10-31 23:06
看了半天还是看不懂是什么来的!
作者: dxa572862121    时间: 2016-11-7 12:12
大神级别。
作者: ztflove51    时间: 2016-12-24 10:10
厉害,厉害,仰慕
作者: keven17    时间: 2016-12-25 10:50
大神请收下我的膝盖
作者: liuzhaoxin1020    时间: 2016-12-25 16:18
楼主厉害,分享一下原件清单
作者: 繁华一世简    时间: 2017-1-2 18:57
楼主太牛了
作者: atl0402    时间: 2017-1-3 14:53
原来牛人也在这里,看来来晚了
作者: bg7nr    时间: 2017-2-23 23:39
真心羡慕,求资料!
作者: hangmw    时间: 2017-2-24 09:07
无线的那个比较好
作者: hangmw    时间: 2017-2-24 09:09
无线的那个比较好
作者: gdatgb    时间: 2017-3-1 22:35
谢谢楼主分享。太厉害了! 也学习一下!




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1