51单片机之LED点阵屏

目录

1.LED点阵屏简介

2.配置LED点阵屏代码


1.LED点阵屏简介

        LED点阵屏真的是遍布我们我们生活的每个角落,从街边的流动显示字的招牌到你的液晶显示屏,都是基于点阵屏的原理研究出来的。还有那个世界上最大的球状建筑物:MSG Sphere,也是基于LED点阵的原理实现的:

        把单色的LED换成彩色的RGB,实现幻彩般的视觉观感,这也是科技的魅力吧。

        我们单片机上的就是比较简单的一种点阵屏,它不仅仅是一些LED,我们需要了解的更多应该是怎么实现使用更少的IO口控制这个LED点阵屏。

        我们开发板上的LED点阵屏一共有16个,我们使用这些点阵屏可以制作很多有意思的东西。比如网上很火的坤坤跳舞(doge)和贪吃蛇小游戏,这里我们就来了解一下它到底是使用什么方式实现的吧。

        首先LED点阵屏和数码管还有矩阵键盘都有异曲同工之处,使用循环行列式扫描实现图像显示,然后是使用共阴共阳连接减少IO口占用。至于行列扫描,我们应该都比较熟悉了,还是一样的,这里主要介绍一下IO口的占用。

        如果说,数码管的显示数据减少IO口的方式是使用74HC138芯片实现位选,74HC245芯片实现数选,这里我们对LED点阵屏的使用也要有相应的芯片达到减少IO占用的结果,而这里我们使用的是74HC595芯片来减少IO占用。

        74HC595是串行输入并行输出的移位寄存器,可用3根线输入串行数据,8根线输出并行数据,多片级联后,可输出16位、24位、32位等,常用于IO口扩展。

具体功能的实现像一个队列,只不过换了一种形式:

        这个是大概的实现原理的流程图:我们使用从SRC端口接入数据,当上升沿移位寄存器从0变成1的时候,从SER的数据就再进入一个,把前面得到的数据往下移1位,SERCLK变回0。当上升沿锁存寄存器RCLK置为1的时候,在整个寄存器中的数据就会全部移到和输出端相连的输出缓存处,直接输出数据,从而实现全部数据同时输出的作用。

        当当前的数据储存存满了之后,我们可以使用片级联的方法,使得再进入数据可以继续储存数据,从而实现16位32位甚至更多。

        像这样,离总输出端最近的部分再次输入数据,数据就会通过最下方传输到下一个级联的SER,为下一个级联的部分输入数据。等到上升沿锁存置为1的时候,所有的芯片都会向IO口输出数据,从而实现更多位的LED输出。

2.配置LED点阵屏代码

        这里配置一下LED点阵屏的代码

        这里可以看到我们需要配置三个引脚,RCLK,SRCLK,SER。

        我们可以把这几个引脚使用sbit重新命名一下。

这里说明一下,类似引脚这样的重命名是使用sbit和sfr两种

针对P0,P1,P2等这样的寄存器重新命名使用sfr,比如我们可以把使用LED时把P2命名成LED,即sfr LED = P2;

这样我们就可以直接对我们取的名字直接操纵,比如LED = 0xf0;

sbit针对的是一个寄存器中更加精确的位,例如P2^2,我们使用sbit LED = P2^2;就定义了单位,如果我们不重新命名,我们就要使用P2^2就只能使用P2_2 = 0;这样才可以使用,因为在头文件中定义的只有P2_2这样的形式,P2^2这样的定义意思其实就是P2寄存器中第二位的意思,这样才找到的这个位。

这里我们使用sbit重新定义这几个引脚,目的是增加代码可读性

        这里我们不能直接定义P3^5为RCLK,在头文件的184行有一个定义过的RCLK,所以我们就要使用别的名字,只要知道谁是谁就好了。

sbit RCK = P3^5;
sbit SRCLK = P3^6;
sbit SER = P3^4;

        现在开始编写函数实现输入一个8位二级制数据,使用74HC595芯片把内容写入。首先我们要知道的是,我们是使用一位一位的把数据输入到芯片SER引脚,每次需要把一位数据输入到芯片里面,我们的SERCLK就要置为高电平,然后数据才会移位,我们再把SERCLK置为0.。循环这个过程,直到我们的数据全部都进入,这个时候我们就要使用上升沿锁存RCLK置为高电平,把数据输出到缓存区。

void Write74HC595(unsigned char byte)
{unsigned char i = 0;for(i = 0;i<8;i++){SER = byte&(0x80>>i);SRCLK  = 1;SRCLK  = 0;}RCK = 1;RCK = 0;
}

        这样我们调用函数,我们就可以把数据输出了。但是我们要实现点阵屏亮,还要实现一点东西:

        根据原理图我们可以知道:我们74HC595芯片输出的是LED点阵的一列A1-A8的阳极,我们还需要在K1-K8输入低电平才可以让LED点阵亮起来。

        假设我想要让一个对角线亮起来,我们就要使用循环控制行和列来实现,就好像我们的数码管的数选和位选,我们就要使用循环的形式达成。

        这里我们再实现一个函数,让我们可以通过输入列的数和输入芯片的数据,然后输出一列的对应的LED

void MartixLEDShow(unsigned char col,unsigned char byte)
{SRCLK  = 0;RCK = 0;Write74HC595(byte);P0 = ~(0x80>>(col-1));
}

然后我们调用函数:

void main()
{while(1){MartixLEDShow(1,0x80);MartixLEDShow(2,0x40);MartixLEDShow(3,0x20);MartixLEDShow(4,0x10);MartixLEDShow(5,0x08);MartixLEDShow(6,0x04);MartixLEDShow(7,0x02);MartixLEDShow(8,0x01);}
}

        然后到了这里如果LED点阵还没亮,不要慌,把LED点阵旁边的跳线帽J24拔下来,插到另外两个针头上就可以了

          这样我们就可以在我们的LED上显示一个对角线的灯光了,但是我们还有一点问题,就是我们会发现:我们的LED点阵屏上有一些本来不该亮的地方亮了,其实就和前面讲过的数码管一样的原理,就是位选+数选的叠加导致上一个数选和下一个位选结合或者上一个数选和下一个位选结合然后导致显示的错误,所以我们就要做一件事:消隐。保证消除上一次的位选或者数选。

        同时,消隐会道义一点问题:就是我们的这个亮度会变暗,所以我们就要消隐前使用Delay函数把这个LED亮的时长增加,就可以实现正常亮度了。

        更改之后的函数如下:

void MartixLEDShow(unsigned char col,unsigned char byte)
{SRCLK  = 0;RCK = 0;Write74HC595(byte);P0 = ~(0x80>>(col-1));Delay(1);P0 = 0Xff;//消隐
}

        这样就实现了一个对角线的LED点阵亮。

        实现一个对角线还是比较简单的,这里我们再实现一个笑脸:

        这里实现这个笑脸,红色部分是需要点亮的地方,我们要把每一列的数据都记录在一个数组里面:

unsigned char Image[] = {0x3c,0x42,0xa9,0x85,0x85,0xa9,0x42,0x3c};

 对了,这里可以在数组名字前面加上51的关键字:code,这样我们就可以把数组的内容存储在单片机的flash缓存中了,我们也就可以写入更多的数据了:
 

unsigned char code Image[] = {0x3c,0x42,0xa9,0x85,0x85,0xa9,0x42,0x3c};

然后再在main函数里调用函数就可以实现一个笑脸了:

void main()
{while(1){unsigned char i = 0;for(i=0;i<8;i++){MartixLEDShow(i+1,Image[i]);}}
}

这里再封装一个函数,我们输入数组的名字+长度就可以实现调用了:

void ImageShow(unsigned char*Image,unsigned int len)
{unsigned char i = 0;for(i=0;i<len;i++){MartixLEDShow(i+1,Image[i]);}
}void main()
{while(1){ImageShow(Image,8);}
}

        对了,这里可以使用一个软件,也是买板子的时候给的:

        这个是取模软件,我们可以自行生成想要图案,但是这个生成文字的功能需要16*16以上的点阵,这里就只使用8*8的功能:

选择新建一个8*8的图像

放大,以便操作

点击格点画图

点击生成之后复制代码到自己的数组中使用即可。

当然,还想要实现什么都可以靠自己实现。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

低代码ARM计算机在IIoT中的采集控制生产面板

工业4.0的大潮下工业物联网&#xff08;IIoT&#xff09;已成为推动制造业转型升级的重要动力。其中&#xff0c;低代码ARM嵌入式计算机凭借其出色的性能、灵活的配置以及高度集成化的特点&#xff0c;在工业设备远程监控、维护与诊断方面发挥着关键作用。 一、远程监控与维护 …

python爬虫———post请求方式(第十四天)

&#x1f388;&#x1f388;作者主页&#xff1a; 喔的嘛呀&#x1f388;&#x1f388; &#x1f388;&#x1f388;所属专栏&#xff1a;python爬虫学习&#x1f388;&#x1f388; ✨✨谢谢大家捧场&#xff0c;祝屏幕前的小伙伴们每天都有好运相伴左右&#xff0c;一定要天天…

Maven与Jave web结构

Maven 简介 https://www.liaoxuefeng.com/wiki/1252599548343744/1255945359327200 java web module web目录 –src 应用程序源代码和测试程序代码的根目录 –main –java  应用程序源代码目录     --package1     --class1     --class2 –resources  应用…

Docker内更新Jenkins详细讲解

很多小伙伴在Docker中使用Jenkins时更新遇到困难&#xff0c;本次结合自己的实际经验&#xff0c;详细讲解。根据官网Jenkins了解以下内容&#xff1a; 一、Jenkins 是什么? Jenkins是一款开源 CI&CD 软件&#xff0c;用于自动化各种任务&#xff0c;包括构建、测…

Mysql-数据库集群的搭建以及数据库的维护

一、数据库的维护 1.数据库的备份与恢复 1&#xff09;备份指定数据库 #mysqldump -u root -p zx > ./zx.dump 2&#xff09;备份所有库 #mysqldump -u root -p --all-databases > ./all.dump 3)恢复所有库 #mysql -u root -p < ./all.dump 4)恢复指定数据库 #mysq…

网络基础三——IP协议补充和Mac帧协议

全球网络及网段划分的理解 ​ 根据国家组织地区人口综合评估进行IP地址范围的划分&#xff1b; ​ 假设前8位用来区分不同的国家&#xff0c;国际路由器负责全球数据传输&#xff0c;子网掩码为IP/8&#xff1b;次6位区分不同的省份&#xff0c;国内路由器负责全国数据的传输…

再见 MybatisPlus,阿里推出新 ORM 框架更牛X

最近看到一个 ORM 框架 Fluent Mybatis 挺有意思的&#xff0c;整个设计理念非常符合工程师思维。 我对官方文档的部分内容进行了简单整理&#xff0c;通过这篇文章带你看看这个新晋 ORM 框架。 官方文档&#xff1a;https://gitee.com/fluent-mybatis/fluent-mybatis/wikis 提…

Golang | Leetcode Golang题解之第19题删除链表的倒数第N个结点

题目&#xff1a; 题解&#xff1a; func removeNthFromEnd(head *ListNode, n int) *ListNode {dummy : &ListNode{0, head}first, second : head, dummyfor i : 0; i < n; i {first first.Next}for ; first ! nil; first first.Next {second second.Next}second.N…

Redis缓存设计

文章目录 1 缓存的收益与成本分析1.1 收益1.2 成本 2 缓存更新策略的选择和使用场景2.1 LRU/LFU/FIFO算法剔除2.2 超时剔除2.3 主动更新2.4 缓存更新策略对比 2.5 最佳实践 3 缓存粒度控制方法3.1 缓存全部数据3.2 缓存部分数据3.3 缓存粒度控制方法对比 4 缓存穿透问题优化4.1…

(2022级)成都工业学院软件构造实验三:面向数据的软件构造

写在前面 1、基于2022级软件工程实验指导书 2、代码仅提供参考 3、如果代码不满足你的要求&#xff0c;请寻求其他的途径 运行环境 window11家庭版 IntelliJ IDEA 2023.2.2 jdk17.0.6 实验要求 任务&#xff1a; ‍一、构造任务4&#xff1a;批量产生习题并用文件存储…

IntelliJ IDEA 2024.1安装与激活[破解]

一&#xff1a;IDEA官方下载 ①如题&#xff0c;先到IDEA官方下载&#xff0c;简简单单 ②IDEA官方&#xff1a;IntelliJ IDEA – the Leading Java and Kotlin IDE 二&#xff1a;获取脚本 &#x1f31f;网盘下载&#xff1a;jetbra (密码&#xff1a;lzh7) &#x1f31f;获取…

STC89C52学习笔记(七)

STC89C52学习笔记&#xff08;七&#xff09; 综述&#xff1a;本文介绍了串口以及讲述了串口相关寄存器如何配置并给予相关代码。 一、修改代码注意事项 在修改代码时不要一次性加入一堆代码&#xff0c;不利于定位错误。可以先注释一些代码&#xff0c;待解决完毕问题后再…

物联网农业四情在线监测系统

TH-Q2随着科技的飞速发展和信息化时代的来临&#xff0c;物联网技术在各个领域都取得了显著的应用成果。其中&#xff0c;物联网农业四情在线监测系统作为农业现代化的重要组成部分&#xff0c;正在为农业生产带来革命性的变革。 一、物联网农业四情在线监测系统的概念 物联网…

大模型笔记:Prompt tuning

1 NLP模型的几个阶段 1.1 第一阶段&#xff08;在深度学习出现之前&#xff09; 通常聚焦于特征工程&#xff08;feature engineering&#xff09;利用领域知识从数据中提取好的特征 1.2 第二阶段&#xff08;在深度学习出现之后&#xff09; 特征可以从数据中习得——>…

使用 kaggle api 实现 kaggle 数据快速下载

在下载kaggle数据集时&#xff0c;以猫狗数据集举例子&#xff0c;有两种方法&#xff1a; Dogs vs. Cats | Kaggle 1&#xff1a;直接浏览器下载&#xff0c;较慢&#xff0c;不推荐。 2&#xff1a;使用kaggle API下载&#xff0c;很快。本文重点介绍。详情可以&#xff1…

Web前端-Ajax

Ajax 概念:Asynchronous JavaScript And XML,异步的JavaScript和XML。 作用: 1.数据交换:通过Ajax可以给服务器发送请求,并获取服务器响应的数据。 2.异步交互:可以在不重新加载整个页面的情况下,与服务器交换数据并更新部分网页的技术,如:搜索联想、用户名是否可用的校验等等…

ARM嵌入式控制器带HDMI为制造业注入智能动力

工业自动化技术的飞速发展&#xff0c;IT与OT的融合已成为推动工业进步的关键力量。在这个背景下&#xff0c;ARM工业计算机凭借其强大的功能和灵活性&#xff0c;成为了边缘自动化领域的一颗新星。今天&#xff0c;我们将深入探讨这款设备如何通过其独特的特性&#xff0c;助力…

Scrapy 爬取m3u8视频

Scrapy 爬取m3u8视频 【一】效果展示 爬取ts文件样式 合成的MP4文件 【二】分析m3u8文件路径 视频地址&#xff1a;[在线播放我独自升级 第03集 - 高清资源](https://www.physkan.com/ph/175552-8-3.html) 【1】找到m3u8文件 这里任务目标很明确 就是找m3u8文件 打开浏览器…

【C语言】“vid”Microsoft Visual Studio安装及应用(检验内存泄露)

文章目录 前言安装包获取配置VLD完成 前言 我们在写代码时往往容易存在内存泄漏的情况&#xff0c;所以存在这样一个名为VLD的工具用来检验内存泄漏&#xff0c;现在我来教大家安装一下 安装包获取 vld下载网址&#xff1a;https://github.com/KindDragon/vld/releases/tag/…

三支冲突分析介绍

Pawlak最早通过观察一组智能体对一组问题的意见&#xff0c;提出了冲突分析模型。U表示对象集&#xff0c;V表示属性集&#xff0c;R表示对象集和属性集之间的二元关系&#xff0c;这样一个刻画冲突分析的信息系统通过三元组&#xff08;U&#xff0c;V&#xff0c;R&#xff0…