🎊专栏【51单片机】
🍔喜欢的诗句:更喜岷山千里雪 三军过后尽开颜。
🎆音乐分享【Waiting For Love】
大一同学小吉,欢迎并且感谢大家指出我的问题🥰
目录
🍔74HC595图片
🍔74HC595原理
🍔”上升沿“是什么意思
🎆LED点阵屏显示图形
🎈现象
🎈代码(三部分)
main.c
Delay.c
Delay.h
🎈代码分析
建议小白仔细阅读下面的内容
🍔74HC595有两种,一种是接高电平的,一种是接低电平的
下面进行讲解
🍔接高电平
🍔原理
给SERCLK这个上升沿移位给低电平(因为上电的时候默认是高电平):比如给SER输入一个值(第一个值是最高位),然后再给上升沿一位给高电平,进行移位,当给最到满了给上升沿锁存放置高电平,存放在右边,
QH’指的是多片级联,如果超过8位的时候就使用这个多片级联,这样就可以实现三位控制八位,十六位,三十二位等等这种,大大节省了io口,常常用于io口的扩展。
刚开始是空的,然后后面会从SER口传入数据
RCLK有什么用呢
看下图
就是把左边的复制到右边去,进行存储
如果存满了,还从SER口传入数据 ,会怎么样呢
会从右边的QH',再开辟一个空间进行存储
🍔”上升沿“是什么意思
在数字电路中,“上升沿”是指当一个数字信号由低电平变为高电平的瞬间。也就是说,在上升沿之前这个信号的电平始终是低电平,在上升沿之后这个信号的电平就变成了高电平。
与“上升沿”相对应的是“下降沿”,即当一个数字信号由高电平变为低电平的瞬间。在下降沿之前这个信号的电平始终是高电平,在下降沿之后这个信号的电平就变成了低电平。
在数字电路中,上升沿和下降沿通常被用作时序分析和时序控制的基础。比如,在移位寄存器中,时钟脉冲的上升沿通常被用来控制数据的向寄存器内部移动。当时钟脉冲发生上升沿时,数据就会被“锁存”到寄存器内部,然后在下一个时钟周期内再根据时钟脉冲的控制进行移位操作。
文章来源地址https://www.toymoban.com/news/detail-431620.html
🎆LED点阵屏显示图形
🎈现象
🎈代码(三部分)
main.c
#include <REGX52.H>
#include "Delay.h"
sbit RCK=P3^5; //RCLK
sbit SCK=P3^6; //SRCLK
sbit SER=P3^4; //SER
#define MATRIX_LED_PORT P0
/**
* @brief 74HC595写入一个字节
* @param Byte 要写入的字节
* @retval 无
*/
void _74HC595_WriteByte(unsigned char Byte)
{
unsigned char i;
for(i=0;i<8;i++)
{
SER=Byte&(0x80>>i);
SCK=1;
SCK=0;
}
RCK=1;
RCK=0;
}
/**
* @brief LED点阵屏显示一列数据
* @param Column 要选择的列,范围:0~7,0在最左边
* @param Data 选择列显示的数据,高位在上,1为亮,0为灭
* @retval 无
*/
void MatrixLED_ShowColumn(unsigned char Column,Data)
{
_74HC595_WriteByte(Data);
MATRIX_LED_PORT=~(0x80>>Column);
Delay(1);
MATRIX_LED_PORT=0xFF;
}
void main()
{
SCK=0;
RCK=0;
while(1)
{
MatrixLED_ShowColumn(0,0x3C);
MatrixLED_ShowColumn(1,0x42);
MatrixLED_ShowColumn(2,0xA9);
MatrixLED_ShowColumn(3,0x85);
MatrixLED_ShowColumn(4,0x85);
MatrixLED_ShowColumn(5,0xA9);
MatrixLED_ShowColumn(6,0x42);
MatrixLED_ShowColumn(7,0x3C);
}
}
Delay.c
void Delay(unsigned int xms)
{
unsigned char i, j;
while(xms--)
{
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
}
}
不明白这一段代码怎么写的同学建议看一下这一篇博客
【51单片机】使用STC烧录软件自动生成延时代码_在下小吉.的博客-CSDN博客
Delay.h
#ifndef __DELAY_H__
#define __DELAY_H__
void Delay(unsigned int xms);
#endif
🎈代码分析
建议小白仔细阅读下面的内容
🍔接低电平
因为接的是低电平,所以和第一种情况刚好相反
在上升沿之后这个信号的电平就变成了低电平(高电平 —>低电平)
所以
void Hc595SendByte(u8 dat1,u8 dat2,u8 dat3,u8 dat4)
{
u8 a;🏳️🌈SRCLK = 1;
🏳️🌈RCLK = 1;for(a=0;a<8;a++) //发送8位数
{
SER = dat1 >> 7; //从最高位开始发送
dat1 <<= 1;🎈SRCLK = 0; //发送时序
_nop_();
_nop_();
🎈SRCLK = 1;
}
🎊RCLK = 0;
_nop_();
_nop_();
🎊RCLK = 1;
}
刚好相反
🍔现象
🍔连线
🍔代码例子以及分析
/**************************************************************************************
LED点阵--点亮一个点实验
实现现象:下载程序后,LED点阵左上角第一个点的LED被点亮果
注意事项:必须将74HC595模块的JP595短接片短接,否则不会出现现象
***************************************************************************************/
#include "reg51.h" //此文件中定义了单片机的一些特殊功能寄存器
#include "intrins.h"
typedef unsigned int u16; //对数据类型进行声明定义
typedef unsigned char u8;
//--定义使用的IO口--//
sbit SRCLK=P3^6;
sbit RCLK=P3^5;
sbit SER=P3^4;
/*******************************************************************************
* 函 数 名 : Hc595SendByte(u8 dat1,u8 dat2,u8 dat3,u8 dat4)
* 函数功能 : 通过595发送四个字节的数据
* 输 入 : dat1:第4个595输出数值
* * dat2: 第5个595输出数值
* * dat3:第2个595输出数值
* * dat4:第1个595输出数值
* 输 出 : 无
*******************************************************************************/
void Hc595SendByte(u8 dat1,u8 dat2,u8 dat3,u8 dat4)
{
u8 a;
SRCLK = 1;
RCLK = 1;
for(a=0;a<8;a++) //发送8位数
{
SER = dat1 >> 7; //从最高位开始发送
dat1 <<= 1;
SRCLK = 0; //发送时序
_nop_();
_nop_();
SRCLK = 1;
}
for(a=0;a<8;a++) //发送8位数
{
SER = dat2 >> 7; //从最高位开始发送
dat2 <<= 1;
SRCLK = 0; //发送时序
_nop_();
_nop_();
SRCLK = 1;
}
for(a=0;a<8;a++) //发送8位数
{
SER = dat3 >> 7; //从最高位开始发送
dat3 <<= 1;
SRCLK = 0; //发送时序
_nop_();
_nop_();
SRCLK = 1;
}
for(a=0;a<8;a++) //发送8位数
{
SER = dat4 >> 7; //从最高位开始发送
dat4 <<= 1;
SRCLK = 0; //发送时序
_nop_();
_nop_();
SRCLK = 1;
}
RCLK = 0;
_nop_();
_nop_();
RCLK = 1;
}
void main()
{
Hc595SendByte(0xff,0xfe,0x00,0x01);
while(1)
{
}
}
🍔注意
必须将74HC595模块的JP595短接片短接,否则不会出现现象
就是下图的东西
🥰如果大家有不明白的地方,或者文章有问题,欢迎大家在评论区讨论,指正🥰文章来源:https://www.toymoban.com/news/detail-431620.html
到了这里,关于【51单片机】LED点阵屏的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!