嵌入式开发学习(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文件下载到单片机

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

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

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

相关文章

现代C++中的从头开始深度学习:【4/8】梯度下降

一、说明 在本系列中&#xff0c;我们将学习如何仅使用普通和现代C编写必须知道的深度学习算法&#xff0c;例如卷积、反向传播、激活函数、优化器、深度神经网络等。 在这个故事中&#xff0c;我们将通过引入梯度下降算法来介绍数据中 2D 卷积核的拟合。我们将使用卷积和上一个…

Linux6.32 Kubernetes kubeadm部署

文章目录 计算机系统5G云计算第三章 LINUX Kubernetes kubeadm部署一、kubeadm搭建 Kubernetes v1.20&#xff08;一主两从&#xff09;1.环境准备2.所有节点安装docker3.所有节点安装kubeadm&#xff0c;kubelet和kubectl4.部署K8S集群 二、kubeadm搭建 Kubernetes v1.20&…

没有进度管理的项目,都是在做无用功

在项目管理过程中&#xff0c;最大的挑战之一是确保项目实施与计划保持一致。 项目实施过程是一个相对漫长的过程&#xff0c;其中受到许多因素的影响。如果项目实施没有按照原始项目计划进行&#xff0c;很容易导致项目偏离计划&#xff0c;最终可能导致项目停滞或失败。 当…

vue+iviewUi+oss直传阿里云上传文件

前端实现文件上传到oss&#xff08;阿里云&#xff09;适用于vue、react、uni-app&#xff0c;获取视频第一帧图片 用户获取oss配置信息将文件上传到阿里云&#xff0c;保证了安全性和减轻服务器负担。一般文件资源很多直接上传到服务器会加重服务器负担此时可以选择上传到oss&…

Django基础

1.Django基础 路由系统视图模板静态文件和媒体文件中间件ORM&#xff08;时间&#xff09; 2.路由系统 本质上&#xff1a;URL和函数的对应关系。 2.1 传统的路由 from django.contrib import admin from django.urls import path from apps.web import viewsurlpatterns …

数据结构【哈夫曼树】

哈夫曼树 哈夫曼树的概念哈夫曼树的构造构造算法的实现哈夫曼树应用哈夫曼编码哈夫曼编码的算法实现 哈夫曼树的概念 最优二叉树也称哈夫曼 (Huffman) 树&#xff0c;是指对于一组带有确定权值的叶子结点&#xff0c;构造的具有最小带权路径长度的二叉树。权值是指一个与特定结…

【Hystrix技术指南】(6)请求合并机制原理分析

[每日一句] 也许你度过了很糟糕的一天&#xff0c;但这并不代表你会因此度过糟糕的一生。 [背景介绍] 分布式系统的规模和复杂度不断增加&#xff0c;随着而来的是对分布式系统可用性的要求越来越高。在各种高可用设计模式中&#xff0c;【熔断、隔离、降级、限流】是经常被使…

源码分析——LinkedList源码分析

文章目录 1.LinkedList简介2.内部结构分析3.LinkedList源码分析3.1构造方法3.2add方法3.3根据位置取数据的方法3.4根据对象得到索引的方法3.5检查链表是否包含某对象的方法&#xff1a; 1.LinkedList简介 LinkedList是一个实现了List接口和Deque接口的双端链表。 LinkedList底…

以技术驱动反欺诈,Riskified 为企业出海保驾护航

如今&#xff0c;全球对于线上消费的需求日益增长&#xff0c;各类新型支付方式也层出不穷。在国内&#xff0c;线上支付有着较为完善的法律及监管条例&#xff0c;格局基本已定型。但对于出海商家而言&#xff0c;由于不同国家和地区的支付规则和监管机制不同&#xff0c;跨境…

【PostgreSQL内核学习(十一)—— OpenGauss源码学习(CopyTo)】

可优化语句执行 概述什么是列存储&#xff1f;列存的优势 相关函数CopyToCStoreCopyToCopyStatetupleDescCStoreScanDesc CStoreBeginScanRelationSnapshotProjectionInfo GetCStoreNextBatchRunScanFillVecBatchCStoreIsEndScan CStoreEndScan 声明&#xff1a;本文的部分内容…

使用docker搭建GPT服务

不用ChatGPT账号,不用API,直接免费使用上官方原版的GPT4.0! 这个操作主要使用的是GitHub上的一个开源项目freegpt。 通过docker把这个项目打包到本地电脑上,直接就能使用上原版GPT4.0。 第一步:下载Docker 下载网址:docker.com 根据自己的电脑系统下载对应的版本即可 下…

虚拟ip地址软件哪个好 手机虚拟ip地址软件有哪些

虚拟ip地址修改器 IP转换器软件是一种用于把不同格式的IP地址转换为另一种格式的工具。下面是几种常见的深度IP转换器软件&#xff1a; 1. 深度IP转换器 深度IP转换器是一种收费的、简单易用的在线工具&#xff0c;可以将IPv4地址转换为16进制、2进制和10进制等格式。此外&am…

基于Byzer-LLM和ChatGLM-6B快速搭建一款免费的语言大模型助力电商企业

假设有一家电商企业&#xff0c;员工大概20-30人&#xff0c;企业是在淘宝等电商平台买衣服&#xff0c;目前在淘宝上已经上架十万种服饰, 之前淘宝限制服饰的标题描述字数&#xff0c;所以写的特别精简。以该公司售卖的阔腿裤为例&#xff0c;目前标题都是这样的&#xff1a; …

Kafka 概述

Kafka 为什么需要消息队列&#xff08;MQ&#xff09;使用消息队列的好处&#xff08;1&#xff09;解耦&#xff08;2&#xff09;可恢复性&#xff08;3&#xff09;缓冲&#xff08;4&#xff09;灵活性 & 峰值处理能力&#xff08;5&#xff09;异步通信 消息队列的两…

AI和ChatGPT:人工智能的奇迹

AI和ChatGPT&#xff1a;人工智能的奇迹 引言什么是人工智能&#xff1f;ChatGPT&#xff1a;AI的语言之王ChatGPT的工作原理ChatGPT的优势和挑战AI和ChatGPT的未来展望结论 引言 人工智能&#xff08;Artificial Intelligence&#xff0c;简称AI&#xff09;是一项令人兴奋的…

LeetCode 周赛 340,质数 / 前缀和 / 极大化最小值 / 最短路 / 平衡二叉树

今天讲 LeetCode 单周赛第 340 场&#xff0c;今天状态不好&#xff0c;掉了一波大分。 2614. 对角线上的质数&#xff08;Easy&#xff09; 这道题是最近第 2 次出现质数问题&#xff0c;注意 1 不是质数&#xff01; 质数判断&#xff1a;$O(n\sqrt(U))$ 2615. 等值距离和…

小程序裂变怎么做?小程序裂变机制有哪些?

做了小程序就等于“生意上门”&#xff1f;其实并不是这样。小程序跟流量平台较为明显的区别就在于小程序并非“自带流量”&#xff0c;而是需要企业利用自己的营销推广能力来建立引流渠道&#xff0c;从而完成用户的拉新和留存、转化。因此&#xff0c;想要用小程序来增加自己…

直线电机模组在激光切割机上的作用

激光切割机是将从激光器发射出的激光&#xff0c;经光路系统&#xff0c;聚焦成高功率密度的激光束。激光束照射到工件表面&#xff0c;使工件达到熔点或沸点&#xff0c;同时与光束同轴的高压气体将熔化或气化金属吹走。激光切割加工是用不可见的光束代替了传统的机械刀&#…

【2.3】Java微服务:sentinel服务哨兵

✅作者简介&#xff1a;大家好&#xff0c;我是 Meteors., 向往着更加简洁高效的代码写法与编程方式&#xff0c;持续分享Java技术内容。 &#x1f34e;个人主页&#xff1a;Meteors.的博客 &#x1f49e;当前专栏&#xff1a;Java微服务 ✨特色专栏&#xff1a; 知识分享 &…

24v转3.3v输出3A用什么芯片

问&#xff1a;客户需要一个能够将24V输入电压转换为3.3V输出电压&#xff0c;并且能够提供1-3A的电流输出的芯片。还希望它能够内置MOS管。有什么推荐的型号吗&#xff1f;&#xff08;vin24v、5v&#xff0c;vout3.3v&#xff0c;Io1-3A&#xff09; 答&#xff1a;推荐使用…