我们从2011年坚守至今,只想做纯粹的技术论坛,请不要发布和技术无关的话题。  本站有两万多份高大上的PCB和原理图下载,每日更新中,欢迎常回来看看

 找回密码
 立即注册
搜索
查看: 4941|回复: 14

[转载DIY秀] 任意2个io直接驱动LCD1602,不需外加芯片

[复制链接]

37

主题

454

回帖

1707

积分

二级逆天

天高任鸟飞

积分
1707

社区居民终身成就奖

QQ
发表于 2014-1-23 09:52 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区

您需要 登录 才可以下载或查看,没有账号?立即注册

×
用尽量少的IO来驱动1602,以适应在某些引脚较少的MCU,如Tiny系列等。废话少说,先上图,如果大家觉得有意思请起个哄...


                               
登录/注册后可看大图


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



                               
登录/注册后可看大图


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

//         Drive a LCD1602 with 2 wire

//===================================================

//ICC-AVR application

// 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("www.ourdev.cn");

  while(1);

}

为了保证数据传输的可靠性,相邻的两bit数据,RC时间常数相差需很大,我这里设定为22倍左右,差距越大,可靠性就越高。事实上,我试了12倍的间隔,仍能正常工作,但考虑到阻容的误差和温漂,以及电磁干扰等因素,选用了22倍间隔。太长的等比间隔,会带来了数据传送速度很慢的问题。连续发送多个字节时,通讯线将会忙不过来,必须等待。为解决此问题,我另外写了个程序,设立发送缓冲区,环状FIFO结构,来暂存待显示的内容,并用定时中断来完成自动发送。IO是省了,却带来几十字节的内存开销,还要占用一个定时器。


大多数人会有疑问,就那么几个阻容,能可靠工作吗?我也考虑了这问题,在实际的应用中,常常看到数据线上都有小电阻与小电容组成的低通滤波网络来提高数据传输的可靠性。这里的RC用法类似,选用更大的RC,理论上对抵抗外界EMC干扰更有效,设计上只要保证时钟脉冲的下降沿时刻,各数据线的上电平符合LCD1602的要求(VH>4V,VL<1V)。实际测试表现如何?用了简单的方法进行模拟:1.不断发送数据,然后打通手机瞬间,把手机天线紧靠数据线,未发现异常。 2.用工作中的示波器信号线的地线,不断触碰LCD1602相关引脚,也未发现异常。当然这种测试并不规范,所以这种驱动方式玩玩可以,用在产品上还得慎重考虑。

0

主题

179

回帖

691

积分

二级逆天

积分
691

终身成就奖社区居民宣传大使奖

QQ
发表于 2014-1-23 12:42 | 显示全部楼层
回复

使用道具 举报

6

主题

76

回帖

176

积分

二级逆天

积分
176

社区居民终身成就奖

QQ
发表于 2014-1-23 17:31 | 显示全部楼层
回复

使用道具 举报

  • 打卡等级:初入少年
  • 打卡总天数:1
  • 打卡月天数:0
  • 打卡总奖励:4
  • 最近打卡:2024-09-11 12:50:58

7

主题

892

回帖

1743

积分

二级逆天

积分
1743

社区居民终身成就奖

QQ
发表于 2014-2-25 22:45 | 显示全部楼层
回复

使用道具 举报

  • 打卡等级:以坛为家II
  • 打卡总天数:297
  • 打卡月天数:1
  • 打卡总奖励:1082
  • 最近打卡:2026-11-08 16:03:14

25

主题

2015

回帖

2135

积分

二级逆天

积分
2135

终身成就奖社区居民

QQ
发表于 2014-3-5 12:08 | 显示全部楼层
回复

使用道具 举报

1

主题

18

回帖

17

积分

一级逆天

积分
17

终身成就奖社区居民

QQ
发表于 2014-3-28 21:52 | 显示全部楼层
回复

使用道具 举报

16

主题

522

回帖

171

积分

二级逆天

积分
171

社区居民终身成就奖

QQ
发表于 2014-7-12 13:47 | 显示全部楼层
回复

使用道具 举报

3

主题

76

回帖

236

积分

二级逆天

积分
236

终身成就奖社区居民

QQ
发表于 2014-7-16 08:37 | 显示全部楼层
回复

使用道具 举报

4

主题

1532

回帖

3821

积分

二级逆天

积分
3821

终身成就奖社区居民忠实会员社区劳模最爱沙发优秀斑竹奖

QQ
发表于 2014-7-16 08:46 | 显示全部楼层
回复

使用道具 举报

  • 打卡等级:常住青年
  • 打卡总天数:51
  • 打卡月天数:0
  • 打卡总奖励:163
  • 最近打卡:2026-01-15 15:12:53

170

主题

1万

回帖

2万

积分

PADS-180606高级班

积分
22717

终身成就奖社区居民忠实会员社区劳模最爱沙发优秀斑竹奖特殊贡献奖原创先锋奖

发表于 2014-7-16 10:30 | 显示全部楼层
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Copyright ©2011-2024 NTpcb.com All Right Reserved.  Powered by Discuz! (NTpcb)

本站信息均由会员发表,不代表NTpcb立场,如侵犯了您的权利请举报投诉

本站所有资料仅限参考学习交流,PCB原理图源码等所有资料不保证准确没问题,请不要用作生产。否则后果自负。

闽公网安备35062302000276号 | 闽ICP备2024076463号-1 | 论坛技术支持QQ群171867948 | 论坛问题,充值问题请联系QQ1308068381

平平安安
TOP
快速回复 返回顶部 返回列表