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); }
}