圣龙扬特-AVR电子

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1882|回复: 14
打印 上一主题 下一主题

3个IO驱动LCD1602

[复制链接]

6

主题

0

好友

508

积分

高级会员

Rank: 4

UID
61
帖子
33
精华
1
注册时间
2013-3-1
在线时间
33 小时
跳转到指定楼层
楼主
发表于 2013-3-8 19:29:13 |只看该作者 |倒序浏览
本帖最后由 Tliang 于 2013-3-9 10:11 编辑

使用单片机的3个IO驱动LCD1602
只要加几个电容和电阻即可
说明:
这个办法我也是在网上看到的。不是我的原创。

工程包:
里面包括KEIL工程和PROTEUS仿真文件




原理:
这个是利用电容的记忆特性来做的。
也就是充放电。
当电容里面没有电的时候,就相当于短路。这个时候自然是0了
如果你想要他变成1,那么就给他充一段时间的电,给他充电的这个IO拉高,等到充好了。然后你再置0,这个时候就有两个不同的状态了。因为电容充完电后要变成0的话有一个放电过程。而你在他的电还没放完的时候就将数据写入LCD这样就OK了。
如果你要他变0就把他的电放完,也就是把IO拉低。等电放完后他又变成0.然后你在改变IO的状态。他充电也要一段时间才能到1.

使用KEIL和PROTEUS联调可以很清楚看到整个过程。很容易理解

图片:

代码:
  1. #include<reg52.h>

  2. sbit E_And_RS = P1 ^ 2;
  3. sbit Data1 = P1 ^ 1;
  4. sbit Data2 = P1;

  5. typedef bit ubit;
  6. typedef unsigned char uint8;
  7. typedef unsigned int uint16;
  8. typedef unsigned long uint32;

  9. void delay(uint16 Time)
  10. {
  11.         while(Time--);
  12. }


  13. void LCD_WriteDataAndComm(uint8 Data, ubit Control)
  14. {
  15.         uint8 Flag;
  16.         for(Flag = 0;Flag < 2;Flag++)
  17.         {
  18.                 if(Control) //判断写命令还是写数据
  19.                         E_And_RS = 1; //写数据,对RS脚充电
  20.                 else
  21.                         E_And_RS = 0; //写命令,对RS脚放电

  22.                 if(Data & 0x20) //判断D7脚数据
  23.                         Data1 = 1; //为1则充电
  24.                 else
  25.                         Data1 = 0; //放电

  26.                 if(Data & 0x80) //判断D5脚数据
  27.                         Data2 = 1;
  28.                 else
  29.                         Data2 = 0;

  30.                 delay(30); //等待充满或放完

  31.                 if(Data & 0x10) //判断D4脚数据
  32.                         Data1 = 1; //输出数据
  33.                 else
  34.                         Data1 = 0;

  35.                 if(Data & 0x40) //判断D6脚数据
  36.                         Data2 = 1;
  37.                 else
  38.                         Data2 = 0;

  39.                 E_And_RS = 1; //拉高
  40.                 Data <<= 4;
  41.                 E_And_RS = 0; //数据写入.

  42.         }
  43.         delay(20);
  44. }

  45. void LCD_Init(void)
  46. {
  47.         E_And_RS = 0;                                          //RS脚放电
  48.         Data1 = 1;                                                 //D5脚充电,
  49.         Data2 = 0;                                                 //D7脚放电
  50.         delay(30);                                                  //等待充满或放完
  51.         Data1 = 0;                                                 //拉低D4
  52.         E_And_RS = 1;                                         //写入0x20,为4BIT模式
  53.         delay(1);
  54.         E_And_RS = 0;                                         //写入数据,LCD1602为上升沿读出数据下降沿写入数据

  55.         LCD_WriteDataAndComm(0x28, 0);
  56.         LCD_WriteDataAndComm(0x08, 0);
  57.         LCD_WriteDataAndComm(0x01, 0);
  58.         LCD_WriteDataAndComm(0x06, 0);
  59.         LCD_WriteDataAndComm(0x0C, 0);
  60. }

  61. void Show_Str(uint8 *Str, uint8 Addr)
  62. {
  63.         LCD_WriteDataAndComm(Addr, 0);
  64.         while(*Str)
  65.                 LCD_WriteDataAndComm(*Str++, 1);
  66. }

  67. void main(void)
  68. {
  69.         LCD_Init();
  70.         Show_Str("Tliang Holle!", 0x80);
  71.         Show_Str("QQ:459436468", 0xc3);
  72.         while(1);
  73. }
复制代码

本帖子中包含更多资源

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

回复

使用道具 举报

26

主题

1

好友

3446

积分

超级版主

Rank: 8Rank: 8

UID
7
帖子
140
精华
0
注册时间
2013-2-26
在线时间
20 小时

突出贡献

沙发
发表于 2013-3-8 19:34:45 |只看该作者
这也行?
回复

使用道具 举报

67

主题

4

好友

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

UID
2
帖子
343
精华
0
注册时间
2013-2-20
在线时间
368 小时
板凳
发表于 2013-3-8 20:03:23 |只看该作者
天亮,验证过没有,说说原理,把原理放主楼。然后就可以加精了。
回复

使用道具 举报

6

主题

0

好友

508

积分

高级会员

Rank: 4

UID
61
帖子
33
精华
1
注册时间
2013-3-1
在线时间
33 小时
地板
发表于 2013-3-9 09:22:24 |只看该作者
本帖最后由 Tliang 于 2013-3-9 10:20 编辑
箫天 发表于 2013-3-8 20:03
天亮,验证过没有,说说原理,把原理放主楼。然后就可以加精了。


我在仿真上试过,实际应该也可以(我网上看的那个别人就是用实物来做的)。
希望老大能给个精
回复

使用道具 举报

13

主题

1

好友

322

积分

中级会员

Rank: 3Rank: 3

UID
217
帖子
42
精华
0
注册时间
2013-3-5
在线时间
13 小时
5#
发表于 2013-3-9 17:41:18 |只看该作者
验证上图看看
回复

使用道具 举报

26

主题

1

好友

3446

积分

超级版主

Rank: 8Rank: 8

UID
7
帖子
140
精华
0
注册时间
2013-2-26
在线时间
20 小时

突出贡献

6#
发表于 2013-3-10 20:00:15 |只看该作者
原理一说,清楚了。
回复

使用道具 举报

26

主题

1

好友

3446

积分

超级版主

Rank: 8Rank: 8

UID
7
帖子
140
精华
0
注册时间
2013-2-26
在线时间
20 小时

突出贡献

7#
发表于 2013-3-10 20:00:32 |只看该作者
果然该射精!
回复

使用道具 举报

4

主题

0

好友

3144

积分

版主

Rank: 7Rank: 7Rank: 7

UID
57
帖子
26
精华
0
注册时间
2013-2-28
在线时间
13 小时
8#
发表于 2013-3-11 15:01:03 |只看该作者
生猛!
回复

使用道具 举报

2

主题

0

好友

419

积分

中级会员

Rank: 3Rank: 3

UID
105
帖子
55
精华
0
注册时间
2013-3-2
在线时间
15 小时
9#
发表于 2013-3-11 23:33:31 |只看该作者
亮哥你真是仿真高人啊!!
回复

使用道具 举报

6

主题

1

好友

3385

积分

超级版主

Rank: 8Rank: 8

UID
10
帖子
48
精华
1
注册时间
2013-2-26
在线时间
27 小时
10#
发表于 2013-3-12 09:18:33 |只看该作者
可以,还有用一根线驱动的,考的是容阻改变信号的相位
天之道,利而不害;圣人之道,为而不争
回复

使用道具 举报

6

主题

0

好友

508

积分

高级会员

Rank: 4

UID
61
帖子
33
精华
1
注册时间
2013-3-1
在线时间
33 小时
11#
发表于 2013-3-12 09:31:40 |只看该作者
八斤 发表于 2013-3-12 09:18
可以,还有用一根线驱动的,考的是容阻改变信号的相位

- -!
一根线太慢了
回复

使用道具 举报

0

主题

0

好友

499

积分

中级会员

Rank: 3Rank: 3

UID
238
帖子
7
精华
0
注册时间
2013-3-7
在线时间
46 小时
12#
发表于 2013-3-13 07:54:47 |只看该作者
学习了,谢谢楼主分享!!
回复

使用道具 举报

0

主题

0

好友

18

积分

新手上路

Rank: 1

UID
172
帖子
4
精华
0
注册时间
2013-3-4
在线时间
2 小时
13#
发表于 2013-3-13 10:34:28 |只看该作者
路过看看,谢谢分享!!!!
回复

使用道具 举报

3

主题

0

好友

3058

积分

版主

Rank: 7Rank: 7Rank: 7

UID
9
帖子
9
精华
0
注册时间
2013-2-26
在线时间
3 小时
14#
发表于 2013-3-18 23:34:14 |只看该作者
我以前用三个io是通过595实现的,这个nb,但是可能会造成程序复杂速度慢。
回复

使用道具 举报

0

主题

0

好友

16

积分

新手上路

Rank: 1

UID
366
帖子
6
精华
0
注册时间
2013-4-19
在线时间
0 小时
15#
发表于 2013-4-19 22:37:41 |只看该作者
这样都行,太牛了!
回复

使用道具 举报

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

Archiver|手机版|圣龙扬特-AVR电子 ( 鲁ICP备05022832号 )

GMT+8, 2024-12-22 01:05 , Processed in 0.265301 second(s), 20 queries .

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc.

回顶部