LED点阵图与数码管一样,有两种接法,共阴极和共阳极,不同的接法有不同的电路结构。本次使用的是共阴极连接。(将P0=0x80,利用74HC595寄存器可以单独控制P07列哪一盏灯亮)
通过74HC595控制LED点阵图
点亮矩阵电路中那颗/几颗灯,就是段选跟位选的过程
74HC595寄存器配置
Led.c
#include "Led.h"
#include <REGX52.H>
#include "Delay.h"
sbit RLK=P3^5;//RCLK P3=0XB0 0XB0^5=0XB5 =P3_5 存储寄存器时钟
sbit SCK=P3^6;//SERCLK 移位寄存器
sbit SER=P3^4;//SER 串行数据
void Led_Init()//初始化
{
SCK=0;
RLK=0;
}
void _74HC595_WriteByte(unsigned char Byte)//写入一个字节
{
unsigned char i;
for(i=0;i<8;i++) //函数循环8次 (8位寄存器)
{
SER=Byte&(0X80>>i);//非0即1 每运行1次,数据整体右移1位
SCK=1;//SCK移位寄存器上升沿时 SER数据写入移位寄存器
SCK=0;
}
RLK=1;//RLK存储寄存器上升沿时,数据从移位寄存器转存储存寄存器
RLK=0;//置0
}
void LED_Show(unsigned char Column,Data)// 列(位选) 行(段选
{
_74HC595_WriteByte(Data);//段选 通过74hC595串行数据口SER控制
P0=~(0X80>>Column);//位选,通过向右移位的方式控制点阵屏的8列
Delay(1);
P0=0XFF;//消影
}
Led.h
#ifndef __LED_H__
#define __LED_H__
void LED_Show(unsigned char Column,Data);
void Led_Init();
#endif
main.c
#include <REGX52.H>
#include "Delay.h"
#include "Led.h"
//显示图像数组地址
unsigned char code TuRam[]=
{
0x00,0x00,0x20,0x11,0x12,0x7C,0x7F,0x18,//1帧
0x00,0x00,0x08,0x11,0x12,0x7C,0x7F,0x30,
0x00,0x20,0x11,0x12,0x7E,0x7F,0x18,0x00,
0x00,0x08,0x11,0x12,0x7E,0x7F,0x10,0x30,
};
void main()
{
unsigned char i,offset,count;
Led_Init();//led点阵屏初始化
while(1)
{
for(i=0;i<8;i++)
{
LED_Show(i,TuRam[i+offset]);//i+偏移量 offset 1个1个刷新
}
count++;
// 扫描8次,当count>8 offset++偏移1位。
//相当于定时器作用,也可以在timer中 配置时间让offset++代替
if(count>8)
{
count=0;
offset+=8;//offset可以偏移多少位由实际显示内容设置 所显示为8*8 一帧图片一帧传
if(offset>24)
{
offset=0;
}
}
}
}
C51的sfr、sbit 定义使用
将数据放在flash里面,用来避免内存被消耗过多,但这种数据是不能更改的,方法如下:
将:unsigned char TuRam[]
改为:unsigned char code TuRam[]