找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6232|回复: 0
收起左侧

74HC595驱动LCD1602(主控芯片at328p)

[复制链接]
ID:99624 发表于 2015-12-27 03:10 | 显示全部楼层 |阅读模式
LCD貌似很少用了 太小  这个作为串入并出的一个小实验罢LCD1602的数据线有8个直接用单片机驱动很费IO口,所以用74hc595(3位控制线串入8位并出)芯片的输出端连接到LCD1602的数据线上
之前试了几次都没有弄好 主要是对数据手册理解有误

代码(电路连接方式很简单,包含在其中):
  1. #include"Display.h"
  2. #include<avr/pgmspace.h>

  3. //unsigned char dpins[8]={A0,A1,A2,A3,A4,A5,8,9};

  4. void InitLCD1602();
  5. void WriteLCD1602Cmd(unsigned char cmd);
  6. void AllowInput74HC595();
  7. void  WriteByte74HC595(byte data);
  8. void AllowOutput74HC595();


  9. void InitDisplay()
  10. {
  11.   pinMode(_74HC595_RCK,OUTPUT);
  12.   pinMode(_74HC595_SCK,OUTPUT);
  13.   pinMode(_74HC595_SI,OUTPUT);
  14.   AllowInput74HC595();
  15.   WriteByte74HC595(0x00);
  16.   AllowOutput74HC595();
  17.   InitLCD1602();
  18.   
  19. }

  20. void InitLCD1602()
  21. {
  22.   pinMode(LCD1602_RS,OUTPUT);
  23.   pinMode(LCD1602_RW,OUTPUT);
  24.   pinMode(LCD1602_EN,OUTPUT);
  25.   digitalWrite(LCD1602_EN,HIGH);
  26.   digitalWrite(LCD1602_RW,HIGH);
  27.   digitalWrite(LCD1602_RS,HIGH);
  28.   /*
  29.   for(int i=0;i<8;i++)
  30.   {
  31.     pinMode(dpins[i],OUTPUT);
  32.     digitalWrite(dpins[i],LOW);
  33.   }*/
  34.   LCD1602_ENABLE;
  35.   delayMicroseconds(100);
  36.   WriteLCD1602Cmd(0x3c);//16*2行显示,5*10点阵,8数据接口
  37.   delayMicroseconds(64);
  38.   WriteLCD1602Cmd(0x3c);//16*2行显示,5*10点阵,8数据接口
  39.   delayMicroseconds(50);
  40.   WriteLCD1602Cmd(0x3c);
  41.   delay(20);
  42.   WriteLCD1602Cmd(0x06);//显示模式,屏幕不动,字符后移
  43.   delayMicroseconds(20);
  44.   WriteLCD1602Cmd(0x0c); //屏幕开,光标关
  45.   delayMicroseconds(20);
  46.   WriteLCD1602Cmd(0x01);//清屏
  47.   delayMicroseconds(20);
  48. }

  49. void WriteLCD1602Cmd(unsigned char cmd)
  50. {
  51.   
  52.   LCD1602_RS_LOW; //rs=0:读取/写入指令模式
  53.   LCD1602_RW_WRITE;
  54.   
  55.   delayMicroseconds(1);
  56.   LCD1602_ENABLE;
  57.   delayMicroseconds(1);
  58.   
  59.   AllowInput74HC595();
  60.   WriteByte74HC595(cmd);
  61.   AllowOutput74HC595();
  62.   
  63.   //WriteDpins(cmd);
  64.   delayMicroseconds(1);
  65.   
  66.   LCD1602_DISABLE;
  67.   delayMicroseconds(1);
  68.   LCD1602_ENABLE;
  69.   delayMicroseconds(1);
  70. }


  71. void WriteLCD1602Data(unsigned char data)
  72. {

  73.   LCD1602_RS_HIGH;
  74.   LCD1602_RW_WRITE;
  75.   delayMicroseconds(1);
  76.   LCD1602_ENABLE;
  77.   delayMicroseconds(1);
  78.   
  79.   AllowInput74HC595();
  80.   WriteByte74HC595(data);
  81.   AllowOutput74HC595();
  82.   
  83.   //WriteDpins(data);
  84.   delayMicroseconds(1);
  85.   
  86.   LCD1602_DISABLE;
  87.   delayMicroseconds(1);
  88.   LCD1602_ENABLE;
  89.   delayMicroseconds(1);
  90. }


  91. void ClearLCD1602()
  92. {
  93.    int i;
  94.     WriteLCD1602Cmd(0x80); //写数据指针地址,0位置显示
  95.     for(i=0;i<16;i++)
  96.     {
  97.       WriteLCD1602Data(' ');
  98.       delay(5);
  99.     }
  100.     WriteLCD1602Cmd(0xC0); //第二行显示
  101.     for(i=0;i<16;i++)
  102.     {
  103.       WriteLCD1602Data(' ');
  104.       delay(5);
  105.     }
  106.   

  107. }

  108. void Display(unsigned char row,char str[])
  109. {
  110.   int i;
  111.   if(row==1)
  112.   {
  113.     WriteLCD1602Cmd(0x80); //写数据指针地址,0位置显示
  114.   }
  115.   else
  116.   {
  117.     WriteLCD1602Cmd(0xC0); //第二行显示
  118.   }
  119.   int len=strlen(str);
  120.   for(i=0;i<len;i++)
  121.   {
  122.       WriteLCD1602Data(str[i]);
  123.       delay(5);
  124.   }
  125. }


  126. void AllowInput74HC595()
  127. {
  128.   digitalWrite(_74HC595_RCK,LOW);//allow input 74HC595
  129. }

  130. void AllowOutput74HC595()
  131. {
  132.   digitalWrite(_74HC595_RCK,HIGH);//allow output 74HC595
  133. }


  134. void  WriteByte74HC595(unsigned char data)
  135. {
  136.   boolean pinState;
  137.   unsigned char i;
  138.   
  139.   digitalWrite(_74HC595_SI,LOW);
  140.   digitalWrite(_74HC595_SCK,LOW);
  141.   for(i=0;i<=7;i++)
  142.   {
  143.      digitalWrite(_74HC595_SCK,LOW);//before output 1bit must set SCK low
  144.      if(data &(0x01<<i))
  145.      {
  146.        pinState=HIGH;
  147.      }
  148.      else
  149.      {
  150.        pinState=LOW;
  151.      }
  152.      digitalWrite(_74HC595_SI,pinState);//write 1bit
  153.      digitalWrite(_74HC595_SCK,HIGH);//74HC595 receive when rising edge occur
  154.   }
  155.   digitalWrite(_74HC595_SCK,LOW); //stop 74HC595 input
  156. }

  157. /*
  158. void WriteDpins(unsigned char d)
  159. {
  160.   
  161.   int i;
  162.   for(i=0;i<8;i++)
  163.   {
  164.     if(d &(0x01<<i))
  165.     {
  166.       digitalWrite(dpins[i],HIGH);
  167.     }
  168.     else
  169.     {
  170.       digitalWrite(dpins[i],LOW);
  171.     }
  172.   }
  173. }*/
复制代码





BTComm.zip

2.06 KB, 下载次数: 36, 下载积分: 黑币 -5

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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