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

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.hqwc.cn/news/18833.html

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

相关文章

网安学习经历小记

明明自觉学会了不少知识&#xff0c;可真正开始做题时&#xff0c;却还是出现了“一支笔&#xff0c;一双手&#xff0c;一道力扣&#xff08;Leetcode&#xff09;做一宿”的窘境&#xff1f;你是否也有过这样的经历&#xff0c;题型不算很难&#xff0c;看题解也能弄明白&…

漏洞攻击 --- TCP -- 半开攻击、RST攻击

TCP半开攻击&#xff08;半连接攻击&#xff09; --- syn攻击 &#xff08;1&#xff09;定义&#xff1a; sys 攻击数据是DOS攻击的一种&#xff0c;利用TCP协议缺陷&#xff0c;发送大量的半连接请求&#xff0c;耗费CPU和内存资源&#xff0c;发生在TCP三次握手中。 A向B…

已解决 BrokenPipeError: [Errno 32] Broken pipe

作者主页&#xff1a;爱笑的男孩。的博客_CSDN博客-深度学习,活动,python领域博主爱笑的男孩。擅长深度学习,活动,python,等方面的知识,爱笑的男孩。关注算法,python,计算机视觉,图像处理,深度学习,pytorch,神经网络,opencv领域.https://blog.csdn.net/Code_and516?typeblog个…

zabbix server is not running错误解决方法

1.错误&#xff1a;zabbix server is not running 打开zabbix server的时候&#xff0c;底部飘着一行黄色的警告字 2.解决方法 (1)关闭selinux (2)查看日志文件 #tail -f /var/log/zabbix/zabbix_server.log 发现内存溢出了 __zbx_mem_realloc(): out of memory 那…

【小沐学C++】libcurl实现HTTP/HTTPS请求

文章目录 1、简介2、下载和编译2.1 下载2.2 编译2.3 使用 3、命令行测试3.1 获取文件头Headers3.2 请求内容Request Content3.3 响应内容Response Content3.4 GET请求3.5 POST请求3.6 其他 4、代码测试3.1 simple.c3.2 url2file.c3.3 simplepost.c3.4 resolve.c3.5 progressfun…

uniapp 集成 Android Studio 使用原生插件

uniapp 集成 Android Studio 使用原生插件 前期工作 下载 Android Studio下载 HbuilderX 对应的 App离线SDK 准备集成 打开选中项目选中其中的模块文件夹在该文件夹下的libs目录下添加需要使用的jar包&#xff08;一般是第三方设备平台提供&#xff09;在该文件夹下的src\m…

二、OAuth2 client对接Spring Authorization Server

这里用的是授权码模式 搭建&#xff1a;Spring Authorization Server 代码结构如下&#xff1a; 代码实现 添加依赖 <dependency> <groupId>org.springframework.boot</groupId> …

Spring WebFlux 实现原理与架构图

启动原理与架构图 通过spring-boot-autoconfigure中的spring.factories文件&#xff0c;通过Spring Boot自动初始化下列类&#xff1a;HttpHandlerAutoConfiguration、ReactiveWebServerFactoryAutoConfiguration、WebFluxAutoConfiguration、ErrorWebFluxAutoConfiguration、…

ARM day9 (按键中断控制led亮灭)

key.h #ifndef __KEY_H__ #define __KEY_H__#include "stm32mp1xx_gpio.h" #include "stm32mp1xx_rcc.h" #include "stm32mp1xx_uart.h" #include "stm32mp1xx_exti.h" #include "stm32mp1xx_gic.h"//事件号 #define EXTI_…

学无止境·MySQL④(多表查询)

多表查询试题 试题一1、创建表2、表中添加数据3、查询每个部门的所属员工4、查询研发部门的所属员工5、查询研发部和销售部的所属员工6、查询每个部门的员工数,并升序排序7、查询人数大于等于3的部门&#xff0c;并按照人数降序排序 试题一 1、创建表 use mydb3; – 创建部门…

NAT介绍

目录 NAT NAT的配置——配置位置都是在边界路由器的出接口上进行配置 静态NAT 动态NAT——多对多的NAT NAPT——easy IP 多对多的NAPT 端口映射——高级用法 NAT——网络地址转换 IPV4地址不够用 NAT ABC——三类地址中截取了一部分地址&#xff08;并且让这一部分地址可以重复…

MySQL-分库分表详解(一)

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