当前位置:首页 > 单片机 > 单片机
[导读]这就是电路,细心的朋友会发现实物图中有几个贴片的阻容件,秘密就在这里,利用电容的记忆效应,把并行的数据转为串行。(原文件名:2wire_1602.PNG)示范程序很简单,不用多注释应该都能看懂。作为演示用途,其中有些长

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

(原文件名:2wire_1602.PNG)

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

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

#include
#include

#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("www.ourdev.cn");
while(1);
}

/**************************************************************************************************/

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

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

回复【26楼】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相关引脚,也未发现异常。当然这种测试并不规范,所以这种驱动方式玩玩可以,用在产品上还得慎重考虑。

/**************************************************************************************************/

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

/**************************************************************************************************/

回复【63楼】winmcu

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

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




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




本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

lcd1602液晶屏在很懂工业产品上都有应用,LCD1602能够能够同时显示32个字符,价格便宜,编程简单而且稳定可靠。lcd1602液晶屏是一种图形点阵显示器,显示原理简单易懂,都是液晶屏内部的液晶材料变化而显示不同的...

关键字: lcd1602 接线

  用户所编的显示程序,开始必须进行初始化,否则模块无法正常显示,下面介绍两种初始化方法:   1. 利用内部复位电路进行初始化   下面指令是在初始化过程中执行的。  

关键字: lcd1602

什么是Hirose IX Industrial系列I/O连接器?它有什么作用?最新半导体和电子元件的全球授权分销商贸泽电子即日起开始备货Hirose Electric Company的IX Industrial系列I/O...

关键字: io 贸泽 连接器

皮尔磁:PSS4000为客户实现卓越的卫生设备生产性能   在中国智能制造2025计划的影响下,随着技术能力的不断提升,越来越多的中国公司成功凭借高质量、可靠性较高的设备获得了国际市

关键字: io plc pss

在这篇文章中,小编将为大家带来微星MEG Z490 GODLIKE主板的背部I/O接口进行介绍,一起来了解下吧。

关键字: io z490 微星

——魏德米勒u-remote远程I/O在烟草物流分拣设备的应用

关键字: io u-remote 电气联接

随着工业自动化技术的不断发展,分布式I/O作为系统的重要组件,在工业现场已有大规模的应用。

关键字: io 分布式 魏德米勒

5月7日消息,Google正式发布了针对Android 11的预告视频,并发布了每个版本的Android 11的发布时间表。Android11Beta版将在6月3日的在线会议上正式发布。

关键字: 11 Android io 谷歌

通常,每年的I / O开发者大会都会吸引大量的参与者。

关键字: android11 io 谷歌

3月21日消息称,谷歌最近宣布将完全取消今年I / O会议的通话时间表。 本月初,Google宣布I / O 2020上线。 但是,由于疫情恶化,Google必须宣布完全取消会议。

关键字: android11 io 谷歌
关闭
关闭