51单片机——LED 点阵点亮一个点,小白详解

LED点阵介绍:

       LED点阵是由发光二极管排列组成的显示器件,在我们生活中的电器中随处可见,被广泛用于汽车报站器,广告屏等。

        通常用用较多的是8*8点阵,然后使用多个8*8点阵组成不同分辨率的LED点阵显示屏,比如16*16点阵可以使用4个8*8点阵构成。因此理解了8*8LED点阵的工作原理,器他分辨率的LED点阵显示屏都一样的。

        8*8点阵共有64个发光二极管组成,且每个发光二极管是放置在行线和列线的交叉点上,当对应的某一行置1电平,某一列置0电平,则相应的二极管就亮;如果将要左上角第一个点点亮亮,则1脚高电平a脚低电平,则第一个点就亮了;如果将要第一行点亮,则第 1 脚要接高电平,而(a、b、c、d、e、f、g、h )这些 引脚接低电平,那么第一行就会点亮;如要将第一列点亮,则第 a 脚接低电平, 而(1、2、3、4、5、6、7、8)接高电平,那么第一列就会点亮。

LED硬件设计

使用的的资源有:①8*8LED点阵模块,②74HC595 模块

74HC595 模块、8*8LED 点阵模块电路如下:

        从上图中可以看出,74HC595需要用到的控制管脚是,SER、RCLK、SRCLK直接连接到51单片机的P3.4-P3.6 IO 口上,输出端则是直接连接到LED点阵模块的行端口上,即为LED发光二极管的阳极,LED点阵的列则为发光二极管的阴极。

        想要 控制LED点阵,可以以将单片机管脚按照74HC595 芯片的通信时序要求来 传输数据,这样即可控制LED点阵的行的数据,根据LED发光二极管的导通原理,当阳极为高电平,阴极为低电平则点亮,否则熄灭。因此通过单片机P0端口控制点阵列,74HC595可控制点阵行。

        如果要点亮左上角的一个点,那就需要P07这一列为低电平,其余列是高电平,DPh这一行为高电平,其余行为低电平。那P07--P00口输出就是 0111 1111(ox7f),DPh-DPa输出就是1000 0000(0x80)

软件设计如下:(74HC595部分和ID拓展的代码一样,但是RCLK时序有所改变,要让RCLK下降有效,之前是(rCLK=0,rCLK=1)更改成(rCLK=0,rCLK=1,rCLK=0)或者(rCLK=1,rCLK=0)这里为啥要更换,之前为啥不用,我也没有搞明白哦,知道的同学告诉我,谢谢!

/********************************************************************
****************** 实验名称:IO 扩展(串转并)实验-74HC595
接线说明
实验现象:下载程序后,8*8LED 点阵以一行循环滚动显示
注意事项:LED 点阵旁的 J24 黄色跳线帽短接到 GND 一端
*********************************************************************
******************/
#include "reg52.h"
typedef unsigned int u16; //对系统默认数据类型进行重定义
typedef unsigned char u8;
//定义 74HC595 控制管脚
sbit SRCLK=P3^6; //移位寄存器时钟输入
sbit rCLK=P3^5; //存储寄存器时钟输入
sbit SER=P3^4; //串行数据输入
#define LEDDZ_COL_PORT P0 //宏定义LED点阵列控制端口
/********************************************************************
***********
* 函 数 名 : delay_10us
* 函数功能 : 延时函数,ten_us=1 时,大约延时 10us
* 输 入 : ten_us
* 输 出 : 无
*********************************************************************
**********/
void delay_10us(u16 ten_us)
{
    while(ten_us--);
}
/********************************************************************
***********
* 函 数 名 : delay_ms
* 函数功能 : ms 延时函数,ms=1 时,大约延时 1ms
* 输 入 : ten_us
* 输 出 : 无
* for(j=110;j>0;j--)在for(i=ms;i>0;i--)嵌套这,delay_ms(500),
* 时候ms=500,i=ms 所以i=500,进入for(i=ms;i>0;i--),
* 然后在执行for(j=110;j>0;j--),进行循环110次一直到j=0,
* 在退出for(j=110;j>0;j--),
* 在重新执行for(i=ms;i>0;i--),一直到到i=0时候,退出for(i=ms;i>0;i--)
*********************************************************************
**********/
void delay_ms(u16 ms)
{
    u16 i,j;
    for(i=ms;i>0;i--)
        for(j=110;j
  • 5
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

生活就是抡大锤

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值