Tliang 发表于 2013-3-8 19:29:13

3个IO驱动LCD1602

本帖最后由 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联调可以很清楚看到整个过程。很容易理解

图片:

代码: #include<reg52.h>

sbit E_And_RS = P1 ^ 2;
sbit Data1 = P1 ^ 1;
sbit Data2 = P1;

typedef bit ubit;
typedef unsigned char uint8;
typedef unsigned int uint16;
typedef unsigned long uint32;

void delay(uint16 Time)
{
        while(Time--);
}


void LCD_WriteDataAndComm(uint8 Data, ubit Control)
{
        uint8 Flag;
        for(Flag = 0;Flag < 2;Flag++)
        {
                if(Control) //判断写命令还是写数据
                        E_And_RS = 1; //写数据,对RS脚充电
                else
                        E_And_RS = 0; //写命令,对RS脚放电

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

                if(Data & 0x80) //判断D5脚数据
                        Data2 = 1;
                else
                        Data2 = 0;

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

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

                if(Data & 0x40) //判断D6脚数据
                        Data2 = 1;
                else
                        Data2 = 0;

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

        }
        delay(20);
}

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

        LCD_WriteDataAndComm(0x28, 0);
        LCD_WriteDataAndComm(0x08, 0);
        LCD_WriteDataAndComm(0x01, 0);
        LCD_WriteDataAndComm(0x06, 0);
        LCD_WriteDataAndComm(0x0C, 0);
}

void Show_Str(uint8 *Str, uint8 Addr)
{
        LCD_WriteDataAndComm(Addr, 0);
        while(*Str)
                LCD_WriteDataAndComm(*Str++, 1);
}

void main(void)
{
        LCD_Init();
        Show_Str("Tliang Holle!", 0x80);
        Show_Str("QQ:459436468", 0xc3);
        while(1);
}

铜河 发表于 2013-3-8 19:34:45

这也行?

箫天 发表于 2013-3-8 20:03:23

天亮,验证过没有,说说原理,把原理放主楼。然后就可以加精了。:lol

Tliang 发表于 2013-3-9 09:22:24

本帖最后由 Tliang 于 2013-3-9 10:20 编辑

箫天 发表于 2013-3-8 20:03 http://www.avrbase.com/static/image/common/back.gif
天亮,验证过没有,说说原理,把原理放主楼。然后就可以加精了。

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

oszp1688com 发表于 2013-3-9 17:41:18

验证上图看看

铜河 发表于 2013-3-10 20:00:15

原理一说,清楚了。

铜河 发表于 2013-3-10 20:00:32

果然该射精!

笨驴熊Rev2.2 发表于 2013-3-11 15:01:03

生猛!

多啦A梦 发表于 2013-3-11 23:33:31

亮哥你真是仿真高人啊!!

八斤 发表于 2013-3-12 09:18:33

可以,还有用一根线驱动的,考的是容阻改变信号的相位

Tliang 发表于 2013-3-12 09:31:40

八斤 发表于 2013-3-12 09:18 static/image/common/back.gif
可以,还有用一根线驱动的,考的是容阻改变信号的相位

- -!
一根线太慢了

shcqma 发表于 2013-3-13 07:54:47

学习了,谢谢楼主分享!!

pkjcmtr8f 发表于 2013-3-13 10:34:28

路过看看,谢谢分享!!!!

cqmiao 发表于 2013-3-18 23:34:14

我以前用三个io是通过595实现的,这个nb,但是可能会造成程序复杂速度慢。

gongliang 发表于 2013-4-19 22:37:41

这样都行,太牛了!
页: [1]
查看完整版本: 3个IO驱动LCD1602