使用51单片机实现点阵汉字平滑滚动显示

2023-11-06

使用51单片机实现点阵汉字平滑滚动显示

#说明:采用的芯片是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 <reg51.h>
#include <intrins.h>

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用51单片机实现点阵汉字平滑滚动显示 的相关文章

  • Jenkins安装部署与自动化部署网站实战

    1 CICD与Jenkins概述 互联网软件的开发和发布 已经形成了一套标准流程 假如把开发工作流程分为以下几个阶段 编码 构建 集成 测试 交付 部署 在上图中看到 持续集成 Continuous Integration 持续交付 Con
  • 数据结构-1

    1 2 线性结构树状结构网状结构 表 数 图 数据 数值型 非数值型 1 2 3数据类型和抽象数据类型 1 3抽象数据类型 概念小结 线性表 如果在独立函数实现的 c 文件中需要包含 stdlib h 头文件 而主函数也需要包含 stdli
  • 服务器部署Java项目详述

    前言 记录一下自己从0到1部署Java前后端项目到服务器上的过程 过程梗概 首先要先买一个服务器 一般用CentOS7 然后大概步骤是再配置一下所买的服务器环境 再安装下对应我们的Java项目所需要的一些应用程序即可 其中 Nginx是用来
  • 如何部署LVS + keepalived 负载均衡高可用集群

    目录 一 LVS架构 概念 L4和L7负载均衡的区别 keepalive故障自动切换 抢占与非抢占 二 keepalived管理LVS负载均衡器 LVS集中节点的健康检查 三 部署LVS keeplived 高可用集群 第一步 关闭防火墙和

随机推荐

  • Scala中 常用容器类的函数/方法

    1 foreach 迭代遍历集合中的每个元素 对每个元素进行处理 但是没有返回值 常用于打印结果数据 val ls List 1 3 5 7 9 ls foreach println 打印每个元素 ls foreach println 打印
  • kzalloc 函数详解

    用kzalloc申请内存的时候 效果等同于先是用 kmalloc 申请空间 然后用 memset 来初始化 所有申请的元素都被初始化为 0 kzalloc allocate memory The memory is set to zero
  • wpf

    Windows Presentation Foundation WPF 是微软新一代图形系统 运行在 NET Framework 3 0架构下 为用户界面 2D 3D 图形 文档和媒体提供了统一的描述和操作方法 基于DirectX 9 10
  • DP和HDMI区别

    转自 https www toutiao com i6877677362054595080 在目前市面上显示器接口中 VGA和DVI已经逐渐退出了历史舞台 Type C还算是小众 而DP DisplayPort 与HDMI则成为了主流产品的
  • 普通人在chatGPT的3个赚钱机会

    短短的2个多月内 到处都在讨论ChatGPT 不管你有没有参与其中 以GPT为代表的AI工具已经进化到一个很恐怖的程度了 比如说最近爆火的AutoGPT 能按照一个指令自动干活了 好想试一下 让AutoGPT自动帮我分析福利彩票 ChatG
  • 实现el-form一行中多个el-form-item

    el form item默认一个占一行 利用el row和el col实现一行中多个 注意 el col span 12 中的12是一个占据的列数 默认一列总共24列 通过调整这个数字 可以调整不同列的宽度 如果只使用el col 不在外面
  • c++23中的新功能之一介绍

    一 c 23的目标和延革 c 的标准发展速度在经过c 11的近乎可以称革新的变化之后 开始步入了快车道 有的人在网上说 c 11后的c 语言和c 11以前的c 语言不是一个语言 这有点夸张了 但不可否认 其内容确实变化非常大 很多人可能都没
  • 异步处理机制 多线程

    在处理程序执行流程时 一定要切记 android的处理机制是异步处理 多线程的它并不会因为一个线程处于阻塞状态时其他的线程就不往下执行了 看看代码是不是一个线程的 如果是一个线程的 线面就阻塞了 转载于 https www cnblogs
  • SpringBoot项目将数据源变成Json文件(Jackson2RepositoryPopulatorFactoryBean实现)

    一 项目情景 有时在我们项目当中需要存储一些固定值时 会使用一些配置文件来存储 例如最常见的 json文件 它可以用来存储相应的属性以及属性值 当你需要的时候进行提取 甚至还可以基于这个 json文件写一些条件查询的语句来获得自己需要的值
  • 正则表达式转义字符

    正则表达式的转义字符 除 外 其他字符与自身匹配 点的转义 gt u002E 美元符号的转义 gt u0024 乘方符号的转义 gt u005E 左大括号的转义 gt u007B 左方括号的转义 gt u005B 左圆括号的转义 gt u0
  • 浙大python网_Python爬虫学习(8):浙大软院网络登陆保持

    在浏览器的验证窗口中输入登陆名和密码后 成功后会弹出一个小的新窗口 如果不小心关闭了这个窗口 则就会无法联网 如果说我在一个不带有桌面的Linux系统中 我是不能够通过浏览器接入网络的 虽然提供了不同系统的不同版本的客户端 没有用过 但是还
  • koa文件上传(详解koa-body)

    koa body const koa require koa const koaBody require koa body const path require path const app new koa let app new Koa
  • linux切换目录shell脚本,【Linux命令行与shell脚本编程】教程三——切换目录

    浏览文件系统 1 Linux文件路径 linux文件路径和windows文件路径不同 一个windows文件的路径可能是这样的 C Users John Documents test txt 而Linux的路径是这样的 home John
  • IOS通知中心(观察者模式)[NSNotificationCenter defaultCenter]

    通知机制和KVO都是通过 观察者模式实现的 KVO 即 Key Value Observing 它提供一种机制 当指定的对象的属性被修改后 则对象就会接受到通知 简单的说就是每次指定的被观察的对象的属性被修改后 KVO就会自动通知相应的观察
  • 深入理解计算机系统(第二版) 家庭作业 第十一章

    11 6 A 因为read requesthdrs中已经打印出了请求报头 所以只要打印请求行即可 在doit函数中第一个sscanf语句之后添加下面的语句即可 printf s s s n method uri version B 用火狐浏
  • webM文件解析--基于Matroska和EBML

    1 什么是webM 要说webM 先说Matroska Matroska是一个可扩展的 开源的多媒体容器 说简单点 容器的作用 就是把视频和音频封装到一个文件 使用这种容器的常见文件 一个是MKV 一个就是webM 两者的区别 无非是支持的
  • 大话西游灯谜答案

  • 《拉勾Java高薪课程》阶段一输出 之 持久层框架设计实现及MyBatis源码分析-学习笔记 --菜鸟小回

    阶段一模块一学习笔记 文章目录 阶段一模块一学习笔记 toc 一 自定义持久层框架 1 JDBC问题总结 2 问题解决思路 3 自定义框架设计 4 实际项目目录分析 5 优化 5 1 将测试类方法 5 2 仍存在问题 5 3 解决方式 6
  • SpringBoot访问静态资源html和jsp

    1 新建springBoot项目 1 2 3 4 5 6 2 配置项目JDK 前面已经配置的可以不用配置 1 2 3 把项目配置成maven项目 1 2 3 4 5 6 有maven项目这里结构有test 4 访问json 配置数据库在默认
  • 使用51单片机实现点阵汉字平滑滚动显示

    使用51单片机实现点阵汉字平滑滚动显示 说明 采用的芯片是89C51 LED点阵屏的规格是16 16 同时使用了两个74HC595芯片 字模生成软件在文末有网盘链接 1 连接原理图 整体的电路连接如上图所示 单片机只需要使用三个IO接口 就