10:LED点阵显示汉字

LED点阵显示汉字

  • 1、字模
  • 2、横向取模

1、字模

(1)如何记录组成字的LED点阵亮灭信息(16x16点阵一共有256点,显示一个特定的字需要其中有些点亮而另一些不亮,如何记录哪些点亮哪些点不亮?用字模)字模如何工作?256个点用256个二进制位表示,1表示这个点亮,0表示不亮。256个点就256个二进制位,也就是256/8=32个字节。所以一个大小为16*16的字的字模是32个字节大小。所以字模的表现形式就是32个unsigned char型数据。
(2)字模如何获取.一般都是用专门的字模提取软件去提取的:这种软件的作用就是给一1字就能自动得到这个字对应的32个字节的字模编码。

在这里插入图片描述

2、横向取模

显示“朱”。
(1)规律1:d1和d2用字模来填充,填充时要取反(因为是负极)
(2)规律2:d3和d4来选择哪一行被点亮,而d1和d2选择这行中哪个点被点亮
(3)规律3:shixu一次送16个LED的亮灭信息(2字节),所以必须调用shixu函数16次,才能把整个点阵全部点亮完毕。

#include <REGX51.H>
#define uchar unsigned char //宏定义,用uchar来代替unsigned char


sbit SER =  P3^4; //定义输入端
sbit RCLK = P3^5; //锁存时钟
sbit SCLK = P3^6; //移位时钟

void shixu (uchar d1,uchar d2,uchar d3,uchar d4)
{
	unsigned char i;
	
		SCLK = 0;
	    RCLK = 0;
	
	for(i=0 ;i<=7 ;i++)
		{
			SER = d1 >> 7; //将d1的最高位赋值给SER
			SCLK = 0;
			SCLK = 1; //对SER引脚进行一次采样
			d1 = d1 << 1; //将d1的次高位移到最高位
		}
	
	for(i=0 ;i<=7 ;i++)
			{
				SER = d2 >> 7; //将d2的最高位赋值给SER
				SCLK = 0;
				SCLK = 1; //对SER引脚进行一次采样
				d2 = d2 << 1; //将d2的次高位移到最高位
			}
	
	for(i=0 ;i<=7 ;i++)
			{
				SER = d3 >> 7; //将d3的最高位赋值给SER
				SCLK = 0;
				SCLK = 1; //对SER引脚进行一次采样
				d3 = d3 << 1; //将d3的次高位移到最高位
			}
	
	for(i=0 ;i<=7 ;i++)
			{
				SER = d4 >> 7; //将d4的最高位赋值给SER
				SCLK = 0;
				SCLK = 1; //对SER引脚进行一次采样
				d4 = d4 << 1; //将d4的次高位移到最高位
			}
			
			RCLK = 0;
		    RCLK = 1;//进行锁存,全部并行同一时间输出
}


void main (void)
{
	  unsigned char zhu [32] = {128,0,136,0,136,0,248,31,
			                    132,0,130,0,128,0,255,127,
		                        192,1,160,2,144,4,136,8,
		                        132,16,131,96,128,0,128,0};
                         //汉字朱的取模
														 														 
		shixu(~0,~128,0x00,0x01);//d3=0x00,d4=0x01表示显示第1行
		shixu(~0,~136,0x00,0x02);//d3=0x00,d4=0x02表示显示第2行												 
	    shixu(~0,~136,0x00,0x04);
		shixu(~31,~248,0x00,0x08);
        shixu(~0,~132,0x00,0x10);
	    shixu(~0,~130,0x00,0x20);
        shixu(~0,~128,0x00,0x40);
        shixu(~127,~255,0x00,0x80);
														 
        shixu(~1,~192,0x01,0x00);
		shixu(~2,~160,0x02,0x00);										 
	    shixu(~4,~144,0x04,0x00);
		shixu(~8,~136,0x08,0x00);
        shixu(~16,~132,0x10,0x00);
	    shixu(~96,~131,0x20,0x00);
        shixu(~0,~128,0x40,0x00);
        shixu(~0,~128,0x80,0x00);												 
												
}

在这里插入图片描述

代码的改进①:

#include <REGX51.H>
#define uchar unsigned char

sbit SER =  P3^4; //定义输入端
sbit RCLK = P3^5; //锁存时钟
sbit SCLK = P3^6; //移位时钟

void shixu (uchar d1,uchar d2,uchar d3,uchar d4)
{
	unsigned char i;
	
		SCLK = 0;
	    RCLK = 0;
	
	for(i=0 ;i<=7 ;i++)
		{
			SER = d1 >> 7; //将d1的最高位赋值给SER
			SCLK = 0;
			SCLK = 1; //对SER引脚进行一次采样
			d1 = d1 << 1; //将d1的次高位移到最高位
		}
	
	for(i=0 ;i<=7 ;i++)
			{
				SER = d2 >> 7; //将d2的最高位赋值给SER
				SCLK = 0;
				SCLK = 1; //对SER引脚进行一次采样
				d2 = d2 << 1; //将d2的次高位移到最高位
			}
	
	for(i=0 ;i<=7 ;i++)
			{
				SER = d3 >> 7; //将d3的最高位赋值给SER
				SCLK = 0;
				SCLK = 1; //对SER引脚进行一次采样
				d3 = d3 << 1; //将d3的次高位移到最高位
			}
	
	for(i=0 ;i<=7 ;i++)
			{
				SER = d4 >> 7; //将d4的最高位赋值给SER
				SCLK = 0;
				SCLK = 1; //对SER引脚进行一次采样
				d4 = d4 << 1; //将d4的次高位移到最高位
			}
			
			RCLK = 0;
		    RCLK = 1;//进行锁存,全部并行同一时间输出
}

void main (void)
{
	unsigned char zhu [32] = {128,0,136,0,136,0,248,31,
			                  132,0,130,0,128,0,255,127,
		                      192,1,160,2,144,4,136,8,
		                      132,16,131,96,128,0,128,0};
	
	unsigned char hang [8] = {0x01,0x02,0x04,0x08,
	                          0x10,0x20,0x40,0x80};
	unsigned char j;
	for(j=0 ;j<=15 ;++j)
	{ 
		if(j<8)
		shixu(~zhu[j*2+1],~zhu[j*2],0x00,hang[j]);
		else
		shixu(~zhu[j*2+1],~zhu[j*2],hang[j-8],0x00);
	}
}

代码改进②:
显示汉字“宝”

#include <REGX51.H>
#define uchar unsigned char

sbit SER =  P3^4; //定义输入端
sbit RCLK = P3^5; //锁存时钟
sbit SCLK = P3^6; //移位时钟
void  baga (uchar zimo[32],uchar hang[8]);

void shixu (uchar d1,uchar d2,uchar d3,uchar d4)
{
				unsigned char i;
	
				SCLK = 0;
			    RCLK = 0;
	
	for(i=0 ;i<=7 ;i++)
		{
				SER = d1 >> 7; //将d1的最高位赋值给SER
				SCLK = 0;
				SCLK = 1; //对SER引脚进行一次采样
				d1 = d1 << 1; //将d1的次高位移到最高位
			}
	
	for(i=0 ;i<=7 ;i++)
			{
				SER = d2 >> 7; //将d2的最高位赋值给SER
				SCLK = 0;
				SCLK = 1; //对SER引脚进行一次采样
				d2 = d2 << 1; //将d2的次高位移到最高位
			}
	
	for(i=0 ;i<=7 ;i++)
			{
				SER = d3 >> 7; //将d3的最高位赋值给SER
				SCLK = 0;
				SCLK = 1; //对SER引脚进行一次采样
				d3 = d3 << 1; //将d3的次高位移到最高位
			}
	
	for(i=0 ;i<=7 ;i++)
			{
				SER = d4 >> 7; //将d4的最高位赋值给SER
				SCLK = 0;
				SCLK = 1; //对SER引脚进行一次采样
				d4 = d4 << 1; //将d4的次高位移到最高位
			}
			
			    RCLK = 0;
			    RCLK = 1;//进行锁存,全部并行同一时间输出
	}

void  baga (uchar zimo[32],uchar hang[8])
{
	unsigned char j;
	for(j=0 ;j<=15 ;++j)
	{ 
		if(j<8)
		shixu(~zimo[j*2+1],~zimo[j*2],0x00,hang[j]);
		else
		shixu(~zimo[j*2+1],~zimo[j*2],hang[j-8],0x00);
	}
	 
}
//定义八嘎函数

void main (void)
{
	/*unsigned char zhu [32] = {128,0,136,0,136,0,248,31,
			                    132,0,130,0,128,0,255,127,
		                        192,1,160,2,144,4,136,8,
		                        132,16,131,96,128,0,128,0};//朱字的字模
	*/
	
	uchar bao [32] = {64,0,128,0,254,127,2,64,
		              1,32,0,0,254,63,128,0,
	                  128,0,128,0,252,31,128,0,
	                  128,4,128,8,255,127,0,0};//宝字的字模

	
	unsigned char hang [8] = {0x01,0x02,0x04,0x08,
	                          0x10,0x20,0x40,0x80};
	
		//baga(zhu,hang);
														
	    baga(bao,hang);//调用八嘎函数,进行显示
	
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/376904.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

机器学习 | 揭示EM算法和马尔可夫链的实际应用

目录 初识EM算法 马尔可夫链 HMM模型基础 HMM模型使用 初识EM算法 EM算法是一种求解含有隐变量的概率模型参数的迭代算法。该算法通过交替进行两个步骤&#xff1a;E步骤和M步骤&#xff0c;从而不断逼近模型的最优参数值。EM算法也称期望最大化算法&#xff0c;它是一个基…

负重20kg复合翼垂直起降无人机应用,复合翼无人机技术分析

主要任务应用 1.管线巡查 挂载可见光/红外二合一光电载荷和小型SAR设备&#xff0c;对既定线路进行昼夜巡视侦察&#xff0c;利用图像实时传回指挥控制中心&#xff0c;可用于石油管路、电力线路、舰艇航线及周围态势感知&#xff0c;利于依据现场实情进行战略决策和指令传达…

车载网络测试 - 总线基础 - CAN总线负载计算

我想做过CAN总线测试的都有遇到过拉高总线负载相关的测试&#xff0c;这个时候我们一般都会通过增加报文的数量或者减小报文的周期来实现&#xff0c;但是CAN总线上的负载到底是如何计算的呢&#xff1f;我想很多人都会有这个疑问吧&#xff0c;那么今天我们一起来看下如何计算…

10. Springboot集成Dubbo3(一)简单介绍

目录 1、前言 2、Dubbo3 2.1、什么是Dubbo3 2.2、Dubbo2 & Dubbo3 2.2.1、服务发现模型 2.2.2、RPC通信协议 2.2.2.1、Triple 协议 2.2.2.2、小结 2.2.3、云原生 2.2.4、maven依赖 2.2.5、性能 3、小结 1、前言 Dubbo是一个开源的Java分布式服务框架&#xff…

ProtonMail邮箱怎么样?国内有什么替代品?

ProtonMail作为业界知名的加密邮箱提供者&#xff0c;其安全性、隐私保护等特性让不少追求私密通信的用户趋之若鹜。然而对于国内用户而言&#xff0c;ProtonMail可能并非最佳选择&#xff0c;受限于许多因素&#xff0c;从语言支持到服务器位置再到可访问性&#xff0c;都可能…

个人博客说明

本人博客主要发布平台为博客园 https://www.cnblogs.com/carmi 更多详细&#xff0c;完整图片的文章还请师傅们动动小手到博客园去看吧。

泰克示波器——TBS2000系列界面整体介绍

目录 1.1 通道区域面板标识1.2 示波器测试输出&#xff08;检测探针与设置的好坏&#xff09;1.3 面板其他快捷按钮1.4 波器整体界面 1.1 通道区域面板标识 在通道面板的下方标识有示波器的通道属性以及参数值&#xff0c;如我使用的型号为“TBS2104X”的示波器&#xff0c;面…

【C#】.net core 6.0 设置根目录下某个文件夹可访问,访问创建的图片等资源

欢迎来到《小5讲堂》 大家好&#xff0c;我是全栈小5。 这是《C#》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解&#xff0c; 特别是针对知识点的概念进行叙说&#xff0c;大部分文章将会对这些概念进行实际例子验证&#xff0c;以此达到加深对知识点的理解和掌握。…

精酿啤酒:啤酒的后熟与包装过程的品质保障

啤酒的后熟与包装过程是确保产品品质的重要环节。对于Fendi Club啤酒来说&#xff0c;这一环节同样关键&#xff0c;它关系到啤酒的口感、风味和保质期的长短。 在啤酒的后熟过程中&#xff0c;Fendi Club啤酒酿造团队采用适当的温度和时间控制&#xff0c;让啤酒逐渐发展出更加…

ElastAlert 错误日志告警

文章目录 前言一、ElastAlert 概览1.1 简介1.2 ElastAlert 特性 二、ElastAlert 下载部署2.1 安装 Python3 环境2.2 下载 ElastAlert2.3 部署 ElastAlert 三、接入平台3.1 对外接口层3.2 服务层 前言 ElastAlert 是 Yelp 公司基于 python 开发的 ELK 日志告警插件&#xff0c;…

幻方(Magic Square)

幻方&#xff08;Magic Square&#xff09; 幻方概述 什么是幻方呢&#xff1f;幻方&#xff08;Magic Square&#xff09;就是指在nn&#xff08;n行n列&#xff09;的方格里填上一些连续的数字&#xff0c;使任意一行、任意一列和对角线上的数字的和都相等。例如有33的3行3…

【Linux】gdb调试与make/makefile工具

目录 导读 1. make/Makefile 1.1 引入 1.2 概念 1.3 语法规则 1.4 示例 2. Linux调试器-gdb 2.1 引入 2.2 概念 2.3 使用 导读 我们在上次讲了Linux编辑器gcc\g的使用&#xff0c;今天我们就来进一步的学习如何调试&#xff0c;以及makefile这个强大的工具。 1. mak…

VLAN间通信

VLAN间通信的三种方法 vlanif接口 最常用&#xff0c;又叫虚拟接口&#xff0c;这种方式一般使用三层交换机实现&#xff0c;它包含路由模块和交换模块&#xff0c;交换模块可以实现剥离和添加VLAN标签,路由模块实现路由功能 VLANif接口 为各自vlan的网关 # interface Vlani…

Page246~250 11.1GUI下的I/O基础

11.1.1 从“控制台”说起 “命令行交互界面”&#xff08;简称CUI,也有人称为CLI)。 CUI需要我们记忆并在控制台输入命令文本内容&#xff0c;而GUI则以图形的方式呈现、组织各类命令&#xff0c;比如Windows的“开始”菜单&#xff0c;用户只需通过简单的键盘或鼠标操作&am…

跳格子3 - 华为OD统一考试

OD统一考试&#xff08;C卷&#xff09; 分值&#xff1a; 200分 题解&#xff1a; Java / Python / C 题目描述 小明和朋友们一起玩跳格子游戏&#xff0c; 每个格子上有特定的分数 score [1, -1, -6, 7, -17, 7]&#xff0c; 从起点score[0]开始&#xff0c;每次最大的步…

YOLO部署实战(2):使用OpenCV优化视频转图片流程并设置帧数

在计算机视觉和图像处理领域&#xff0c;OpenCV是一个强大的开源库&#xff0c;它为处理图像和视频提供了丰富的工具和功能。本文将介绍如何使用OpenCV将视频文件转换为一系列图片&#xff0c;并演示如何通过设置转换的帧数来优化这一过程。 1 Win10配置OpenCV 在Windows操作…

【Linux】基于管道进行进程间通信

进程间通信 一、初识进程间通信1. 进程间通信概念2. 进程间通信分类 二、管道1. 管道概念2. 管道原理3. 匿名管道4. 匿名管道系统接口5. 管道的特性和情况6. 匿名管道的应用&#xff08;1&#xff09;命令行&#xff08;2&#xff09;进程池 7. 命名管道&#xff08;1&#xff…

c++阶梯之类与对象(中)< 续集 >

前文&#xff1a; c阶梯之类与对象&#xff08;上&#xff09;-CSDN博客 c阶梯之类与对象&#xff08;中&#xff09;-CSDN博客 前言&#xff1a; 在上文中&#xff0c;我们学习了类的六个默认成员函数之构造&#xff0c;析构与拷贝构造函数&#xff0c;接下来我们来看看剩下…

操作系统-信号量机制(整型信号量 记录型信号量)与用信号量实现进程互斥,同步,前驱关系

文章目录 信号量机制总览信号量机制整型信号量记录型信号量例子记录型信号量小结 小结 用信号量实现进程互斥&#xff0c;同步&#xff0c;前驱关系总览信号量机制实现进程互斥信号量机制实现进程同步进程同步信号量实现进程同步 信号量机制实现前驱关系小结 信号量机制 总览 …

索引失效问题

1、 like 以%开头&#xff0c;索引无效&#xff1b;当like前缀没有%&#xff0c;后缀有%时&#xff0c;索引有效。 &#xff08;1&#xff09;创建索引 create index text1 on emp(name); &#xff08;2&#xff09;不走索引 EXPLAIN select id,name,age,workno from emp wh…