1.LED点阵屏
思路:配置好时钟,将要显示的数据纵向转换为二进制,写入74HC595之中
main.c文件
#include <REG51.H>
#include "Delay.h"
sbit SER=P3^4; //串行输入端口db
sbit RCK=P3^5; //输出锁存器时钟,即输出时钟
sbit SCK=P3^6; //移位寄存器时钟,即输入时钟
#define MARTIX_LED_PORT P0
/**
* @brief 74HC595写入一个字节
* @param Byte要写入的字节
* @retval
*/
void _74HC595_WriteByte(unsigned char Byte){
unsigned char i;
//依次循环8次向右移位取出每一位
for(i=0;i<8;i++){
//先取出最高(8)位
//1000 0000
//如果Byte最高位为1则等于0x80,为0等于0
SER=Byte&(0x80>>i);
//上升沿位置为1
SCK=1;
//上升沿位后清零
SCK=0;
// //移动第七位
// //0100 0000
// SER=Byte&0x40;
// SCK=1;
// SCK=0;
//
// //移动第六位
// //0010 0000
// SER=Byte&0x20;
// SCK=1;
// SCK=0;
}
//上升沿锁位
RCK=1;
RCK=0;
}
/**
* @brief LED点阵屏显示一列数据
* @param Column要选择的列,范围0~7,0在最左边
* @param Data选择列所显示的数据,高位在上,1为亮
* @retval
*/
void MatrixLED_ShowColum(unsigned char Column,Data){
_74HC595_WriteByte(Data);
//根据按键值右移多少实现指定列的LED闪亮
MARTIX_LED_PORT = ~(0x80>>Column);
//进行位清零
Delay(1);
MARTIX_LED_PORT=0xFF;
}
void main(){
//初始化
SCK=0;
RCK=0;
// _74HC595_WriteByte(0xF0);
while(1){
MatrixLED_ShowColum(0,0x3C);//1010 1010
MatrixLED_ShowColum(1,0x42);
MatrixLED_ShowColum(2,0xA9);
MatrixLED_ShowColum(3,0x85);
MatrixLED_ShowColum(4,0x85);
MatrixLED_ShowColum(5,0xA9);
MatrixLED_ShowColum(6,0x42);
MatrixLED_ShowColum(7,0x3C);
}
}
2.LED点阵屏显示图形和动画
思路:在上面基础之上,设置偏移量和借助取模软件来实现动画
mian.c文件
#include <REGX52.H>
#include "Delay.h"
#include "MatrixLED.h"
//使用取模软件构图
//动画数据
//使用code 将数据放入flash中,但是无法更改flash中的数据
unsigned char code Animation[]={
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xFF,0x90,0x90,0xF0,0x00,0x2F,0x00,0x1E,
0x21,0x21,0x00,0x3F,0x0C,0x12,0x21,0x00,
0x3C,0x42,0x81,0x81,0x81,0x00,0x1E,0x21,
0x21,0x3E,0x01,0x00,0x10,0x3F,0x11,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
};
void main(){
//设置数据偏移亮
unsigned char offset=0,count=0;
//初始化
MatrixLED_Init();
while(1){
//循环显示Animation[]数据
unsigned char i;
for(i=0;i<8;i++){
MatrixLED_ShowColum(i,Animation[i+offset]);
}
count++;
if(count>10){
count=0;
offset++;
if(offset>40){
offset=0;
}
}
}
}
MatrixLED.c文件
#define MARTIX_LED_PORT P0
/**
* @brief 点阵屏初始化
* @param
* @retval
*/
void MatrixLED_Init(){
//初始化
SCK=0;
RCK=0;
}
/**
* @brief 74HC595写入一个字节
* @param Byte要写入的字节
* @retval
*/
void _74HC595_WriteByte(unsigned char Byte){
//依次循环8次向右移位取出每一位
unsigned char i;
for(i=0;i<8;i++){
//先取出最高(8)位
//1000 0000
//如果Byte最高位为1则等于0x80,为0等于0
SER=Byte&(0x80>>i);
//上升沿位置为1
SCK=1;
//上升沿位后清零
SCK=0;
// //移动第七位
// //0100 0000
// SER=Byte&0x40;
// SCK=1;
// SCK=0;
//
// //移动第六位
// //0010 0000
// SER=Byte&0x20;
// SCK=1;
// SCK=0;
}
//上升沿锁位
RCK=1;
RCK=0;
}
/**
* @brief LED点阵屏显示一列数据
* @param Column要选择的列,范围0~7,0在最左边
* @param Data选择列所显示的数据,高位在上,1为亮
* @retval
*/
void MatrixLED_ShowColum(unsigned char Column,Data){
_74HC595_WriteByte(Data);
//根据按键值右移多少实现指定列的LED闪亮
MARTIX_LED_PORT=~(0x80>>Column);
//进行位清零
Delay(1);
MARTIX_LED_PORT=0xFF;
}