前言:
一个简单的8*8点阵点扫描程序;
元件:
AT89C51、MATRIX-8X8、74HC595;51就不介绍了下面简单说一下后面两个:
MATRIX-8X8:一个8*8的LED点阵,上面8个引脚为行7~0,低电平有效;下面8个引脚为列0~7,高电平有效。
74HC595:8位串行输入/输出或者并行输出移位寄存器,具有高阻关断状态,三态。
特点,8位串行输入,8位串行或并行输出,存储状态寄存器,三种状态,输出寄存器可以直接清除,100MHz的移位频率。
移位寄存器和存储器是分别的时钟,数据在SH_CP(11脚)的上升沿输入,在ST_CP(12脚)的上升沿进入的存储寄存器中去。如果两个时钟连在一起,则移位寄存器总是比存储寄存器早--个脉冲。
移位寄存器有一个串行移位输入(Ds,14脚),和一个串行输出(Q7’) ,和一个异步的低电平复位(MR,10脚),存储寄存器有一个并行8位的,具备三态的总线输出,当使能0E(13脚)时(为低电平),存储寄存器的数据输出到总线。
元件图如下:
各行各列值:
u8 Line[8]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe}; //各行
u8 Column[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; //各列
完整电路:
代码:
#include "reg52.h"
#include "intrins.h"
typedef unsigned int u16;
typedef unsigned char u8;
#define COL P0
sbit SHCP = P2^0; //移位寄存器时钟,上升沿有效
sbit STCP = P2^2; //存储寄存器时钟,上升沿有效
sbit DS = P2^1; //串行数据输入
u8 Line[8]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe}; //各行
u8 Column[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; //各列
void delay(u16 i)
{
while(i--);
}
void Hc595SendByte(u8 dat) //向595发送一个数据
{
u8 a;
SHCP = 0; //拉低两个时钟输入
STCP = 0;
for(a=0;a<8;a++) //发送数据
{
DS = dat>>7;
dat<<=1;
SHCP = 1; //产生上升沿脉冲
_nop_();
_nop_();
SHCP = 0;
}
STCP = 1; //产生上升沿脉冲
_nop_();
_nop_();
STCP = 0;
}
void main()
{
u8 i,j;
while(1)
{
for(i=0;i<8;i++) //行扫描row
{
for(j=0;j<8;j++) //列扫描column
{
Hc595SendByte(Line[i]);
COL = Column[j];
delay(10000); //延时100ms
}
delay(10000);
}
// Hc595SendByte(0x7f); //发送一个数据
// P0 = 0x01; //列控制column
}
}
总结:
实现了一个简单的8*8LED点阵的点扫描程序,这里要注意的就是对595的控制,数据、移位寄存器时钟,存储寄存器时钟的控制。
个人学习记录用。
本人知识能力有限,不足之处还请指正!