HC595芯片介绍:
74HC595可以节省IO口,实现串行转并行。注意传送数据的顺序,先传送的比特后移到移位寄存器的高位,所以要先传送数据的高位。
Q0~Q7 | 并行输出口 |
Q7' | 串行数据出口引脚。当移位寄存器中的数据多于8bit时,会把已有的bit“挤出去”,就是从这里出去的。用于595的级联。 |
SH_CP(shift register) | 时钟控制输入,上升沿触发移位寄存器后移一位,接收新的比特 |
ST_CP (storage register) | 时钟控制,上升沿触发移位寄存器的数据转存到存储寄存器 |
MR | 低电平时清空移位寄存器的数据,一般用不上,接电源 |
OE | 低电平使能输出 |
DS (data serial) | 串行口输入 |
实例:
利用74HC595实现只用三个IO口控制数码管循环显示0~9、9~0。
Proteus图:
代码:
#include<reg51.h>
#include "intrins.h"
sbit STCP=P2^2; //storage register
sbit SHCP=P2^0; //shift register
sbit DS=P2^1;
//共阴极,依次显示0~9、9~0
unsigned char number[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
void delay(unsigned int i)
{
while(i--);
}
void hc595(unsigned char dat)
{
unsigned i;
SHCP = 1;
STCP = 1;
for(i=0;i<8;i++)
{
DS = dat >> 7;
dat <<= 1;
SHCP = 0;
_nop_(); //也可换成delay(1);
_nop_();
SHCP = 1;
}
STCP = 0;
_nop_();
_nop_();
STCP = 1;
}
int main()
{
unsigned char i;
while(1)
{
for(i=0;i<10;i++)
{
hc595(number[i]);
delay(50000);
}
for(i=8;i>0;i--) //i是无符号类型,千万不能>=0,-1用无符号表示就是255
{
hc595(number[i]);
delay(50000);
}
}
}