下 面是LED点阵的一个图形,我们可以清楚的看到,D0~D7是行P00~P07是列,其实这跟
数码管的原理是一样的无非就是我选哪一列,然后让这一列的哪一行的灯亮.
如果我想让第一颗灯亮,怎么做,就先选第一列,P0=0x7F,然后再选第一行D0=0x80,这样第一颗灯就可以亮了
而这个过程也涉及到另外一个芯片74HC595,这个芯片上有三个位SER,SERCLK,RCLK,负责把数据送进来再移位接着再把数据送到D0~D7(注意:测试中发现D0~D7是每一行,而不是每一列),如果我们要给第一列发送数据,首先,SER接受到一个位,SERCLK往下移,也就是上升沿,下面是高位,所以是上升沿,全部移动好之后,RCLK置高电平就会将数据全部送到D0~D7,这是同时发送的。而如果要发送给多列,那就用到级联,所谓级联,就是这个芯片连着另外一个芯片,上面也是有SER,SERCLK,RCLK,我们把这个芯片叫做2号,我们先把数据往2号送,送完了再送给一号,看到下图的1那里引出来一条黑线了吧,那个就是级联下一片.跟瓶子装水水一样,先把底填满,这样才能慢慢往上升,
好了,下面是显示的代码:
#include <REGX52.H>
sbit RCK=P3^5; //RCLK
sbit SCK=P3^6; //SRCLK
sbit SER=P3^4; //SER
void _74HC595_WriteByte(unsigned char Byte)
{
unsigned char i;
for(i=0;i<8;i++)
{
SER=Byte&(0x80>>i);//每次提取最高位
SCK=1; //1为上升沿
SCK=0; //0则关闭上升沿
}
RCK=1;
RCK=0;
}
void MatrixLED_ShowColumn(unsigned char Column,Data)
{
_74HC595_WriteByte(Data); //给行发送数据,比如我想让第几列的哪一行亮
P0=~(0x80>>Column); //P0口那里是0才能驱动,所以这里加了个取反,表示选第几列
}
void main()
{
SCK=0; //因为上单片机上电为1,所以要初始化为0;因为上电不用移位,1为移位,0不移位
RCK=0; //因为上单片机上电为1,所以要初始化为0;因为上电不用发送数据,1为发送数据,0则不是
MatrixLED_ShowColumn(0,0xAA);
while(1)
{
}
}
下图是显示结果
#include <REGX52.H>
sbit RCK=P3^5; //RCLK
sbit SCK=P3^6; //SRCLK
sbit SER=P3^4; //SER
#define MATRIX_LED_PORT P0
void Delayms(unsigned int xms) //@11.0592MHz
{
unsigned char i, j;
while(xms--)
{
i=2;
j=239;
do
{
while(--j);
}while(--i);
}
}
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;
}
void MatrixLED_ShowColumn(unsigned char Column,Data)
{
_74HC595_WriteByte(Data);
MATRIX_LED_PORT=~(0x80>>Column);
Delayms(1);
MATRIX_LED_PORT=0XFF;
}
void main()
{
SCK=0;
RCK=0;
while(1)
{
MatrixLED_ShowColumn(0,0x3C);
MatrixLED_ShowColumn(1,0x42);
MatrixLED_ShowColumn(2,0xA9);
MatrixLED_ShowColumn(3,0x85);
MatrixLED_ShowColumn(4,0x85);
MatrixLED_ShowColumn(5,0xa9);
MatrixLED_ShowColumn(6,0x42);
MatrixLED_ShowColumn(7,0x3C);
}
}
下图是显示结果:
#include <REGX52.H>
sbit RCK=P3^5; //RCLK
sbit SCK=P3^6; //SRCLK
sbit SER=P3^4; //SER
#define MATRIX_LED_PORT P0
unsigned char LEDShow[]=
{
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xFF,0x08,0x08,0x08,0xFF,0x00,0x0E,0X15,
0x15,0x15,0x08,0x00,0x7E,0x01,0x02,0X00,
0x7E,0x01,0x02,0x00,0x0E,0x11,0x11,0X0E,
0x00,0x7D,0x00,0x00,0x00,0x00,0x00,0X00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
};
void Delayms(unsigned int xms) //@11.0592MHz
{
unsigned char i, j;
while(xms--)
{
i=2;
j=239;
do
{
while(--j);
}while(--i);
}
}
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;
}
void MatrixLED_ShowColumn(unsigned char Column,Data)
{
_74HC595_WriteByte(Data);
MATRIX_LED_PORT=~(0x80>>Column);
Delayms(1);
MATRIX_LED_PORT=0XFF; //没有这两句发送数据可能会发送到上一列,从而发生错误
}
void main()
{
unsigned char i,offset=0,count=0;
SCK=0; //因为上单片机上电为1,所以要初始化为0;
RCK=0;
while(1)
{
for(i=0;i<8;i++)
{
MatrixLED_ShowColumn(i,LEDShow[i+offset]);
}
count++;
if(count>10)
{
count=0;
offset++;
if(offset>40)
{
offset=0;
}
}
}
}
下图是显示结果:
显示
微信技术交流