能在点阵屏上显示任意汉字,并进行滚动循环显示。
利用单片机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的特点,理清了下编程思路,最后顺利完成。完成这次设计后,我在书本理论知识的基础上又有了更深层次的理解,对单片机的认识也是更加深刻。
单片机源程序如下:
- /**************************************************************************************
- 项目名称:点阵滚动设计
- ***************************************************************************************/
- #include "reg51.h" //此文件中定义了单片机的一些特殊功能寄存器
- #include "intrins.h"
- typedef unsigned int u16; //对数据类型进行声明定义
- typedef unsigned char u8;
- //--定义使用的IO口--//
- sbit SRCLK=P3^6;
- sbit RCLK=P3^5;
- sbit SER=P3^4;
- //定义LED点阵的位选,也就是类似于数码管的位选,因为要对其动态扫描操作
- //数组前16位和后16位数据正好是相反的,也就是说先让第3个595输出低电平,然后再让第4个595输出低电平
- u8 code ledwei[]=
- {
- 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80,
- };
- u8 code ledduan1[]=
- {
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- /*-- 文字: 湖 --*/
- /*-- 新宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
- 0x01,0x00,0x21,0x1E,0x11,0x12,0x17,0xD2,0x81,0x12,0x41,0x1E,0x41,0x12,0x17,0xD2,
- 0x14,0x52,0x24,0x5E,0xE4,0x52,0x27,0xD2,0x24,0x52,0x20,0x22,0x20,0x2A,0x00,0x44,
- ,.......详见附件.................
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
- };
- /*******************************************************************************
- * 函 数 名 : delay
- * 函数功能 : 延时函数,i=1时,大约延时10us
- *******************************************************************************/
- void delay(u16 i)
- {
- while(i--);
- }
- /*******************************************************************************
- * 函 数 名 : Hc595SendByte(u8 dat1,u8 dat2,u8 dat3,u8 dat4)
- * 函数功能 : 通过595发送四个字节的数据
- * 输 入 : dat1:第4个595输出数值
- * * dat2: 第3个595输出数值
- * * dat3:第2个595输出数值
- * * dat4:第1个595输出数值
- * 输 出 : 无
- *******************************************************************************/
- void Hc595SendByte(u8 dat1,u8 dat2,u8 dat3,u8 dat4)
- {
- u8 a;
- SRCLK = 1;
- RCLK = 1;
- for(a=0;a<8;a++) //发送8位数
- {
- SER = dat1 >> 7; //从最高位开始发送
- dat1 <<= 1;
- SRCLK = 0; //发送时序
- _nop_();
- _nop_();
- SRCLK = 1;
- }
- for(a=0;a<8;a++) //发送8位数
- {
- SER = dat2 >> 7; //从最高位开始发送
- dat2 <<= 1;
- SRCLK = 0; //发送时序
- _nop_();
- _nop_();
- SRCLK = 1;
- }
- for(a=0;a<8;a++) //发送8位数
- {
- SER = dat3 >> 7; //从最高位开始发送
- dat3 <<= 1;
- SRCLK = 0; //发送时序
- _nop_();
- _nop_();
- SRCLK = 1;
- }
- for(a=0;a<8;a++) //发送8位数
- {
- SER = dat4 >> 7; //从最高位开始发送
- dat4 <<= 1;
- SRCLK = 0; //发送时序
- _nop_();
- _nop_();
- SRCLK = 1;
- }
- RCLK = 0;
- _nop_();
- _nop_();
- RCLK = 1;
- }
- /*******************************************************************************
- * 函 数 名 : main
- * 函数功能 : 主函数
- * 输 入 : 无
- * 输 出 : 无
- *******************************************************************************/
- void main()
- {
- u16 i,a;
-
- while(1)
- {
- for(a=0;a<=768;a=a+2) //大循环用于汉字的滚动
- {
- for(i=0;i<16;i++) //小循环用于每一个汉字图片的显示
- {
- Hc595SendByte(ledduan1[2*i+a+1],ledduan1[2*i+a],~ledwei[i+16],~ledwei[i]);
- delay(500);
- }
- a+=2; //防止两个不同字模的数组之间过渡的地方导致数组读取混乱
- }
- }
- }
复制代码
所有资料51hei提供下载(Proteus仿真+源代码):
缺少matrix.dll 求大神分享
2018111115张启雄 点阵LED显示屏.zip
(3.81 MB, 下载次数: 128)
|