嵌入式开发学习(STC51-9-led点阵)

news2024/11/27 12:37:51

内容

点亮一个点;
显示数字;
显示图像;

LED点阵简介

LED 点阵是由发光二极管排列组成的显示器件
通常应用较多的是8 * 8点阵,然后使用多个8 * 8点阵可组成不同分辨率的LED点阵显示屏,比如16 * 16点阵可以使用4个8 * 8点阵构成;因此理解了8 * 8LED点阵的工作原理,其他分辨率的LED点阵显示屏都是一样的;

8 * 8点阵共由64个发光二极管组成,且每个发光二极管是放置在行线和列线的交叉点上,当对应的某一行置1电平,某一列置0电平,则相应的二极管就亮;

原理图

在这里插入图片描述
由图可知,点亮一个点,只需让对应行输出高电平,对应列输出低电平即可;

点亮一个点

思路

第一列置低电平,第一行置高电平;

编码

main.c

/*
 * @Description: 点亮一个点
 */
#include "reg52.h"

typedef unsigned int u16; // 对系统默认数据类型进行重定义
typedef unsigned char u8;

// 定义74HC595控制管脚
sbit SCK = P3 ^ 6; // 移位寄存器时钟输入
sbit RCK = P3 ^ 5; // 存储寄存器时钟输入
sbit SER = P3 ^ 4; // 串行数据输入

#define LEDDZ_COL_PORT P0 // 点阵列控制端口

/**
 * @description: 延时函数(循环一次大约10us)
 * @param {u16} ten_us
 * @return {*}
 */
void delay_10us(u16 ten_us)
{
	while (ten_us--)
		;
}

/**
 * @description: 延时函数(循环一次大约1ms)
 * @param {u16} ms
 * @return {*}
 */
void delay_ms(u16 ms)
{
	u16 i, j;
	for (i = ms; i > 0; i--)
		for (j = 110; j > 0; j--)
			;
}

/**
 * @description: 向74HC595写入一个字节的数据
 * @param {u8} dat 要写入的数据
 * @return {*}
 */
void hc595_write_data(u8 dat)
{
	u8 i = 0;

	for (i = 0; i < 8; i++) // 循环8次即可将一个字节写入寄存器中
	{
		SER = dat >> 7; // 优先传输一个字节中的高位
		dat <<= 1;		// 将低位移动到高位
		SCK = 0;
		delay_10us(1);
		SCK = 1; // 移位寄存器SCK时钟上升沿将端口数据送入存储寄存器RCK中
		delay_10us(1);
	}
	RCK = 1; // 存储寄存器RCK时钟上升沿将前面写入到寄存器的数据输出
	delay_10us(1);
	RCK = 0;
}

void main()
{
	u8 i = 0;

	LEDDZ_COL_PORT = 0x7f; // 将LED点阵左边第一列设置为0,即LED阴极为低电平,其余列为1,即高电平
	while (1)
	{
		hc595_write_data(0x80); // 将LED点阵上边第一行设置为1,即LED阳极为高电平,其余行为0,即低电平
	}
}

编译和结果

按F7编译,无错误,生成.hex文件,使用pz-isp将hex文件下载到单片机

(注意把LED点阵旁的J24黄色跳线帽短接到GND一端)

结果:led点阵第一个点被点亮
在这里插入图片描述

显示数字

思路

利用动态扫描的思想,只要使两个点被点亮间隔不超过24ms,那么点看起来就像连续点亮一样;

把我们想要显示的数字在8 * 8点阵里用每个点表示出来(推荐使用文字取模软件)

循环扫描8行(每次让一行为1,其余行为0),显示每行需要点亮的点(行扫描法)

编码

main.c

/*
 * @Description: 显示数字
 */
#include "reg52.h"

typedef unsigned int u16; // 对系统默认数据类型进行重定义
typedef unsigned char u8;

// 定义74HC595控制管脚
sbit SCK = P3 ^ 6; // 移位寄存器时钟输入
sbit RCK = P3 ^ 5; // 存储寄存器时钟输入
sbit SER = P3 ^ 4; // 串行数据输入

#define LEDDZ_COL_PORT P0 // 点阵列控制端口

u8 gled_row[8] = {0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01}; // LED点阵显示数字6的行数据
u8 gled_col[8] = {0xff, 0x83, 0xbf, 0xbf, 0x83, 0xbb, 0xbb, 0x83}; // LED点阵显示数字6的列数据

/**
 * @description: 延时函数(循环一次大约10us)
 * @param {u16} ten_us
 * @return {*}
 */
void delay_10us(u16 ten_us)
{
	while (ten_us--)
		;
}

/**
 * @description: 延时函数(循环一次大约1ms)
 * @param {u16} ms
 * @return {*}
 */
void delay_ms(u16 ms)
{
	u16 i, j;
	for (i = ms; i > 0; i--)
		for (j = 110; j > 0; j--)
			;
}

/**
 * @description: 向74HC595写入一个字节的数据
 * @param {u8} dat 要写入的数据
 * @return {*}
 */
void hc595_write_data(u8 dat)
{
	u8 i = 0;

	for (i = 0; i < 8; i++) // 循环8次即可将一个字节写入寄存器中
	{
		SER = dat >> 7; // 优先传输一个字节中的高位
		dat <<= 1;		// 将低位移动到高位
		SCK = 0;
		delay_10us(1);
		SCK = 1; // 移位寄存器SCK时钟上升沿将端口数据送入存储寄存器RCK中
		delay_10us(1);
	}
	RCK = 1; // 存储寄存器RCK时钟上升沿将前面写入到寄存器的数据输出
	delay_10us(1);
	RCK = 0;
}

void main()
{
	u8 i = 0;

	while (1)
	{
		for (i = 0; i < 8; i++) // 循环8次扫描8行、列
		{
			hc595_write_data(gled_row[i]); // 传送行选数据
			LEDDZ_COL_PORT = gled_col[i];  // 传送列选数据
			delay_10us(100);			   // 延时一段时间,等待显示稳定
			hc595_write_data(0x00);		   // 消影
		}
	}
}

编译和结果

按F7编译,无错误,生成.hex文件,使用pz-isp将hex文件下载到单片机

结果:显示数字6
在这里插入图片描述

显示图像

思路

与显示数字相同,但是我们这里用列扫描法;

编码

main.c

/*
 * @Description: 显示图像
 */
#include "reg52.h"

typedef unsigned int u16; // 对系统默认数据类型进行重定义
typedef unsigned char u8;

// 定义74HC595控制管脚
sbit SCK = P3 ^ 6; // 移位寄存器时钟输入
sbit RCK = P3 ^ 5; // 存储寄存器时钟输入
sbit SER = P3 ^ 4; // 串行数据输入

#define LEDDZ_COL_PORT P0 // 点阵列控制端口

u8 gled_row[8] = {0x38, 0x7C, 0x7E, 0x3F, 0x3F, 0x7E, 0x7C, 0x38}; // LED点阵显示数字6的行数据
u8 gled_col[8] = {0x7f, 0xbf, 0xdf, 0xef, 0xf7, 0xfb, 0xfd, 0xfe}; // LED点阵显示数字6的列数据

/**
 * @description: 延时函数(循环一次大约10us)
 * @param {u16} ten_us
 * @return {*}
 */
void delay_10us(u16 ten_us)
{
	while (ten_us--)
		;
}

/**
 * @description: 延时函数(循环一次大约1ms)
 * @param {u16} ms
 * @return {*}
 */
void delay_ms(u16 ms)
{
	u16 i, j;
	for (i = ms; i > 0; i--)
		for (j = 110; j > 0; j--)
			;
}

/**
 * @description: 向74HC595写入一个字节的数据
 * @param {u8} dat 要写入的数据
 * @return {*}
 */
void hc595_write_data(u8 dat)
{
	u8 i = 0;

	for (i = 0; i < 8; i++) // 循环8次即可将一个字节写入寄存器中
	{
		SER = dat >> 7; // 优先传输一个字节中的高位
		dat <<= 1;		// 将低位移动到高位
		SCK = 0;
		delay_10us(1);
		SCK = 1; // 移位寄存器SCK时钟上升沿将端口数据送入存储寄存器RCK中
		delay_10us(1);
	}
	RCK = 1; // 存储寄存器RCK时钟上升沿将前面写入到寄存器的数据输出
	delay_10us(1);
	RCK = 0;
}

void main()
{
	u8 i = 0;

	while (1)
	{
		for (i = 0; i < 8; i++) // 循环8次扫描8行、列
		{
			LEDDZ_COL_PORT = gled_col[i];  // 传送列选数据
			hc595_write_data(gled_row[i]); // 传送行选数据
			delay_10us(100);			   // 延时一段时间,等待显示稳定
			hc595_write_data(0x00);		   // 消影
		}
	}
}

编译和结果

按F7编译,无错误,生成.hex文件,使用pz-isp将hex文件下载到单片机

结果:显示一个爱心
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

恒盛策略:医药股反弹,掀涨停潮!

今天上午A股商场涨跌互现&#xff0c;上证指数一度显着跌落&#xff0c;但临近上午收盘时翻红。 作为行情风向标&#xff0c;券商板块盘中一度大幅跌落&#xff0c;但随后快速收窄跌幅&#xff0c;板块内分解较为显着&#xff0c;其中市值超越1000亿元的龙头券商之一的中金公司…

OPENCV C++(八)HOG的实现

hog适合做行人的识别和车辆识别 对一定区域的形状描述方法 可以表示较大的形状 把图像分成一个一个小的区域的直方图 用cell做单位做直方图 计算各个像素的梯度强度和方向 用3*3的像素组成一个cell 3*3的cell组成一个block来归一化 提高亮度不变性 常用SVM分类器一起使用…

HTML Emoji和Emoji 参考手册

HTML表情可以用来在网页中插入各种表情符号图标&#xff0c;丰富了网页表现形式和视觉效果。下面是一些常用HTML表情代码大全&#x1f4dc; Emoji 参考手册 HTML Emoji 扩展&#xff1a;&#x1f4cc; HTML 自定义实现emoji - (freesion.com)

native vlan tag设置错误,导致交换机无法访问

一同事找来&#xff0c;说他的一个测试交换机&#xff0c;下挂一些测试设备&#xff0c;能正常访问&#xff0c;但交换机的ip192.168.100.128却无法telnet访问&#xff0c;ping过去显示无法访问目的主机&#xff0c;让给看一下原因&#xff1f; 已知组网这个交换机接在交换机的…

用于实体对齐的联合学习实体和关系表示2019 AAAI 8.7+8.8

用于实体对齐的联合学习实体和关系表示 摘要介绍相关工作实体对齐图卷积网络 问题公式我们的方法整体架构初步实体对齐图卷积层对齐训练 近似关系表示联合实体和关系对齐 实验总结 摘要 实体对齐是在不同知识图之间集成异构知识的一种可行方法。该领域的最新发展通常采用基于嵌…

端口映射软件可以做什么?快解析如何设置端口映射?

说到端口映射&#xff0c;首先说说nat。简单地说&#xff0c;nat就是在局域网内部网络中使用内部地址&#xff0c;而当内部节点要与外部网络进行通讯时&#xff0c;就在网关处&#xff0c;将内部地址替换成公用地址&#xff0c;从而在外部公网&#xff08;internet&#xff09;…

网络系统观察之道

什么是“可观察性”&#xff1f; 当然&#xff0c;“可观察性”这个术语并不是我们发明的。我们最开始从用户那里听到这个概念&#xff0c;这些用户主要来自网站可靠性工程 (SRE) 社区。有些信息来源认为&#xff0c;这个术语起源于硅谷巨头&#xff08;如 Twitter&#xff09…

CTF流量题解http2.pcapng

使用wireshark工具打开流量文件。 根据网络协议进行分组排序&#xff0c;对流量文件里面的内容进行观察。 16进制转换&#xff0c;16进制转换文本字符串&#xff0c;在线16进制转换 | 在线工具 (sojson.com) Base64编码/解码器&#xff0c;在线解码Base64 (sojson.com) https:…

VS2008总在当前项目文件夹创建3个不必要的文件夹的解决方法

如下图所示&#xff1a; 这3个文件夹都是无必要的空文件夹&#xff08;1.Visual Studio 2008 2.Visual Studio 2008Projects 3.Visual Studio 2008Templates&#xff09;&#xff0c;每个项目都这样就有点烦躁的了。每次打开还要给你重建。 解决方法&#xff1a; 1.重置“项…

【Java可执行命令】(十八)可视化监控和管理工具 jconsole:获取 JVM的内存使用情况、线程活动、GC 行为等重要指标的可视化工具 ~

Java可执行命令之jconsole 1️⃣ 概念2️⃣ 优势和缺点3️⃣ 使用3.1 语法格式3.2 注意事项 4️⃣ 应用场景&#x1f33e; 总结 1️⃣ 概念 jconsole 是 Java Development Kit (JDK) 自带的一款图形化监控和管理工具。它旨在提供一个简单而强大的界面&#xff0c;用于监视和管…

成品短视频App源码,开启你的创意视频之旅!

短视频App如今已成为人们记录和分享生活的热门方式。你是否想过自己拥有一款属于自己的短视频App呢?有了短视频App源码&#xff0c;就能轻松实现这一愿望。本文将介绍短视频App源码的优势、开发流程和功能特点&#xff0c;助你快速创建个性化短视频App&#xff0c;开启你的创意…

并发——什么是线程,什么是进程

文章目录 1.1. 何为进程?1.2. 何为线程? 1.1. 何为进程? 进程是程序的一次执行过程&#xff0c;是系统运行程序的基本单位&#xff0c;因此进程是动态的。系统运行一个程序即是一个进程从创建&#xff0c;运行到消亡的过程。 在 Java 中&#xff0c;当我们启动 main 函数时…

鉴源论坛·观擎丨浅谈操作系统的适航符合性(下)

作者 | 蔡喁 上海控安可信软件创新研究院副院长 版块 | 鉴源论坛 观擎 社群 | 添加微信号“TICPShanghai”加入“上海控安51fusa安全社区” 在浅谈操作系统的适航符合性&#xff08;上&#xff09;中&#xff0c;详细介绍了民用飞机操作系统的研制现状及其适航要求&#xff…

【雕爷学编程】Arduino动手做(197)---零知 STM32F103RBT6 标准开发板2

37款传感器与模块的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&#x…

SAP ABAP元素域值描述通过函数(DD_DOMVALUE_TEXT_GET)获取

代码如下&#xff1a; PERFORM FRM_GET_DOMVALUE_TEXT USING ZMMD_ZFLZQ <GFS_DATA>-ZFLZQ CHANGING <GFS_DATA>-ZZQTEXT .IF <GFS_DATA>-ZXYLX IS NOT INITIAL .PERFORM FRM_GET_DOMVALUE_TEXT USING ZMMD_ZXYLX <GFS_DATA>-ZXYLX CHANGING <GFS_…

matlab使用教程(11)—创建随机数

MATLAB 使用算法来生成伪随机数和伪独立数。这些数在数学意义上并非严格随机和独立的&#xff0c;但它们能够通过各种随机和独立统计测试&#xff0c;并且其计算可以重复&#xff0c;方便用于测试或诊断目的。 rand 、 randi 、 randn 和 randperm 函数是创建随机数数组的主要…

C++核心编程:C++中的引用

C中的引用 引用的基本语法 作用&#xff1a;给变量起别名 语法&#xff1a;数据类型 & 别名 原名 //比如给一个int变量a命名一个别名 b int &b a;b 20; cout<< a << endl;//a 20引用的注意事项 引用必须初始化 int &b;//错误的引用在初始化后&…

美国超导:一家第四次工业革命中的小型成长型公司

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 总结: &#xff08;1&#xff09;在韩国研究人员宣布发现首个常压室温超导体LLK-99这个潜在的革命性化合物,并大肆宣传后&#xff0c;美国超导(AMSC)的股票暴涨了60%。 &#xff08;2&#xff09;美国超导是一家专门从事超…

13 Java 多线程见的通信 volatile synchronized,Java多线程等待通知机制, ThreadLocal的使用

volatile synchronized ThreadLocal 线程间的通信 volatile synchronizedvolatile和synchronized关键字线程等待/通知机制ThreadLocal的使用 线程间的通信 volatile synchronized 线程开始运行&#xff0c;拥有自己的栈空间&#xff0c;就如同一个脚本一样&#xff0c;按照既定…

揭秘无人机在水利行业中如何应用

无人机的应用已经成为现代科技的重要组成部分&#xff0c;在水利行业中&#xff0c;无人机的应用同样发挥了极其重要的作用。无人机在水利行业中的应用&#xff0c;不仅提高了工作效率&#xff0c;还极大地降低了人力和物力成本&#xff0c;为水利工作注入了新的活力。 一、无人…