找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5573|回复: 2
收起左侧

单片机利用4个74HC595芯片驱动点阵屏滚动显示汉字 Proteus仿真程序 缺少matrix.dll

[复制链接]
ID:681355 发表于 2020-11-27 18:46 | 显示全部楼层 |阅读模式
能在点阵屏上显示任意汉字,并进行滚动循环显示。
利用单片机AT89C51编写程序驱动四块级联在一起的74HC595,再利用这四块595芯片驱动点阵屏进行显示。汉字显示,是用相应的文字取模软件进行文字取模,将取到的模存入数组中,配合相应的程序算法,实现文字的在点阵屏上的滚动显示。

三、理论设计
3.1 原理分析
将事先取好的字模装入数组之中,通过软件编程驱动四个74HC595芯片,两个用于字模数组的输出,两个用于点阵的扫描,相互配合进行汉字的显示。在C语言中设计两个循环进行嵌套,里面的小循环用于单个汉字的显示,外面的大循环用于汉字的滚动。

3.2 控制系统
AT89C51是一种带4K字节FLASH存储器的低电压、高性能CMOS 8位微处理器,俗称单片机。AT89C51 提供以下标准功能:4k 字节Flash 闪速存储器,256字节片内数据存储器(00H -7FH为片内RAM,80H-FFH为特殊功能寄存器SFR),32 个I/O 口线,两个16位定时/计数器,一个5向量两级中断结构,一个全双工串行通信口,片内振荡器及时钟电路。同时,AT89C51可降至0Hz的静态逻辑操作,并支持两种软件可选的节电工作模式。空闲方式停止CPU的工作,但允许RAM,定时/计数器,串行通信口及中断系统继续工作。掉电方式保存RAM中的内容,但振荡器停止工作并禁止其它所有部件工作直到下一个硬件复位。

3.3 74HC595芯片工作原理
74HC595是一个8位串行输入、并行输出的位移缓存器:并行输出为三态输出。在SCK 的上升沿,串行数据由SDL输入到内部的8位位移缓存器,并由Q7'输出,而并行输出则是在LCK的上升沿将在8位位移缓存器的数据存入到8位并行输出缓存器。当串行数据输入端OE的控制信号为低使能时,并行输出端的输出值等于并行输出缓存器所存储的值。

74HC595驱动点阵屏电路
利用四个595芯片进行级联U2—>U3—>U4—>U5,左边两个595用于点阵的行扫描,下边的两个595用于字模数组的输出。进行相应的逻辑组合实现汉字的滚动显示。
图3-4 74HC595驱动点阵屏电路

3.5系统总体结构图


四、电路仿真及仿真结果分析
4.1电路图
依次向上滚动所要显示的汉字

4.2仿真结果
显示汉字“张”
显示汉字“启”
显示汉字“雄”
  • 实物图


心得体会
通过本次设计,使我对74HC595这款芯片,以及相应的软件驱动代码的书写的理解更加清晰,对单片机的认识也是更进了一步。

   在本次设计工程中,遇到了很多得问题,主要是595软件驱动设计和芯片之间的逻辑配合,让四个595相互配合驱动显示目标汉字那一块。由于对595芯片的数据写入顺序,输出顺序,以及点阵结构认识不清导致走了一些弯路。最后重新梳理了595的特点,理清了下编程思路,最后顺利完成。完成这次设计后,我在书本理论知识的基础上又有了更深层次的理解,对单片机的认识也是更加深刻。


单片机源程序如下:


  1. /**************************************************************************************
  2. 项目名称:点阵滚动设计
  3. ***************************************************************************************/

  4. #include "reg51.h"                         //此文件中定义了单片机的一些特殊功能寄存器
  5. #include "intrins.h"

  6. typedef unsigned int u16;          //对数据类型进行声明定义
  7. typedef unsigned char u8;

  8. //--定义使用的IO口--//
  9. sbit SRCLK=P3^6;
  10. sbit RCLK=P3^5;
  11. sbit SER=P3^4;

  12. //定义LED点阵的位选,也就是类似于数码管的位选,因为要对其动态扫描操作
  13. //数组前16位和后16位数据正好是相反的,也就是说先让第3个595输出低电平,然后再让第4个595输出低电平

  14. u8 code ledwei[]=
  15. {
  16. 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  17. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80,
  18. };

  19. u8 code ledduan1[]=
  20. {
  21. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  22. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  23. /*--  文字:  湖  --*/
  24. /*--  新宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
  25. 0x01,0x00,0x21,0x1E,0x11,0x12,0x17,0xD2,0x81,0x12,0x41,0x1E,0x41,0x12,0x17,0xD2,
  26. 0x14,0x52,0x24,0x5E,0xE4,0x52,0x27,0xD2,0x24,0x52,0x20,0x22,0x20,0x2A,0x00,0x44,
  27. ,.......详见附件.................
  28. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,


  29.         
  30. };

  31. /*******************************************************************************
  32. * 函 数 名         : delay
  33. * 函数功能                   : 延时函数,i=1时,大约延时10us
  34. *******************************************************************************/
  35. void delay(u16 i)
  36. {
  37.         while(i--);        
  38. }

  39. /*******************************************************************************
  40. * 函 数 名         : Hc595SendByte(u8 dat1,u8 dat2,u8 dat3,u8 dat4)
  41. * 函数功能                   : 通过595发送四个字节的数据
  42. * 输    入         : dat1:第4个595输出数值
  43. *                  * dat2: 第3个595输出数值
  44. *                  * dat3:第2个595输出数值
  45. *                  * dat4:第1个595输出数值
  46. * 输    出         : 无
  47. *******************************************************************************/
  48. void Hc595SendByte(u8 dat1,u8 dat2,u8 dat3,u8 dat4)
  49. {
  50.         u8 a;

  51.         SRCLK = 1;
  52.         RCLK = 1;

  53.         for(a=0;a<8;a++)                 //发送8位数
  54.         {
  55.                 SER = dat1 >> 7;                 //从最高位开始发送
  56.                 dat1 <<= 1;

  57.                 SRCLK = 0;                         //发送时序
  58.                 _nop_();
  59.                 _nop_();
  60.                 SRCLK = 1;        
  61.         }

  62.         for(a=0;a<8;a++)                 //发送8位数
  63.         {
  64.                 SER = dat2 >> 7;                 //从最高位开始发送
  65.                 dat2 <<= 1;

  66.                 SRCLK = 0;                         //发送时序
  67.                 _nop_();
  68.                 _nop_();
  69.                 SRCLK = 1;        
  70.         }

  71.         for(a=0;a<8;a++)                 //发送8位数
  72.         {
  73.                 SER = dat3 >> 7;                 //从最高位开始发送
  74.                 dat3 <<= 1;

  75.                 SRCLK = 0;                         //发送时序
  76.                 _nop_();
  77.                 _nop_();
  78.                 SRCLK = 1;        
  79.         }

  80.         for(a=0;a<8;a++)                 //发送8位数
  81.         {
  82.                 SER = dat4 >> 7;                 //从最高位开始发送
  83.                 dat4 <<= 1;

  84.                 SRCLK = 0;                         //发送时序
  85.                 _nop_();
  86.                 _nop_();
  87.                 SRCLK = 1;        
  88.         }

  89.         RCLK = 0;
  90.         _nop_();
  91.         _nop_();
  92.         RCLK = 1;
  93. }



  94. /*******************************************************************************
  95. * 函 数 名       : main
  96. * 函数功能                 : 主函数
  97. * 输    入       : 无
  98. * 输    出             : 无
  99. *******************************************************************************/
  100. void main()
  101. {        
  102.         u16 i,a;
  103.         
  104.         while(1)
  105.         {         
  106.                 for(a=0;a<=768;a=a+2)     //大循环用于汉字的滚动
  107.                 {
  108.                         for(i=0;i<16;i++)       //小循环用于每一个汉字图片的显示
  109.                         {
  110.                                 Hc595SendByte(ledduan1[2*i+a+1],ledduan1[2*i+a],~ledwei[i+16],~ledwei[i]);
  111.                                 delay(500);        
  112.                         }        
  113.                         a+=2;   //防止两个不同字模的数组之间过渡的地方导致数组读取混乱
  114.                 }               
  115.         }               
  116. }
复制代码

所有资料51hei提供下载(Proteus仿真+源代码):
缺少matrix.dll  求大神分享

2018111115张启雄 点阵LED显示屏.zip (3.81 MB, 下载次数: 125)

评分

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

查看全部评分

回复

使用道具 举报

ID:630338 发表于 2021-5-25 19:43 | 显示全部楼层
显示不对哦,用了普中开发板。
回复

使用道具 举报

ID:58718 发表于 2022-4-7 10:30 | 显示全部楼层
为什么是右移,先送高位不应该是左移动吗
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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