9-1 点阵LED
LED点阵模块原理图
一共有8*8=64个LED。通过行(DP)和列(P0)一起控制选择LED。其中行(DP)要通过74HC595(串转并)模块进行转换才能选择,类似38译码器。
74HC595模块原理图
74HC595 工作原理
以下是将8位DP赋值的过程:在SER中输入1,然后上升沿移位SERCLK给1(默认0),高电平会让SER的数据下移,下移后将SERCLK清零,归零到默认状态,接着继续给SER赋值,循环操作8次后,就存了8位数据。最后将上升沿锁存RCLK给1(默认0),左边的数据就会赋给LED点阵中对应的列序号(DP)。
- 数据的高位在下,低位在上。下图中应为1010 0000
9-1 LED点阵显示固定图像
初始化后74HC595的接口SER,SERCLK和RCLK都为1,需要清零后才能顺利执行
把8位填充用代码
-
行选与列选:点阵LED的行给1就会亮,给0会灭。列是以0为选中。注意行与列的区别。(一列+多行 控制一列的灯亮,亮完后行 列要清零,否则下一次选择行列会出现上一次的数据就会错乱)
-
快速按照8列进行赋值:1段选 位选 2(延时 位清零)段选 位选 …………8 (延时 位清零)段选 位选
程序结果图 第五行的前四个灯亮(可以根据自己需要显示的灯 进行调用LED_ShowColumn(unsigned char column,unsigned char Data),按列显示,一共需要8次调用)
main代码如下
#include <REGX52.H>
#include "Delay.h"
sbit RCK=P3^5; //上升沿锁存 (RCLK用符号指向L口,方便写代码)
sbit SRCLK=P3^6; //SRCLK ,上升沿
sbit SER=P3^4; //SER
/**
* @brief //通过74HC595来选择LED点阵的 多行,行以值1为亮
* @param //要输入的数据
* @retval //无
*/
void _74HC595_Write(unsigned char Byte)
{
int i=0;
for(i=0;i<8;i++)
{
SER=Byte&(0x80>>i);
SRCLK=1; //所有数据向下移一位
SRCLK=0; //清零
}
RCK=1; //数据锁存
RCK=0; //清零
}
/**
* @brief 选中LED点阵的 1列,按列显示
* @param column 要选择的列,范围:1~8,选中1~8列,第一列在左边
* @param data 要显示的 行
* @retval
*/
void LED_ShowColumn(unsigned char column,unsigned char Data)
{
_74HC595_Write(Data); //显示该列要亮的每一行
P0=~(0x80>>(column-1)); //选中列(ps:P0是列选择字段 8位=1字节,从左到右,P0_7是第一位,字段0为选中列)
Delay(1);
P0=0xff; //列选清零(ps:准备下一次选行列不会出现上次数据的混乱)
}
void main()
{
RCK=0; //锁存清零
SRCLK=0; //开始要清零才能操作,因为L口会自己初始化为1
while(1)
{
LED_ShowColumn(5,0xf0); //(ps:在循环内一直显示,否侧会被清零)
}
}
Delay.c代码如下
#include <REGX52.H>
void Delay(int num) //@12.000MHz
{
unsigned char i, j;
while(num--){
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
}
}
void ShowLed(int led,int number)
{
char exchange[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
switch(led) //
{
case 1:P2_4=0 ;P2_3=0 ;P2_2=0 ;break;
case 2:P2_4=0 ;P2_3=0 ;P2_2=1 ;break;
case 3:P2_4=0 ;P2_3=1 ;P2_2=0 ;break;
case 4:P2_4=0 ;P2_3=1 ;P2_2=1 ;break;
case 5:P2_4=1 ;P2_3=0 ;P2_2=0 ;break;
case 6:P2_4=1 ;P2_3=0 ;P2_2=1 ;break;
case 7:P2_4=1 ;P2_3=1 ;P2_2=0 ;break;
case 8:P2_4=1 ;P2_3=1 ;P2_2=1 ;break;
}
P0=exchange[number];
Delay(1);
P0=0X00;
}
Delay.h代码如下
#include<stdio.h>
void ShowLed(int led,int number);
void Delay(int num);
9-2 LED流动图
原理解释
要输出下面这个图像(HELLO)流动,就要存入一个数组,数组存放了每一帧的图像,每一帧的图像显示的行+列都记录在数组对应位置中,循环数组即可.(有软件提供,可以不用自己写)
使用软件生成数组
/– 调入了一幅图像:这是您新建的图像 –/
/– 宽度x高度=32x8 –/
0x00,0x00,0x00,0xFF,0x99,0x99,0xDB,0x7E,0x00,0x00,0x00,0x00,0xFF,0x81,0x81,0xC3,
0xE7,0x00,0x00,0x00,0x00,0x00,0xFF,0x81,0x81,0x42,0x3C,0x00,0x00,0x00,0x00,0x00,
main代码如下
#include <REGX52.H>
#include "LED_Show.h"
sbit RCK=P3^5; //上升沿锁存 (RCLK用符号指向L口,方便写代码)
sbit SRCLK=P3^6; //SRCLK ,上升沿
sbit SER=P3^4; //SER
char H[]={0x00,0x00,0x00,0xFF,0x99,0x99,0xDB,0x7E,0x00,0x00,0x00,0x00,0xFF,0x81,0x81,0xC3,
0xE7,0x00,0x00,0x00,0x00,0x00,0xFF,0x81,0x81,0x42,0x3C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x99,0x99,0xDB,0x7E,0x00,0x00,0x00,0x00,0xFF,0x81,0x81,0xC3,
0xE7,0x00,0x00,0x00,0x00,0x00,0xFF,0x81,0x81,0x42,0x3C,0x00,0x00,0x00,0x00,0x00,
};
void main()
{
unsigned char i,Offset=0,Count=0;
RCK=0; //锁存清零
SRCLK=0; //开始要清零才能操作,因为L口会自己初始化为1
while(1)
{
for(i=0;i<8;i++)
{
LED_ShowColumn(i,H[i+Offset]);
}
Count++; //扫描后会灭,要保持不停的快速扫描
if(Count>15)
{
Count=0;
Offset++;
if(Offset==32)
{
Offset=0;
}
}
}
}
LED_Show.C
#include <REGX52.H>
#include "Delay.h"
sbit RCK=P3^5; //上升沿锁存 (RCLK用符号指向L口,方便写代码)
sbit SRCLK=P3^6; //SRCLK ,上升沿
sbit SER=P3^4; //SER
/**
* @brief //通过74HC595来选择LED点阵的 多行
* @param //要输入的数据
* @retval //无
*/
void _74HC595_Write(unsigned char Byte)
{
int i=0;
for(i=0;i<8;i++)
{
SER=Byte&(0x80>>i);
SRCLK=1; //所有数据向下移一位
SRCLK=0; //清零
}
RCK=1; //数据锁存
RCK=0; //清零
}
/**
* @brief 选中LED点阵的 1列,按列显示
* @param column 要选择的列,范围:1~8,选中1~8列,第一列在左边
* @param data 要显示的 行
* @retval
*/
void LED_ShowColumn(unsigned char column,unsigned char Data)
{
Delay(1);
P0=0xff; //列选清零
_74HC595_Write(Data); //显示该列要亮的每一行
P0=~(0x80>>(column-1)); //P0是列选择字段 8位=1字节,从左到右,P0_7是第一位,字段0为选中列
}