当前位置: 首页 > news >正文

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

内容

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

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文件下载到单片机

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

相关文章:

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

内容 点亮一个点&#xff1b; 显示数字&#xff1b; 显示图像&#xff1b; LED点阵简介 LED 点阵是由发光二极管排列组成的显示器件 通常应用较多的是8 * 8点阵&#xff0c;然后使用多个8 * 8点阵可组成不同分辨率的LED点阵显示屏&#xff0c;比如16 * 16点阵可以使用4个8 *…...

RedisTemplate.opsForZSet()用法简介并举例

RedisTemplate.opsForZSet()是RedisTemplate类提供的用于操作ZSet类型&#xff08;有序集合&#xff09;的方法。它可以用于对Redis中的ZSet数据结构进行各种操作&#xff0c;如添加成员、获取成员、删除成员等。 下面是一些常用的RedisTemplate.opsForZSet()方法及其用法示例…...

Java个人博客系统--基于Springboot的设计与实现

目录 一、项目概述 应用技术 接口实现&#xff1a; 数据库定义&#xff1a; 数据库建表&#xff1a; 博客表数据库相关操作&#xff1a; 添加项⽬公共模块 加密MD5 页面展示&#xff1a;http://121.41.168.121:8080/blog_login.html 项目源码&#xff1a;https://gitee…...

在jupyter中下载数据集失败及解决方法(以IMDB为例)

在IMDB数据集下载时&#xff0c;由于网络原因下载失败&#xff0c;报错如下&#xff1a; Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/imdb.npz ConnectionResetError Traceback (most recent call last) … Exception: URL fetch f…...

【设计模式】-工厂方法模式

工厂方法模式&#xff08;Factory Method Pattern&#xff09;是一种创建型设计模式&#xff0c;它通过定义一个用于创建对象的接口&#xff0c;但是将具体对象的创建推迟到子类中。这样&#xff0c;子类可以决定要实例化的对象类型。工厂方法模式提供了一种方式&#xff0c;通…...

H7-TOOL的高速DAPLINK用于新版STM32CubeIDE V1.13及其以上版本的超简单实现方法(2023-08-08)

之前分享了一个方法&#xff0c;太繁琐了&#xff0c;H7-TOOL群的群友提供了一个方法&#xff0c;实现非常简单。1、使用STM32CubeMX或者自己创建一个STM32CubeIDE工程后&#xff0c;设置这两个地方即可&#xff1a; 配置调试器&#xff0c;设置完毕记得点击右下角的Apply 2、然…...

成功解决ubuntu-22.04的sudo apt-get update一直卡在【0% [Waiting for headers]】

成功解决ubuntu-22.04的sudo apt-get update一直卡在【0% [Waiting for headers]】 问题描述解决方案 问题描述 在下载安装包的时候一直卡在0% [Waiting for headers]&#xff0c;报错信息如下&#xff1a; Get:1 file:/var/cudnn-local-repo-ubuntu1804-8.5.0.96 InRelease […...

openLayers实战(一):vue项目中的离线地图引入

最近的项目涉及到离线地图的操作&#xff0c;查阅社区文章&#xff0c;决定使用openLayersvue离线地图的方式进行开发&#xff0c;前期基础引入操作完全参考掘金文章&#xff0c;非常优秀全面的文章。 openlayers 实战离线地图 - 掘金 此外&#xff0c;开发过程的地图操作可参考…...

如何构造一个安全的单例?

为什么要问这个问题&#xff1f; 我们知道&#xff0c;单例是一种很常用的设计模式&#xff0c;主要作用就是节省系统资源&#xff0c;让对象在服务器中只有一份。但是实际开发中可能有很多人压根没有写过单例这种模式&#xff0c;只是看过或者为了面试去写写demo熟悉一下。那…...

单片机开发 esp8266

一、固件界面 二、项目介绍 固件名称&#xff1a;esp8266-universalboard v1.0 提供商&#xff1a; 半条虫(466814195) 下载&#xff1a;esp8266-universalboard.bin 源码地址&#xff1a;Gitlab...

Linux 查看版本和用户权限提升实践心得

文章目录 linux (Ubuntu内核)查看版本版本信息解释内置yum工具&#xff1f;用户权限提升操作步骤 查看deepin系统的版本和其debian的版本遇到的问题&#xff1a;deepin-release文件不存在 linux (Ubuntu内核)查看版本 使用lsb_release命令&#xff1a; lsb_release -a该命令将…...

多线程编程5:线程同步和进程通信(C++11和linux)

常见的线程同步 linux&#xff1a; 互斥锁&#xff1a;实现共享资源的串行访问&#xff0c;有三个版本普通锁(默认属性)&#xff0c;检错锁(可以防止相同线程重复加锁)和递归锁(相同线程可以重复加锁)条件变量&#xff1a;配合互斥锁使用&#xff0c;实现线程之间的通信&#…...

tensorrt官方int8量化方法汇总

原理及操作 量化的基本原理及流程可参看懂你的神经网络量化教程&#xff1a;第一讲、量化番外篇、TensorRT中的INT8、tensorRT int8量化示例代码 Tensorrt 方式1&#xff1a;trtexec&#xff08;PTQ的一种&#xff09; int8量化 trtexec --onnxXX.onnx --saveEnginemodel.…...

21、p6spy输出执行SQL日志

文章目录 1、背景2、简介3、接入3.1、 引入依赖3.2、修改database参数&#xff1a;3.3、 创建P6SpyLogger类&#xff0c;自定义日志格式3.4、添加spy.properties3.5、 输出样例 4、补充4.1、参数说明 1、背景 在开发的过程中&#xff0c;总希望方法执行完了可以看到完整是sql语…...

实力认证!TDengine 入选 Gartner 中国数据分析与人工智能技术成熟度曲线

近日&#xff0c;国际权威研究机构 Gartner 发布了《2023 年中国数据分析及人工智能技术成熟度曲线》&#xff08;即《Hype Cycle for Data, Analytics and AI in China, 2023》&#xff09;报告&#xff0c;TDengine 成功入选实时数据管理领域代表产品。 作为评估全球新技术成…...

如何将jar包部署到宝塔

尝试多种方式上传&#xff0c;但启动一直失败&#xff0c;这种方式亲测是好使的 项目内修改位置 在pom.xml文件中将mysql的scope改成provided&#xff0c;如果是固定的版本号会出现问题 之后就可以打包啦&#xff0c;直接点击maven中的package 找到打包文件的位置&#xff…...

el-tree-select那些事

下拉菜单树形选择器 用于记录工作及日常学习涉及到的一些需求和问题 vue3 el-tree-select那些事 1、获取el-tree-select选中的任意层级的节点对象 1、获取el-tree-select选中的任意层级的节点对象 1-1数据集 1-2画面 1-3代码 1-3-1画面代码 <el-tree-selectv-model"s…...

分布式任务调度框架之开山鼻祖:Quartz

1.简介 最近我司上线使用了分布式任务调度框架&#xff1a;XXL-JOB&#xff0c;方便对任务的管理控制。本来一开始就想讲述一下该框架&#xff0c;但是在学习了解过程中发现该框架式基于Quartz思想开发实现的&#xff0c;Quartz 是一个很火的开源任务调度框架&#xff0c;完全…...

Django实现音乐网站 ⑺

使用Python Django框架制作一个音乐网站&#xff0c; 本篇主要是后台对歌手原有实现功能的基础上进行优化处理。 目录 新增编辑 表字段名称修改 隐藏单曲、专辑数 姓名首字母 安装xpinyin 获取姓名首字母 重写保存方法 列表显示 图片显示处理 引入函数 路径改为显示…...

PO、DTO和VO的区别

PO&#xff1a;Persistence Object&#xff0c;是持久化对象&#xff0c;也叫实体对象&#xff08;Entity&#xff09;&#xff0c;是对象到关系表的映射。在关系型数据库中&#xff0c;每张表对应着一个PO&#xff0c;PO 中的属性值与表中数据一一对应&#xff0c;通过数据访问…...

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…...

生成xcframework

打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式&#xff0c;可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...

C++_核心编程_多态案例二-制作饮品

#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为&#xff1a;煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例&#xff0c;提供抽象制作饮品基类&#xff0c;提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...

【WiFi帧结构】

文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成&#xff1a;MAC头部frame bodyFCS&#xff0c;其中MAC是固定格式的&#xff0c;frame body是可变长度。 MAC头部有frame control&#xff0c;duration&#xff0c;address1&#xff0c;address2&#xff0c;addre…...

Cesium1.95中高性能加载1500个点

一、基本方式&#xff1a; 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...

VTK如何让部分单位不可见

最近遇到一个需求&#xff0c;需要让一个vtkDataSet中的部分单元不可见&#xff0c;查阅了一些资料大概有以下几种方式 1.通过颜色映射表来进行&#xff0c;是最正规的做法 vtkNew<vtkLookupTable> lut; //值为0不显示&#xff0c;主要是最后一个参数&#xff0c;透明度…...

CMake控制VS2022项目文件分组

我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...

回溯算法学习

一、电话号码的字母组合 import java.util.ArrayList; import java.util.List;import javax.management.loading.PrivateClassLoader;public class letterCombinations {private static final String[] KEYPAD {"", //0"", //1"abc", //2"…...

AGain DB和倍数增益的关系

我在设置一款索尼CMOS芯片时&#xff0c;Again增益0db变化为6DB&#xff0c;画面的变化只有2倍DN的增益&#xff0c;比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析&#xff1a; 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...

【LeetCode】3309. 连接二进制表示可形成的最大数值(递归|回溯|位运算)

LeetCode 3309. 连接二进制表示可形成的最大数值&#xff08;中等&#xff09; 题目描述解题思路Java代码 题目描述 题目链接&#xff1a;LeetCode 3309. 连接二进制表示可形成的最大数值&#xff08;中等&#xff09; 给你一个长度为 3 的整数数组 nums。 现以某种顺序 连接…...