问题:595芯片不好用,怎么用呢?
解决:
第一步:看引脚功能图
一行一行看,Q0-Q7,并行输出,这个就是输出口,GND不用说,Q7是串行输出,MR复位不用管它,SHCP移位寄存器时钟,STCP存储寄存器时钟,OE输出低电平有效,DS串行输入,VCC。
第二步:用法
想要用它必备条件是GND、VCC、OE口接GND,然后将需要传输的数据送入DS口,此时SHCP要给一个上升沿,因为只能串行输入,所以必须一位一位的输入,一位一位的移动,循环执行八次,为一字节,输出的时候,STCP口给一个上升沿,Q0-Q7口便并行输出8位。
第三步:具体实现
硬件图:
软件:
#include <reg52.h>
#define DIANZHEN P0
sbit SER=P3^4;//串行输入
sbit RCLK1=P3^5;//存储寄存器,上升沿八位并行输出
sbit SRCLK=P3^6;//移位寄存器,上升沿串行输入(高位先输入)。
typedef unsigned int u16;
typedef unsigned char u8;
u8 dianzhen_hang[]={0x38,0x7C,0x7E,0x3F,0x3F,0x7E,0x7C,0x38};
u8 dianzhen_lie[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
u8 num_1,num_2;
void delay(u16 num)
{
while(num--);
}
void HC595(u8 dat)
{
for(num_1=0;num_1<8;num_1++)
{
SER=dat>>7;
dat=dat<<1;
SRCLK=0;
delay(1);//有个上升沿信号就可以,时间不要太长
SRCLK=1;
delay(1);
}
RCLK1=0;
delay(1);
RCLK1=1;//控制并行输出
}
void main()
{
DIANZHEN=0x00;
while(1)
{
for(num_2=0;num_2<8;num_2++)
{
DIANZHEN=dianzhen_lie[num_2];
HC595(dianzhen_hang[num_2]);
delay(100);
HC595(0x00);//因为是动态扫描,这样做可以更加准确的显示,因为LED灯有余光,不关掉会影响显示。
}
}
}