目录
1、main.c
#include <REGX52.H>
#include "MatrixLED.h"
#include "Delay.h"
typedef unsigned char u8;
//动画数据
u8 code Animatioin[] = {0x78,0xFC,0x7E,0x3F,0x7E,0xFC,0x78,0x00,
0x70,0xF8,0x7C,0x3E,0x7C,0xF8,0x70,0x00,
0x60,0xF0,0x78,0x3C,0x78,0xF0,0x60,0x00,
0x40,0xE0,0x70,0x38,0x70,0xE0,0x40,0x00,
0x78,0xFC,0x7E,0x3F,0x7E,0xFC,0x78,0x00,};
void main()
{
u8 n, offset, count;
MatrixLED_Init();
while(1)
{
for(n = 0; n < 8; n++) //循环8次,显示8列数据
{
MatrixLED_ShowColumn(n, Animatioin[n + offset]);
}
count++; //计次延时
if(count > 10) //扫描10遍,相当于延时
{
count = 0;
offset += 8; //偏移+8,切换下一帧画面
if(offset > 32) //在第32位时跳帧
{
offset = 0;
}
}
}
}
2、MatrixLED.c
#include <REGX52.H>
#include "Delay.h"
#define MATRIX_LED_PORT P0
typedef unsigned char u8;
sbit SER = P3^4; //SER 串行数据输入端口,用于接收要移位到寄存器的数据
sbit RCK = P3^5; //PCLK 存储寄存器时钟输入,上升沿时移位寄存器的数据进入数据存储寄存器,下降沿时存储寄存器数据不变。
sbit SCK = P3^6; //SRCLK 移位寄存器时钟输入,上升沿时数据寄存器的数据移位
/**
* @brief 74HC595写入一个字节
* @param 要写入的字节
* @retval 无
*/
void _74HC595_WriteByte(unsigned char Byte)
{
u8 i = 0;
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为亮
* @retval 无
*/
void MatrixLED_ShowColumn(unsigned char Column, Data)
{
_74HC595_WriteByte(Data); //段选,选择内容,高电平选中
MATRIX_LED_PORT = ~ (0x80 >> Column); //位选,选择位置,低电平选中
Delay(1);
MATRIX_LED_PORT = 0xFF; //消影
}
/**
* @brief 点阵屏初始化
* @param 无
* @retval 无
*/
void MatrixLED_Init()
{
SCK = 0;
RCK = 0;
}
3、MatrixLED.h
#ifndef __MatrixLED_H__
#define __MatrixLED_H__
void MatrixLED_ShowColumn(unsigned char Column, Data);
void MatrixLED_Init();
void _74HC595_WriteByte(unsigned char Byte);
#endif
4、Delay.c
void Delay(unsigned int xms)
{
unsigned char i, j;
while(xms--)
{
i = 2;
j = 199;
do
{
while (--j);
} while (--i);
}
}
5、Delay.h
#ifndef __DELAY_H__
#define __DELAY_H__
void Delay(unsigned int xms);
#endif
注意
跳线帽连接OE和GND