我们从2011年坚守至今,只想做存粹的技术论坛。  由于网站在外面,点击附件后要很长世间才弹出下载,请耐心等待,勿重复点击不要用Edge和IE浏览器下载,否则提示不安全下载不了

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

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

[复制链接]

该用户从未签到

38

主题

526

回帖

292

积分

二级逆天

天高任鸟飞

积分
292

社区居民终身成就奖

QQ
发表于 2014-1-23 09:52:27 | 显示全部楼层 |阅读模式
用尽量少的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相关引脚,也未发现异常。当然这种测试并不规范,所以这种驱动方式玩玩可以,用在产品上还得慎重考虑。
回复

使用道具 举报

该用户从未签到

3

主题

263

回帖

193

积分

二级逆天

积分
193

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

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

使用道具 举报

该用户从未签到

6

主题

98

回帖

78

积分

一级逆天

积分
78

社区居民终身成就奖

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

使用道具 举报

  • TA的每日心情
    开心
    2024-9-11 12:50
  • 签到天数: 1 天

    [LV.1]初来乍到

    18

    主题

    1122

    回帖

    1740

    积分

    二级逆天

    积分
    1740

    社区居民终身成就奖

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

    使用道具 举报

  • TA的每日心情
    奋斗
    前天 22:38
  • 签到天数: 35 天

    [LV.5]常住居民I

    26

    主题

    2226

    回帖

    1402

    积分

    二级逆天

    积分
    1402

    终身成就奖社区居民

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

    使用道具 举报

    该用户从未签到

    1

    主题

    18

    回帖

    1

    积分

    一级逆天

    积分
    1

    终身成就奖社区居民

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

    使用道具 举报

    该用户从未签到

    16

    主题

    663

    回帖

    26

    积分

    禁止发言

    积分
    26

    社区居民终身成就奖

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

    使用道具 举报

    该用户从未签到

    3

    主题

    107

    回帖

    84

    积分

    二级逆天

    积分
    84

    终身成就奖社区居民

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

    使用道具 举报

    该用户从未签到

    5

    主题

    2005

    回帖

    2060

    积分

    二级逆天

    积分
    2060

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

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

    使用道具 举报

  • TA的每日心情
    开心
    昨天 09:25
  • 签到天数: 46 天

    [LV.5]常住居民I

    182

    主题

    1万

    回帖

    2万

    积分

    PADS-180606高级班

    积分
    22376

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

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

    使用道具 举报

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

    本版积分规则

    论坛开启做任务可以
    额外奖励金币快速赚
    积分升级了


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

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

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