找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5248|回复: 10
打印 上一主题 下一主题
收起左侧

实用任意三个单片机IO口连接LCD1602A液晶屏

  [复制链接]
跳转到指定楼层
楼主
之前看到一个牛人zhu123帖子,是用二线连接1602。只用2个IO口节省了资源,但效果不太好,显示速度慢。改成三线后效果就很好,可以实用化。这种接法的原理就是利用电容的充电放电效应进行存储数字位,类似动态存储器的原理。原贴是用51汇编写的,现在我用Arduino实现了三线连接的实用化。经实验,瓷片电容选择范围可从10nf-100nf都可以。代码有注释,很好懂。
二线连接帖子位置http://www.51hei.com/bbs/dpj-20365-1.html

制作出来的实物图如下:


单片机源程序如下:
  1. #define setXy(x,y) lcdWrite(0,(x<<6)|(y&15)|0x80)
  2. #define dataA  4
  3. #define dataB 5
  4. #define commPin  6

  5. void lcdWrite(byte RS,char dat)
  6. {
  7. byte i;
  8. for (i = 2; i > 0; --i) //运行两次,分别对应字节高4位和低4位
  9.   {
  10.     digitalWrite( dataB,dat & 0x80);  //LED_D7口。置位数据口为1。如果D7是1,先给D7位的C4充电(C1、C2、C3也会充满电,这里不用管),在跌到低电平之前,将其他3个位充好电,再将1602使能读入,即可完成半个字节数据的读入。
  11.     digitalWrite( dataA,dat & 0x20); //LED_D5口。置位数据口为1   
  12.     digitalWrite( commPin,RS);//置位命令口为1。如果RS是1,是数据,0是命令   
  13.     delayMicroseconds(400);  //683电容,延时400us   
  14.     digitalWrite( commPin,HIGH);  //置位命令口为1
  15.     digitalWrite( dataB,dat & 0x40); //LED_D6口。置位数据口为1   
  16.     digitalWrite( dataA,dat & 0x10); //LED_D4口。置位数据口为1         
  17.     delayMicroseconds(1);      //0.5us < t < 1.36us
  18.     digitalWrite( commPin,LOW);  //命令口清零,1602使能,读入数据
  19.     delayMicroseconds(50);
  20.     dat <<= 4;
  21.   }        
  22. }
  23. void lcdPrint(char *p)
  24. {
  25.   while(*p) lcdWrite(1,*p++);
  26. }
  27. void lcdInit(void)
  28. {
  29.    byte i = 3;
  30.   digitalWrite( dataB,LOW);  //D7=0
  31.   digitalWrite( commPin,LOW);  //命令口清零
  32.   delayMicroseconds(400); //683电容,延时400us
  33.   do{
  34.       digitalWrite( dataB,LOW);  //D6=0
  35.       delayMicroseconds(1);
  36.       digitalWrite( dataA,HIGH);  //D5=1      
  37.       delayMicroseconds(400); //683电容,延时400us
  38.       if (i == 0) {digitalWrite( dataA,LOW); } //D4=0      
  39.       digitalWrite( commPin,HIGH);  //置位命令口为1
  40.       delayMicroseconds(3);
  41.       digitalWrite( commPin,LOW);  //命令口清零
  42.       delayMicroseconds(3);
  43.     }while(i--);   
  44.   delay(100);
  45.   lcdWrite(0,0x28);  //4线 2行 5x7
  46.   delay(50);;
  47.   lcdWrite(0,0x06);//输入方式自动增量,没有显示移位
  48.   delay(50);;
  49.   lcdWrite(0,0x0c);//开启显示屏,光标不显示,无闪烁
  50.   delay(50);;
  51.   lcdWrite(0,0x01);//清除显示屏,地址计数器AC归零
  52.   delay(50);;
  53. }
  54. int  adc;
  55. void setup()
  56. {
  57.   byte aa=45;
  58.   pinMode(dataA,OUTPUT);
  59.   pinMode(dataB,OUTPUT);
  60.   pinMode(commPin,OUTPUT);  
  61.   delay(100);
  62.   lcdInit();//对LCD进行初始化   
  63. }
  64. void loop()
  65. {
  66. setXy(0,0);
  67.   lcdPrint("                ");
  68.   setXy(0,0);
  69.   lcdPrint("The value is:");   
  70.   setXy(1,0);
  71.   lcdPrint("                ");
  72.   setXy(1,0);
  73.   lcdPrint("352");
  74.   delay(1000);
复制代码

以上程序51hei提供下载:
三线连接1602.zip (1.11 KB, 下载次数: 41)


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏6 分享淘帖 顶1 踩
回复

使用道具 举报

沙发
ID:163501 发表于 2020-3-2 21:42 | 只看该作者
很好的东西,可惜不会Arduino,不能移植。
回复

使用道具 举报

板凳
ID:102702 发表于 2020-3-3 00:27 | 只看该作者
楼主用的是什么单片机,M8可以吗?
回复

使用道具 举报

地板
ID:688914 发表于 2020-3-3 16:11 | 只看该作者
Liangkan 发表于 2020-3-2 21:42
很好的东西,可惜不会Arduino,不能移植。

参考zhu123的帖子,应该就可以了。
回复

使用道具 举报

5#
ID:688914 发表于 2020-3-3 16:22 | 只看该作者
raymondau 发表于 2020-3-3 00:27
楼主用的是什么单片机,M8可以吗?

M8我没有用过。属于Arduino系列应该可以用。
回复

使用道具 举报

6#
ID:102702 发表于 2020-3-3 21:17 | 只看该作者
gdbin001 发表于 2020-3-3 16:22
M8我没有用过。属于Arduino系列应该可以用。

好的,我试一下,谢谢!
回复

使用道具 举报

7#
ID:906120 发表于 2021-5-13 09:22 | 只看该作者
这个用stc89c52能实现吗?
回复

使用道具 举报

8#
ID:824490 发表于 2021-5-19 10:50 | 只看该作者
自个玩玩可以,别真把它做进产品。
回复

使用道具 举报

9#
ID:71297 发表于 2021-5-20 21:01 | 只看该作者
可以用上少脚的单片机
回复

使用道具 举报

10#
ID:951974 发表于 2022-12-12 21:03 | 只看该作者
自个玩玩可以,别真把它做进产品
回复

使用道具 举报

11#
ID:161164 发表于 2022-12-13 13:27 | 只看该作者
8051版本


  1. #include <reg52.h>

  2. typedef         unsigned char        u8;  //0 to 255
  3. typedef         unsigned int        u16;  //0 to 65535
  4. typedef         unsigned long        u32;  //0 to 4294967295
  5. sbit EN_RS = P2^5;
  6. sbit D4_D6 = P2^6;
  7. sbit D5_D7 = P2^7;
  8. #define SetRS 0x01
  9. #define RstRS 0x00
  10. void Delay2ms()                //@12.000MHz
  11. {
  12.     unsigned char i, j;

  13.     i = 4;
  14.     j = 225;
  15.     do
  16.     {
  17.         while (--j);
  18.     }
  19.     while (--i);
  20. }
  21. void Delay200us()                //@12.000MHz
  22. {
  23.     unsigned char i;

  24.     i = 97;
  25.     while (--i);
  26. }
  27. void ThreeWire(u8 dat)
  28. {
  29.     EN_RS = (bit)(dat & 0x01);
  30.     D4_D6 = (bit)(dat & 0x40);
  31.     D5_D7 = (bit)(dat & 0x80);
  32.     Delay200us();
  33.     D4_D6 = (bit)(dat & 0x10);
  34.     D5_D7 = (bit)(dat & 0x20);
  35.     EN_RS = 1;
  36.     EN_RS = 0;
  37.     D4_D6 = 0;
  38.     D5_D7 = 0;
  39.     Delay200us();
  40. }
  41. void LCD_Init_4bit();
  42. void LCD_WChar_4bit(u8 Row, u8 Address, char chr);
  43. void LCD_WStr_4bit(u8 Row, u8 Address, char *Str);

  44. void LCD_WCMD(u8 Cmd)
  45. {
  46.     ThreeWire(RstRS | (Cmd & 0xF0));
  47.     ThreeWire(RstRS | (Cmd << 4));
  48. }
  49. void LCD_WDAT(u8 Dat)
  50. {
  51.     ThreeWire(SetRS | (Dat & 0xF0));
  52.     ThreeWire(SetRS | (Dat << 4));
  53. }
  54. void LCD_Init_4bit()
  55. {
  56.     LCD_WCMD(0x02);
  57.     LCD_WCMD(0x28);
  58.     LCD_WCMD(0x0c);
  59.     LCD_WCMD(0x06);
  60.     LCD_WCMD(0x01);
  61.     Delay2ms();
  62. }
  63. void LCD_WChar_4bit(u8 Row, u8 Address, char chr)
  64. {
  65.     if(Row == 1)LCD_WCMD(0x80 + Address);
  66.     if(Row == 2)LCD_WCMD(0xc0 + Address);

  67.     LCD_WDAT(chr);
  68. }
  69. void LCD_WStr_4bit(u8 Row, u8 Address, char *Str)
  70. {
  71.     if(Row == 1)LCD_WCMD(0x80 + Address);
  72.     if(Row == 2)LCD_WCMD(0xc0 + Address);
  73.     while(*Str)
  74.     {
  75.         LCD_WDAT(*Str);
  76.         Str++;
  77.     }
  78. }
  79. void Delay1000ms()                //@12.000MHz
  80. {
  81.     unsigned char i, j, k;

  82.     i = 8;
  83.     j = 154;
  84.     k = 122;
  85.     do
  86.     {
  87.         do
  88.         {
  89.             while (--k);
  90.         }
  91.         while (--j);
  92.     }
  93.     while (--i);
  94. }

  95. u8 Count = 0;
  96. void main()
  97. {
  98.     EN_RS = 0;
  99.     D4_D6 = 0;
  100.     D5_D7 = 0;
  101.     LCD_Init_4bit();
  102.     LCD_WStr_4bit(1,0,"Hello World!");
  103.     LCD_WStr_4bit(2,0,"3 Wire LCD");
  104.     while (1)
  105.     {
  106.         LCD_WChar_4bit(2,13,Count/100%10 + '0');
  107.         LCD_WChar_4bit(2,14,Count/10%10 + '0');
  108.         LCD_WChar_4bit(2,15,Count%10 + '0');
  109.         Count++;
  110.         Delay1000ms();
  111.     }
  112. }
复制代码



回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表