单片机第一季:零基础5——LED点阵

news2024/12/26 20:56:47

1,第八章-LED点阵

如何驱动LED点阵:
(1)单片机端口直接驱动。要驱动8*8的点阵需要2个IO端口(16个IO口)、要驱动16*16的点阵需要4个IO端口(32个IO口)。
(2)使用串转并移位锁存器驱动。要驱动16*16点阵只需要4个74HC595+3个IO口即可(数据口、SCLK、RCLK)。

通过三个IO端口和4个74HC595级联的方式对16*16的LED点阵进行控制。

74HC595:

74hc595中文数据手册

主要用的控制管角为,SER:串行数据输入管脚;SRCLK:数据输入时钟线;RCLK:输出存储器锁存时钟线;QA-QH:数据输出管脚;QH’:串行数据输出管脚,OE是使能管脚,低有效。

数据通过SER按bit输入,循环8次即可将一个字节写入寄存器中,每次循环需要设置一个SRCLK上升沿,当8个移位寄存器写满后,在通过SER输入的数据,会将前边写入移位寄存器的8个bit依次通过QH'输出;

设置RCLK的上升沿将前面写入移位寄存器中的数据通过输出存储器通过QA-QH输出。

以下代码为点亮16*16点阵中一个点:

(让第一个74HC595 输出0X01(0000 0001),这样点阵第一行就是高电平,而第3 个74HC595 输出0XFE(1111 1110),第4 个74HC595 输出0XFF(1111 1111),这样点阵第一列就是低电平,从而让LED 点阵第一个点点亮)

******************
深圳市普中科技有限公司(PRECHIN 普中)
技术支持:www.prechin.net
实验名称:LED 点阵实验(点亮一个点)
接线说明:
实验现象:下载程序后,16*16LED 点阵点亮左上角第一个点
注意事项:
*********************************************************************
******************/
#include "reg52.h"
typedef unsigned int u16; //对系统默认数据类型进行重定义
typedef unsigned char u8;
//定义74HC595 控制管脚
sbit SRCLK=P3^6; //移位寄存器时钟输入
sbit RCLK=P3^5; //存储寄存器时钟输入
sbit SER=P3^4; //串行数据输入
/********************************************************************
***********
* 函数名: delay_10us
* 函数功能: 延时函数,ten_us=1 时,大约延时10us
* 输入: ten_us
* 输出: 无
*********************************************************************
**********/
void delay_10us(u16 ten_us)
{
    while(ten_us--);
}
/********************************************************************
***********
* 函数名: hc595_write_data(u8 dat)
* 函数功能: 向74HC595 写入4 个字节的数据
* 输入: dat1:对应74HC595(A)输出第1 行-第8 行
dat2:对应74HC595(B)输出第9 行-第16 行
dat3:对应74HC595(C)输出第1 列-第8 列
dat4:对应74HC595(D)输出第9 列-第16 列
* 输出: 无
*********************************************************************
**********/
void hc595_write_data(u8 dat1,u8 dat2,u8 dat3,u8 dat4)
{
    u8 i=0;
    for(i=0;i<8;i++)//循环8 次即可将一个字节写入寄存器中
    {
        SER=dat4>>7;//优先传输一个字节中的高位
        dat4<<=1;//将低位移动到高位
        SRCLK=0;
        delay_10us(1);
        SRCLK=1;
        delay_10us(1);//移位寄存器时钟上升沿将端口数据送入寄存器中
    }
    
    for(i=0;i<8;i++)
    {
        SER=dat3>>7;
        dat3<<=1;
        SRCLK=0;
        delay_10us(1);
        SRCLK=1;
        delay_10us(1);
    }
    
    for(i=0;i<8;i++)
    {
        SER=dat2>>7;
        dat2<<=1;
        SRCLK=0;
        delay_10us(1);
        SRCLK=1;
        delay_10us(1);
    }

    for(i=0;i<8;i++)
    {
        SER=dat1>>7;
        dat1<<=1;
        SRCLK=0;
        delay_10us(1);
        SRCLK=1;
        delay_10us(1);
    }
    RCLK=0;
    delay_10us(1);
    RCLK=1;//存储寄存器时钟上升沿将前面写入到寄存器的数据输出
 }
/********************************************************************
***********
* 函数名: main
* 函数功能: 主函数
* 输入: 无
* 输出: 无
*********************************************************************
**********/
void main()
{
    u8 i=0;
    while(1)
    {
        hc595_write_data(0x01,0x00,0xfe,0xff);//将LED 点阵上边第一行设置为
        1,即LED 阳极为高电平,其余行为0,即低电平
    }
}

要实现行列不同位置亮灯,需要使用动态显示的方法,也要结合扫描的方法。在第一行亮灯一段时间以后灭掉,点亮第二行一段时间以后灭掉,点亮第三行一段时间以后灭掉,如此点亮,直到八行全部点亮一次,在第一行点亮到最后一行灭掉的总时间不能超过人肉眼可识别的时间,即24 毫秒。在每一行点亮的时候,给列一个新的数据,此时对应列的数据就可以体现在这行上要点亮的灯上。这样就和动态数码管的显示一样,只不过数码管的LED 灯是段值。这里使用LED 点阵显示数字,也是多个LED 同时点亮。

要想在点阵上显示数字等字符,首先要获取在LED 点阵上显示数字字符所需的数据,即一个数字字符在LED 点阵上显示,对应的每行每列都会有一些灯点亮或者熄灭,这样就会构成一组数据,也就是数字字符的显示数据,我们只要将这些数据通过74HC595 发送到点阵对应的行或列就能显示数字字符。

数字字符可以通过取模软件获取。

LED点阵显示数字:

/********************************************************************
******************
深圳市普中科技有限公司(PRECHIN 普中)
技术支持:www.prechin.net
实验名称:LED 点阵实验(显示数字)
接线说明:
实验现象:下载程序后,16*16LED 点阵显示数字0
注意事项:
*********************************************************************
******************/
#include "reg52.h"
#include "intrins.h"
typedef unsigned int u16; //对系统默认数据类型进行重定义
typedef unsigned char u8;
//定义74HC595 控制管脚
sbit SRCLK=P3^6; //移位寄存器时钟输入
sbit RCLK=P3^5; //存储寄存器时钟输入
sbit SER=P3^4; //串行数据输入
//LED 点阵显示数字0 的列数据
u8 gled_col[32]=
{0x00,0x00,0xE0,0x03,0x10,0x04,0x08,0x08,0x04,0x10,0x04,0x10,0x04,0x10,0x04,0x10,0x04,0x10,0x04,0x10,0x04,0x10,0x04,0x10,0x08,0x08,0x10,0x04,0xE0,0x03,
0x00,0x00};
//LED 点阵显示数字0 的行数据
u8 gled_row[32]=
{0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
/********************************************************************
***********
* 函数名: delay_10us
* 函数功能: 延时函数,ten_us=1 时,大约延时10us
* 输入: ten_us
* 输出: 无
*********************************************************************
**********/
void delay_10us(u16 ten_us)
{
    while(ten_us--);
}
/********************************************************************
***********
* 函数名: hc595_write_data(u8 dat)
* 函数功能: 向74HC595 写入4 个字节的数据
* 输入: dat1:对应74HC595(A)输出第1 行-第8 行
        dat2:对应74HC595(B)输出第9 行-第16 行
        dat3:对应74HC595(C)输出第1 列-第8 列
        dat4:对应74HC595(D)输出第9 列-第16 列
* 输出: 无
*********************************************************************
**********/
void hc595_write_data(u8 dat1,u8 dat2,u8 dat3,u8 dat4)
{
    u8 i=0;
    for(i=0;i<8;i++)//循环8 次即可将一个字节写入寄存器中
    {
        SER=dat4>>7;//优先传输一个字节中的高位
        dat4<<=1;//将低位移动到高位
        SRCLK=0;
        // delay_10us(1);
        _nop_();
        SRCLK=1;
        _nop_();
        // delay_10us(1);//移位寄存器时钟上升沿将端口数据送入寄存器中
    }
    
    for(i=0;i<8;i++)
    {
        SER=dat3>>7;
        dat3<<=1;
        SRCLK=0;
        // delay_10us(1);
        _nop_();
        SRCLK=1;
        _nop_();
        // delay_10us(1);//移位寄存器时钟上升沿将端口数据送入寄存器中
    }

    for(i=0;i<8;i++)
    {
        SER=dat2>>7;
        dat2<<=1;
        SRCLK=0;
        // delay_10us(1);
        _nop_();
        SRCLK=1;
        _nop_();
        // delay_10us(1);//移位寄存器时钟上升沿将端口数据送入寄存器中
    }

    for(i=0;i<8;i++)
    {
        SER=dat1>>7;
        dat1<<=1;
        SRCLK=0;
        // delay_10us(1);
        _nop_();
        SRCLK=1;
        _nop_();
        // delay_10us(1);//移位寄存器时钟上升沿将端口数据送入寄存器中
     }
        RCLK=0;
        delay_10us(1);
        RCLK=1;//存储寄存器时钟上升沿将前面写入到寄存器的数据输出
}
/********************************************************************
***********
* 函数名: main
* 函数功能: 主函数
* 输入: 无
* 输出: 无
*********************************************************************
**********/
void main()
{
    u8 i=0;
    while(1)
    {
        for(i=0;i<16;i++)//循环16 次扫描16 行、列
        {
            hc595_write_data(gled_row[i],gled_row[i+16],~gled_col[i*2],~gled_
            col[i*2+1]);//传送行列选数据
            delay_10us(10);//延时一段时间,等待显示稳定
            hc595_write_data(0x00,0x00,0x00,0x00);//消影
        }
    }
}

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

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

相关文章

Linux 系统编程-开发环境(二)

目录 7 压缩包管理 7.1 tar 7.2 rar 7.3 zip 8 进程管理 8.1 who 8.2 ps 8.3 jobs 8.4 fg 8.5 bg 8.6 kill 8.7 env 8.8 top 9 用户管理 9.1 创建用户 9.2 设置用户组 9.3 设置密码 9.4 切换用户 9.5 root用户 9.6 删除用户 10 网络管理 10.1 i…

MySQL-分库分表详解(七)

♥️作者&#xff1a;小刘在C站 ♥️个人主页&#xff1a; 小刘主页 ♥️努力不一定有回报&#xff0c;但一定会有收获加油&#xff01;一起努力&#xff0c;共赴美好人生&#xff01; ♥️学习两年总结出的运维经验&#xff0c;以及思科模拟器全套网络实验教程。专栏&#xf…

【熬夜送书 | 第二期】清华社赞助 | 《前端系列丛书》

前端是什么? 前端&#xff08;Front-End&#xff09;&#xff0c;又称浏览器端、客户端等&#xff0c;是指 Web 应用程序中负责用户交互、界面展示和数据展示的部分。前端技术体系主要包括 HTML、CSS 和 JavaScript 等内容。 其中&#xff0c;HTML&#xff08;Hypertext Mar…

❀如何获得铁粉❀

文章目录 引言一、提供独特的价值1.1 分享专业知识和经验1.2 提供独特的产品或服务1.3 展示个人风格和个性 二、构建真实的关系2.1 回应评论和互动2.2 分享个人故事和经历2.3 建立信任和互信关系 三、提供独家福利3.1 提供折扣和促销3.2 推出限量版产品或服务3.3 独家活动和会员…

位运算常见算法题

文章目录 前言191. 位1的个数338. 比特位计数461. 汉明距离136. 只出现一次的数字260. 只出现一次的数字 III面试题 01.01. 判定字符是否唯一268. 丢失的数字371. 两整数之和137. 只出现一次的数字 II面试题 17.19. 消失的两个数字 前言 本篇文章会涉及多道位运算题目&#xf…

图像处理学习笔记(一)

目录 图像处理学习笔记&#xff08;一&#xff09;一、基础知识1、彩色图像&#xff08;1&#xff09;RGB&#xff08;2&#xff09;HSV&#xff08;3&#xff09;HSI&#xff08;4&#xff09;CMYK&#xff08;5&#xff09;YUV&#xff08;6&#xff09;YCbCr 2、灰度图像3、…

谋合作、创新境 | 百度参观图为科技生产全链路

当代科技的发展不断催生出新的变革和机遇&#xff0c;百度作为全球顶尖的高科技公司&#xff0c;凭借其强大的创新基因&#xff0c;一直处于人工智能领域的最前沿。   近日&#xff0c;百度公司派出了一支专业团队来到了图为科技&#xff0c;对图为的研发技术及生产线进行了全…

python 把txt文本的log日志倒序处理

在上述代码中&#xff0c;我们尝试了一系列常见的编码&#xff08;utf-8、gbk、latin-1&#xff09;来打开文件&#xff0c;直到找到一个能够成功解码文件内容的编码。 如果找到了匹配的编码&#xff0c;就使用该编码读取文件内容。如果仍然出现解码错误&#xff0c;你可能需要…

虚幻Voxel插件

虚幻Voxel插件 Voxel Plugin Voxel Plugin brings smoothed voxel terrain to Unreal Engine 4. Generate, destroy and terraform the world! 体素插件可以在虚幻引擎中生成平滑的体素地形。创造、破环和改造世界。 Terrain generation and terraforming both in game and i…

CANOE 操作详情

canoe 手把手教你如何操作canoe工具&#xff1a; 1&#xff1a;创建test文件夹&#xff0c; 并在文件夹下创建3 文件夹 2&#xff1a;创建canoe工程&#xff0c;选择500波特率 3: 双击后进入 4&#xff1a;创建DBC文件 5 创建网络节点&#xff1a; 两个节点创建好之后&#x…

mpVue 微信小程序基于vant-weapp 组件的二次封装TForm 表单组件(适配移动端)——新增仓库地址

一、前言 1、mpVue微信小程序不支持动态组件&#xff08;<component> &#xff09; 2、mpVue微信小程序不支持动态属性及事件穿透&#xff08;$attrs和$listeners&#xff09; 3、mpVue微信小程序不支持render函数 二、最终效果 三、配置参数&#xff08;Attributes&…

OpenCV for Python 入坑第一天:图像的基础操作

我们都知道&#xff0c;OpenCV能够帮助我们处理视频和图像&#xff0c;咱们在图像处理中&#xff0c;除了Pillow库之外&#xff0c;最经常用到的也是它了。那么现在咱们就正式入坑OpenCV for Python&#xff0c;一起来感受一下OpenCV的魅力吧&#xff01; 文章目录 读取图像 im…

深入了解Redis-基础篇

文章目录 一、故事背景二、知识点主要构成2.1、redis简介2.2、基于CentOS Linux docker容器化安装redis2.3、redis的数据类型2.3.1、String类型2.3.2、Hash类型2.3.3、List类型2.3.4、Set类型2.3.5、SortedSet类型 2.4、Redis的Java客户端2.4.1、Jedis2.4.1.1、Jedis的使用步骤…

leetcode 572. 另一棵树的子树(java)

另一棵树的子树 另一棵树的子树题目描述解法一 DFS解法二 KMP 算法 KMP 算法 另一棵树的子树 来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 链接&#xff1a;https://leetcode.cn/problems/subtree-of-another-tree 题目描述 给你两棵二叉树 root 和 subRoot 。检验 …

脑电微状态方法可靠吗?

摘要 EEG微状态是在静息态EEG记录中观察到的代表功能性脑网络的状态&#xff0c;在快速切换到另一个网络之前保持稳定40-120ms。人们认为微状态特征(如持续时间、发生率、覆盖率和转换概率)可以作为精神和神经系统疾病以及心理社会特征的神经标志物。然而&#xff0c;需要可靠…

设计模式-01策略模式

1 什么是设计模式 先看一段设计模式总结之父们GOF在《设计模式 可复用面向对象软件的基础》一书中描述的一段话&#xff1a; 设计模式就是程序编码设计时的一些套路&#xff0c;这些套路都是经过前人千锤百炼总结出来的经验&#xff0c;由GoF总结出23种经典套路&#xff0c;即…

4028: 按位与

题目内容 输入格式 输入第一行一个整数 n n n。 第二行 n n n 个整数 a 1 , a 2 , ⋯ , a n a_1, a_2, \cdots, a_n a1​,a2​,⋯,an​。 输出格式 输出一行一个整数表示答案。 样例 1 输入 5 6 2 3 4 7 样例 1 输出 7 #include<bits/stdc.h> using namespace std…

怎样优雅地增删查改(三):业务用户的增删查改

文章目录 创建业务用户创建业务用户同步器创建业务用户应用服务增删改查 创建控制器测试按组织架构查询按职称查询 创建业务用户 区别于身份管理模块&#xff08;Identity模块&#xff09;的鉴权用户IdentityUser&#xff0c;业务用户&#xff08;BusinessUser&#xff09;是围…

【Python】正则表达式语法入门

目录 正则表达式 1、点&#xff1a;匹配所有字符 2、星号&#xff1a;重复匹配任意次 3、加号&#xff1a;重复匹配多次 4、花括号&#xff1a;匹配指定次数 5、贪婪模式和非贪婪模式 6、反斜杠&#xff1a;对元字符的转义 7、方括号&#xff1a;匹配几个字符之一 8、…

计算机科学与技术基础课程复习

文章目录 大学计算机基础 大学计算机基础 国防科技大学慕课 从算牌开始&#xff0c;记录数据 数据的计算规则 帕斯卡的加法器 计算自动化 图灵的梦想 乘10运算的图灵机 图灵记 根据状态和记录&#xff1b;根据控制器规则&#xff0c;从起始状态到结束状态&#xff0c;从…