找回密码
 立即注册

QQ登录

只需一步,快速开始

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

74HC595+单片机3个IO口驱动LCD1602 利用位寻址变量 Proteus仿真程序

[复制链接]
跳转到指定楼层
楼主
ID:137736 发表于 2022-11-27 16:33 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
完全使用3个IO口驱动LCD1602
8051三线传送数据到74HC595,驱动LCD1602.利用位变量可位操作,程序更加简单。根据网上别人的程序改编而来。

仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)


/*hc595->1602管脚连接bin(D7,D6,D5,D4,0,E,RW,RS)*/
#include <reg52.h>
//8051->hc595引脚定义
sbit LCD1602_SHCP=P3^6;        //in clock
sbit LCD1602_DS=P3^4;         //in data
sbit LCD1602_STCP=P3^5;          //out clock

//两种数据类型
typedef unsigned char uchar;
typedef unsigned int uint;

//定义数据槽
//uchar RS,RW,E,D4,D5,D6,D7;
bdata uchar sendData;
sbit RS = sendData^0;
sbit RW = sendData^1;
sbit E = sendData^2;

单片机源程序如下:
  1. #include <reg52.h>
  2. #include "lcd595.h"

  3. const uchar type_t[]={
  4.   0x1f,0x02,0x02,0x02,
  5.         0x02,0x02,0x02,0x00
  6. };

  7. const uchar line1[]="Have a nice day!";
  8. const uchar line2[]="HE Wcommands";

  9. void main()
  10. {
  11.         uchar i;
  12.         LcdInit();
  13.         LcdWriteCGRAM(0x00,type_t);
  14.         LcdWriteData(0x00);
  15.         LcdWriteCom(0x81);
  16.         LcdPrintf("HE With");
  17.         LcdWriteCom(0xc0);
  18.         LcdPrintf("Commands");
  19.         Lcd1602_Delay1ms(1000);
  20.         LcdWriteCom(0x01);
  21.         while(1){
  22.                 for(i=0;i<16;i++){
  23.                         LcdWriteCom(0x80+i);
  24.                         LcdWriteData(line1[i]);
  25.                         Lcd1602_Delay1ms(100);
  26.                 }
  27.                 Lcd1602_Delay1ms(500);
  28.                 LcdWriteCom(0xc1);
  29.                 LcdWriteData(0x00);
  30.                 Lcd1602_Delay1ms(100);
  31.                 for(i=0;i<12;i++){
  32.                         LcdWriteCom(0xc2+i);
  33.                         LcdWriteData(line2[i]);
  34.                         Lcd1602_Delay1ms(100);
  35.                 }
  36.                 LcdWriteCom(0x01);
  37.                 Lcd1602_Delay1ms(100);
  38.         }
  39. }
复制代码
  1. /*hc595->1602管脚连接bin(D7,D6,D5,D4,0,E,RW,RS)*/
  2. #include <reg52.h>
  3. //8051->hc595引脚定义
  4. sbit LCD1602_SHCP=P3^6;        //in clock
  5. sbit LCD1602_DS=P3^4;         //in data
  6. sbit LCD1602_STCP=P3^5;          //out clock

  7. //两种数据类型
  8. typedef unsigned char uchar;
  9. typedef unsigned int uint;

  10. //定义数据槽
  11. //uchar RS,RW,E,D4,D5,D6,D7;
  12. bdata uchar sendData;
  13. sbit RS = sendData^0;
  14. sbit RW = sendData^1;
  15. sbit E = sendData^2;
  16. sbit D4 = sendData^3;
  17. sbit D5 = sendData^4;
  18. sbit D6 = sendData^5;
  19. sbit D7 = sendData^6;

  20. void Lcd1602_Delay1ms(uint c); //延时函数,延时1ms
  21. void LCD1602_DATAPINS(uchar value); //更改74HC595连接LCD1602的数据
  22. void LcdCalc(uchar i); //确定4位总线
  23. void LcdWriteCom(uchar com); //向LCD写入一个字节的命令
  24. void LcdWriteData(uchar dat); //向LCD写入一个字节的数据
  25. void LcdInit(); //初始化LCD屏
  26. void LcdPrintf(uchar *s); //向屏幕输出字符
  27. void LcdWriteCGRAM(uchar index,uchar *p); //建立一个自定义字符
  28. void LCDPrintNum(uint num,uchar wei); //显示数字

  29. /*******************************************************************************
  30. * 函 数 名         : Lcd1602_Delay1ms
  31. * 函数功能                   : 延时函数,延时1ms
  32. * 输    入         : c
  33. * 输    出         : 无
  34. * 说    名         : 该函数是在12MHZ晶振下,12分频单片机的延时。
  35. *******************************************************************************/
  36. void Lcd1602_Delay1ms(uint c)   //误差 0us
  37. {
  38.         uchar a,b;
  39.         for(;c>0;c--){
  40.                 for(b=199;b>0;b--){
  41.                         for(a=1;a>0;a--);
  42.                 }
  43.         }
  44. }
  45. /*******************************************************************************
  46. * 函 数 名         : LCD1602_DATAPINS
  47. * 函数功能                   : 更改74HC595连接LCD1602的数据
  48. * 输    入         : value
  49. * 输    出         : 无
  50. 74HC595传送数据的常用写法
  51. *******************************************************************************/   
  52. void LCD1602_DATAPINS(uchar value)
  53. {
  54.     uchar i;
  55.     for(i=0;i<8;i++)
  56.     {
  57.         LCD1602_DS=value&0x80;//取数据高位
  58.         if(LCD1602_DS==0x80){ //判断数据高位是否为1
  59.             LCD1602_DS=1;//如果高位为1,DS置1
  60.         }
  61.         else{
  62.             LCD1602_DS=0;//否则DS置0
  63.         }
  64.         LCD1602_SHCP=0;
  65.         LCD1602_SHCP=1;//上升沿使这一位写入移位寄存器
  66.         value<<=1;//数据左移1位,数据的第7位变为最高位,循环第8次时数据的最低位也变成最高位
  67.     }
  68.     LCD1602_STCP=0;
  69.     LCD1602_STCP=1;//给STCP一个上升沿,将for循环中输入的数据移入输出锁存寄存器,刷新输出数据
  70. }

  71. void LcdWriteCom(uchar com)          //写入命令
  72. {
  73.         //LcdCalc(com>>4);        //发送高四位
  74. ……………………

  75. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

Keil代码与Proteus仿真下载: 利用可位寻址变量-hc595-1602.zip (102.37 KB, 下载次数: 26)

评分

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

查看全部评分

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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