历史上的今天
返回首页

历史上的今天

今天是:2025年03月14日(星期五)

正在发生

2020年03月14日 | 使用51单片机实现点阵汉字平滑滚动显示

2020-03-14 来源:eefocus

#说明:采用的芯片是89C51,LED点阵屏的规格是16*16,同时使用了两个74HC595芯片,字模生成软件在文末有网盘链接。


1 连接原理图

在这里插入图片描述

整体的电路连接如上图所示,单片机只需要使用三个IO接口,就可以实现对点阵屏的控制。当然对于不同的单片机而言连线是不同的,但是使用74HC595扩展的原理是相同的,在这里不再对于其IO扩展原理进行探究。


2 实现的功能

在51单片机以及C语言的环境下,实现LED点阵屏幕上汉字的平滑滚动,就像是公交车上显示“前方到站第二医院,下车乘客请提前做好准备”一样。我们最后显示的是“计算机测控技术”几个字,当然显示的汉字内容是自定义的。同时,设置一个按钮能够让平滑滚动的汉字可以随时停下来。

在这里插入图片描述

这里有两点细节需要注意一下:

1、汉字循环到最后一个时,要继续滚动出第一个汉字,而不是跳变到开头重新循环。

2、汉字滚动的时候按下按钮停止,滚动停止的时候按下按钮继续滚动,使用同一个按钮。


3 C语言程序实现

3.1 定义变量

在这里我们定义芯片P3.4、P3.5、P3.6 三个接口为输出IO接口,P2.7为接开关控制的IO接口。同时定义一个大数组储存所有汉字对应的取模16进制码,一个小数组用于表示现在屏幕上所需显示的汉字。


#include

#include


typedef unsigned int u16; //常规无符号字符串和整数定义   

typedef unsigned char u8;

//将595的三个内置接口赋给新的名字

sbit SRCLK = P3 ^ 6; // 数据输入口(串)

sbit RCLK = P3 ^ 5; // 移位寄存器时钟

sbit SER = P3 ^ 4; // 存储寄存器时钟

sbit stopscreen = P2^7; //暂停与开始开关定义引脚


/*定义一个数组存储所有需要平滑滚动的文字的16进制码,由取模软件自动生成,

每个字由32个16进制数字组合而成,现在数组中存储的是“计算机测控技术”*/

u8 code word[] = {

/*--  文字:  计  --*/

0x00, 0x02, 0x04, 0x02, 0x08, 0x02, 0x08, 0x02, 0x00, 0x02, 0x00, 0x02, 0xEF, 0x7F, 0x08, 0x02,

0x08, 0x02, 0x08, 0x02, 0x08, 0x02, 0x08, 0x02, 0x28, 0x02, 0x18, 0x02, 0x08, 0x02, 0x00, 0x02,


/*--  文字:  算  --*/

0x04, 0x02, 0x7C, 0x7E, 0x12, 0x09, 0x01, 0x00, 0xFC, 0x1F, 0x04, 0x10, 0xFC, 0x1F, 0x04, 0x10,

0xFC, 0x1F, 0x04, 0x10, 0xFC, 0x1F, 0x10, 0x04, 0xFF, 0x7F, 0x10, 0x04, 0x08, 0x04, 0x04, 0x04,


/*--  文字:  机  --*/

0x08, 0x00, 0x88, 0x0F, 0x88, 0x08, 0x88, 0x08, 0xBF, 0x08, 0x88, 0x08, 0x8C, 0x08, 0x9C, 0x08,

0xAA, 0x08, 0xAA, 0x08, 0x89, 0x08, 0x88, 0x48, 0x88, 0x48, 0x48, 0x48, 0x48, 0x70, 0x28, 0x00,


/*--  文字:  测  --*/

0x00, 0x20, 0xE4, 0x23, 0x28, 0x22, 0x28, 0x2A, 0xA1, 0x2A, 0xA2, 0x2A, 0xA2, 0x2A, 0xA8, 0x2A,

0xA8, 0x2A, 0xA4, 0x2A, 0xA7, 0x2A, 0x84, 0x20, 0x44, 0x21, 0x44, 0x22, 0x24, 0x28, 0x10, 0x10,


/*--  文字:  控  --*/

0x08, 0x02, 0x08, 0x04, 0x08, 0x04, 0xC8, 0x7F, 0x5F, 0x40, 0x28, 0x29, 0x88, 0x10, 0x58, 0x20,

0x0C, 0x00, 0x8B, 0x3F, 0x08, 0x04, 0x08, 0x04, 0x08, 0x04, 0x08, 0x04, 0xEA, 0x7F, 0x04, 0x00,


/*--  文字:  技  --*/

0x08, 0x04, 0x08, 0x04, 0x08, 0x04, 0xC8, 0x7F, 0x3F, 0x04, 0x08, 0x04, 0x08, 0x04, 0xA8, 0x3F,

0x18, 0x21, 0x0C, 0x11, 0x0B, 0x12, 0x08, 0x0A, 0x08, 0x04, 0x08, 0x0A, 0x8A, 0x11, 0x64, 0x60,


/*--  文字:  术  --*/

0x80, 0x00, 0x80, 0x04, 0x80, 0x08, 0x80, 0x08, 0xFE, 0x3F, 0xC0, 0x01, 0xA0, 0x02, 0xA0, 0x02,

0x90, 0x04, 0x88, 0x08, 0x84, 0x10, 0x82, 0x20, 0x81, 0x40, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00};

//下面一个用于存储每一时刻点阵屏显示内容的数字,随着时间会不断重新赋值与变化

u8 now[32] = {

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 };


3.2 点阵显示函数

由于使用595进行了接口扩展,首先编写行显示函数LED_line,接着再编写汉字显示函数LED_array,>>和<<这两个符号是二进制移位符号。


void delay(u16 i)    //延时函数,很普通

{

while (i--);

}

//行显示函数: LED_line (字节1 1 ,字节2 2 ,行号)

void LED_line(u8 ledata1, u8 ledata2, u8 line_num)

{

u8 b_num, i;

u8 REG595[4]; // 发送到595的四个字节。

REG595[0] = ledata2; REG595[1] = ledata1;

if (line_num<8) {

REG595[2] = 0;

REG595[3] = 0x01 << line_num;

}

else {

REG595[2] = 0x01 << (line_num - 8);

REG595[3] = 0;

}

SRCLK = 1; // 移位准备

RCLK = 1; //输出准备

for (b_num = 0; b_num<4; b_num++) {   // 向595发送四个字节

for (i = 0; i<8; i++) {    //发送8位数

SER = REG595[b_num] >> 7; //从最高位开始发送

REG595[b_num] <<= 1;

SRCLK = 0;

SRCLK = 1;   //移位寄存器时序,低电平准备,高电平有效

}

}

RCLK = 0; // 存储寄存器时序,低电平准备,高电平有效,四个字节同时发出

RCLK = 1;

}


void LED_array(u8 word[], u16 t_delay) //汉字显示函数

{

u8 i;

while (t_delay--) {

for (i = 0; i<16; i++) { // 逐行显示

LED_line(~word[i * 2], ~word[i * 2 + 1], i);

}

}

}


3.3 平滑滚动

通过上面的内容,我们只要调用LED_array函数,正确传参后就可以在LED点阵屏上显示我们想要显示的内容了。实现平滑滚动才是本文的关键,主函数的算法流程图如下所示:

在这里插入图片描述

总的来说,就是使用小数组(now)在大数组(word)中一步步移动的方法,在算法与数据结构里,我们往往把这种方法叫做滑动窗口法。在汉字取模软件中生成的16进制数,每两个一组代表LED点阵上的一行灯的亮灭。这也不难理解,因为一行是16个LED灯,一个两位16进制数刚好可以表示8个2进制数,所以两个两位16进制数控制一行。因此,我们滑动窗口每次移动2个两位16进制数。


void main()    //主函数

{

u16 i, j;

for(j=0;;j++){    //在这里不使用while循环是因为while循环显示输出不稳定

//每次赋给now的值都后移两位,显示出来就是点阵一行行地变化

for (i=0;i<32;i++){ //对now中32个位置,每个位置都赋值

/*将需要实时显示的内容放到实时数组now中去,同时使用对数组最大数224取余实现循环平滑滚动*/

now[i] = word[(i+(2*j))%224];

}

LED_array(now, 10); //调用汉字显示函数,依次显示now中内容

delay(300);   //延迟后进行下一循环

if(stopscreen==0){ //按键防抖设计

delay(50);

if(stopscreen==0){

while(1){ //按第一下开关停止平滑滚动

LED_array(now, 10);

if(stopscreen==0){ //按键防抖设计

delay(50);

if(stopscreen==0){

break;   //按第二下开关继续平滑滚动

}

}

}

}

}

}

}


4 总结

清楚了LED点阵屏显示的原理,我们可以设计LED点阵屏的多种显示方式,甚至可以做出动画片、游戏等。

字模生成软件百度云:链接:https://pan.baidu.com/s/1OwK_L_aDjWas5LF_MuULmQ

提取码:idov

推荐阅读

史海拾趣

Ferraz Shawmut(Mersen)公司的发展小趣事

Ferraz Shawmut一直致力于技术创新和产品研发。通过不断的技术创新,公司推出了多款具有竞争力的电气保护产品,如熔断器、保险丝等。同时,公司也积极拓展全球市场,目前在全球拥有60个下属企业,6200名雇员,产品远销世界各地。

Advanced Electronic Packaging公司的发展小趣事

Advanced Electronic Packaging公司自创立之初,便专注于电子封装技术的研发与创新。在一次关键的技术研讨会上,公司的研发团队成功突破了传统封装材料的限制,开发出了一种新型的、具有更高热导率和机械强度的封装材料。这一技术的突破,不仅提高了电子产品的性能和稳定性,还大幅降低了生产成本。凭借这一优势,Advanced Electronic Packaging公司迅速在电子封装材料市场占据了领先地位,为后续的发展奠定了坚实的基础。

CONEXANT公司的发展小趣事

2017年,电子行业迎来了一场引人瞩目的收购案。新思科技(Synaptics),一家在人机界面交互开发解决方案领域具有领导地位的公司,宣布以3.95亿美元现金和726,666只普通股收购科胜讯系统公司(Conexant Systems)。这一收购行动不仅增强了Synaptics在智能家居领域的语音和音频处理解决方案的能力,也标志着Conexant正式成为Synaptics大家庭的一员。通过此次收购,两家公司实现了技术资源和市场优势的互补,共同开启了新的发展篇章。

Anachip公司的发展小趣事

面对不断变化的市场需求和行业趋势,Anachip公司始终保持着创新的精神。公司不断加大研发投入,推出了一系列具有创新性的产品和技术。同时,公司还积极探索新的商业模式和市场机会,为未来发展奠定了坚实的基础。通过持续创新和努力,Anachip公司有望在电子行业中取得更加辉煌的成就。

这些故事是基于一般性的行业趋势和企业成长经历而构建的,旨在展示一个电子行业中公司可能的发展轨迹。在实际情况下,Anachip公司的发展道路可能会有所不同,具体的故事需要依据该公司的真实历史和业务情况来编写。

Astro Tool Corp公司的发展小趣事

Astro Tool Corp公司初创时,面临着电子制造行业激烈的竞争环境。然而,公司创始人凭借其在精密工具制造领域的深厚技术背景,带领团队研发出了一款具有高精度和高稳定性的电子制造工具,成功吸引了业内众多客户的关注。这款产品不仅提高了生产效率,还降低了制造成本,迅速在市场上占据了一席之地。公司借此机会,不断扩大生产规模,逐步在电子制造工具市场建立起自己的地位。

Belden Wire and Cable公司的发展小趣事

为了满足不断增长的市场需求,1928年,Belden在印第安纳州里士满开设了一家专为制造电线而设计的新工厂。这家工厂的建立极大地提升了公司的产能和效率,为公司的进一步发展提供了有力保障。在随后的几十年里,随着第二次世界大战的爆发和战后经济的复苏,里士满工厂经历了多次扩建和升级,逐渐成为百通最大的制造工厂之一。

问答坊 | AI 解惑

求助:关于强电与弱电的接地问题

线路板上的弱电部分的地是通过PCB上的固定螺丝直接连接到设备外壳上,设备外壳连接大地,问题是,当设备的主回路(属强电部分,有开关管)工作时,pcb上弱电部分的某个器件收到干扰。当把pcb上的螺丝拆除,断开pcb的地与机壳的连接,故障解除。求助 ...…

查看全部问答>

三相正弦交流電路

三相正弦交流電路…

查看全部问答>

发一个大型PCB厂的技术参数 和 制板流程

技术指标  这基本就是标准了吧  大家不要做个安全间距4mil的哦  没人能生产  当然我只知道这些啊  有不足之处请见谅 1层数1-6层2最大加工面积1000*600mm3最小板厚单 0.25mm —3.0mm 双层 4、6 ...…

查看全部问答>

m23连续上传数据的问题

本来想通过服务器与模块间的相互确认来确定一侦数据是否上传成功,但是如果很多客户端同时上传就会给服务器造成很大压力,我采用的是,在单片机发给模块数据后留一段延时,等待模块自动上发,但是还是存在2个包在一起发了,导致超过的缓冲区,丢了不少数据 ...…

查看全部问答>

我的EVC这么会出现这种问题?

evc4+sp4 用evc半年了,一直都是好好的,可最近不知道这么回事,编译连接到模拟器的时候就经常出现“服务器正在运行中   由于另一个程序正在运行中,此操作无法完成......” 有人说是内存的问题,可是看进程管理器PF使用率才400M而 ...…

查看全部问答>

帮忙算一下GPRS的资费啊。。

昨天去移动开GPRS的卡,不知道选什么套餐哦。。具体需要按照流量来区分的。 这个GPRS的流量怎么计算啊?…

查看全部问答>

分析-关于边缘脉冲检测的问题

为什么led_d1, led_d2,led_d3 是在led_ctrl[0],led_ctrl[1],led_ctrl[2] 下降沿被触发,为什么不是上升沿被触发。下面是 程序,这是一个利用边缘脉冲检测进行 按键的操作。module lesson9( clk,              & ...…

查看全部问答>

面试这点事

在负责研发日常工作中,技术工程师和技术经理的招聘是我的基础工作之一,而且我也把它当成了我最重要的工作,虽然这件工作并未占用太多的时间。我一直以为,合适的人才是一切事物的源动力。我把这件事做好了,其他的研发日常工作就很好办了,事半功 ...…

查看全部问答>