LED点阵屏的应用(STC89c52为例)

LED点阵屏

LED点阵屏介绍

  • 因为字节是8位,所以显示的像素是8的倍数 在这里插入图片描述

显示原理

  • 比如说我们的双色点灯,它供阴和供阳结构就不一样 在这里插入图片描述

  • 需要运用到这两个寄存器来控制LED点阵 在这里插入图片描述

74HC595寄存器

  • 当字母上面带有小横线就表示是对低电平有效或者下降沿的意思

  • RCLK:表示寄存器时钟

  • SRCR:表示清零端串行清零

  • QH’:这个引脚是用来多片集连 在这里插入图片描述

  • 这三个线可以控制8根线,可以给以为寄存器输入

  • 左边的为移位寄存器

  • 右边的为输出缓存

  • SERCLK:需要先设置为低电频,然后在给入一个高电频

  • 当最后的时候给RCK一个高电平将移位寄存器的信息传入输出缓存

  • 可以在这里接一个三极管,增强其驱动能力
    在这里插入图片描述

书写代码

sbit和sfr的用法 在这里插入图片描述

  • 这个是sfr的声明作用(底下也是其对应的地址)
  • sfr是同时控制8位的值进行声明(P0),而sbit只能控制1位上的(如P0^0)
  • 可位寻址 是可以对一个八位的数据,每一位单独操作,不可位寻址 是只能用到后面的式子,但不能直接对其位进行操作
  • &= 是用于清零操作的
  • |= 是用来进行赋1操作
  • ^= 是用于取反 在这里插入图片描述

书写方法

74HC595的操作方法
  • 先给SER赋值(先输入的值是最后给QH)
  • 先取Byte的最高位就需要&上0x80(可以用for函数进行优化)
  • 然后可以试一下中断74HC595的测试灯(没有灯的话可以在74HC595的函数里面加一句P2=~Byte)
    在这里插入图片描述
准备点亮点阵屏
  • 对比前面数码管的代码,发现这里需要用到Delay()函数
  • 之后给数码管选择列,然后配合74HC595,点亮LED点阵
  • 下面是产生残影的原因
    在这里插入图片描述
  • 解决方法如下:
  • 先要画图可以借用Excel表格来弄代码

LED显示动画

  • 做动画的话,就需要数组了
  • 放完一个动画就需要偏移一下

——————————————————————

  • 首先定义一个数组存长条形的动画
  • 可以利用文字取模软件来生成对应文字

完整代码(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;
/*
  SER=Byte&0x80;//首先将最高位赋值给SER(这里非0即1)
  SCK=1;//表示一个上升沿
  SCK=0;//为下一次移位做准备
  SER=Byte&0x40;//首先将次位赋值给SER(这里非0即1)
  SCK=1;
  SCK=0;
  SER=Byte&0x20;//首先将第三位赋值给SER(这里非0即1)
  SCK=1;
  SCK=0;
  SER=Byte&0x10;
  SCK=1;
  SCK=0;
  SER=Byte&0x08;
  SCK=1;
  SCK=0;
  SER=Byte&0x04;
  SCK=1;
  SCK=0;
  SER=Byte&0x02;
  SCK=1;
  SCK=0;
  SER=Byte&0x01;
  SCK=1;
  SCK=0;
*/
} 

/**
  * @brief LED点阵屏显示一列数据
  * @param    Column 要显示的列,范围0~7,0在最左边
  * @param    Column 选择列显示的数据,高位在上,1为亮,0为灭
  * @retval  无
  */
void MatrixLED_ShowColumn(unsigned char Column,Data)//矩阵LED,Column的值是0-7
{
  _74HC595_WriteByte(Data);//先选择列
  MATRIX_LED_PORT=~(0x80>>Column);//给0的时候选择,给1的时候不选择
  Delay(1);
  MATRIX_LED_PORT=0xFF;
}
void main(){
  SCK=0;
  RCK=0;

	while(1){
    MatrixLED_ShowColumn(0,0x38);
    MatrixLED_ShowColumn(1,0x44);
    MatrixLED_ShowColumn(2,0x84);
    MatrixLED_ShowColumn(3,0x23);
    MatrixLED_ShowColumn(4,0x23);
    MatrixLED_ShowColumn(5,0x84);
		MatrixLED_ShowColumn(6,0x44);
    MatrixLED_ShowColumn(7,0x38);
    
	}
}

//Delay.c

void Delay(unsigned int xms)	
{	while(xms--){
	unsigned char data i, j;

	i = 2;
	j = 239;
	do
	{
		while (--j);
	} while (--i); }
}

//Delay.h

#ifndef __DELAY_H__
#define __DELAY_H__
	void Delay(unsigned int xms);
#endif

完整代码(LED点阵显示动画)

//main.c

#include <REGX52.H>
#include "Delay.h"
#include "MatrixLED.h"

unsigned char code Animation[]={//定义一个数组用来存动画//如果放在flash里就加一个code 内存比较大//这个是只可以读写不可以写入的
0x00,0x00,0xFE,0x10,0x08,0xFC,0x8A,0x88,0x88,0xF8,0x00,0x00,0x10,0x10,0xFE,0x10,
0x10,0x10,0x7C,0x00,0x08,0x10,0xFE,0x82,0x7C,0x10,0x7C,0x10,0x10,0x10,0x18,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
};
unsigned char i,offset=0,Count=0;//offset是为了表示移位
void main(){
  MaxirLED_Init();
  
	while(1){
    for(i=0;i<8;i++){
    MatrixLED_ShowColumn(i,Animation[i+offset]);
    }
    //这里不能直接用Delay函数(因为需要不断的进行扫描),那就需 黄海越 要来计次,也可以用定时器来实现每个一段时间进行++
    Count++;
    if(Count>10)
      {
        Count=0;
        offset++;
        if(offset>24){//防止溢出
          offset=0;
        }
      }
  }
}

//MatrixLED.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;
/*
  SER=Byte&0x80;//首先将最高位赋值给SER(这里非0即1)
  SCK=1;//表示一个上升沿
  SCK=0;//为下一次移位做准备
  SER=Byte&0x40;//首先将次位赋值给SER(这里非0即1)
  SCK=1;
  SCK=0;
  SER=Byte&0x20;//首先将第三位赋值给SER(这里非0即1)
  SCK=1;
  SCK=0;

*/
} 

/**
  * @brief 点阵屏初始化
  * @param    无
  * @retval  无
  */
void MaxirLED_Init(){
    SCK=0;
    RCK=0;

}


/**
  * @brief LED点阵屏显示一列数据
  * @param    Column 要显示的列,范围0~7,0在最左边
  * @param    Column 选择列显示的数据,高位在上,1为亮,0为灭
  * @retval  无
  */
void MatrixLED_ShowColumn(unsigned char Column,Data)//矩阵LED,Column的值是0-7
{
  _74HC595_WriteByte(Data);//先选择列
  MATRIX_LED_PORT=~(0x80>>Column);//给0的时候选择,给1的时候不选择
  Delay(1);
  MATRIX_LED_PORT=0xFF;
}
//MatrixLED.h

#ifndef __MATRIXLED_H__
#define __MATRIXLED_H__
  void MaxirLED_Init();
  void MatrixLED_ShowColumn(unsigned char Column,Data);
  

#endif
//Delay.h

#ifndef __DELAY_H__
#define __DELAY_H__
	void Delay(unsigned int xms);
#endif
//Delay.c

void Delay(unsigned int xms)	
{	while(xms--){
	unsigned char data i, j;

	i = 2;
	j = 239;
	do
	{
		while (--j);
	} while (--i); }
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

LYPHARD MELODY。

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

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

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

打赏作者

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

抵扣说明:

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

余额充值