74HC595驱动8位段选数码管
利用两个74HC595实现三个引脚实现数据的传送
以下是595各引脚作用:
SHCP =P0^1; // 移位寄存器的时钟输入,数据输入时钟线
STCP =P0^2 ;//存储寄存器的时钟输入,输出存储器锁存时钟线
DS 第14脚 //串行数据输入,级联的话接上一级的Q7’
Q7’: 级联输出端。将它接下一个595的DS端。
Q0–Q7: 八位并行输出端,可以直接控制数码管的8个段。
SH_CP(11脚):上升沿时数据寄存器的数据移位。Q0->Q1->Q2–>Q3–>…–>Q7;
下降沿移位寄存器数据不变。
ST_CP(12脚):上升沿时移位寄存器的数据进入数据存储寄存器,下降沿时存储寄存器数据不变。通常我将ST_CP置为低电平,当移位结束后,在ST_CP端产生一个正脉冲,更新显示数据。
OE(13脚): 高电平时禁止输出(高阻态);输出有效(低电平有效)
MR(10脚): 低电平时将移位寄存器的数据清零。通常接到VCC防止数据清零。
3.按要求接好电路图
OE置低电平,MR置高电平,在正常使用时STCP为低电平, OE为低电平。从DS每输入一位数据,串行输入时钟SHCP上升沿有效一次,直到八位数据输入完毕,输出时钟STCP上升沿有效一次,此时,输入的数据就被送到了输出端。
#include "at89x52.h"
sbit SHCP =P0^1; // 移位寄存器的时钟输入
sbit STCP =P0^2 ; // 存储寄存器的时钟输入
sbit DS =P0^0;
code unsigned char SegTab[16]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
code unsigned char BitTab[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
data unsigned char DBuf[8]={0x00};
void DelayXms(unsigned char ms){unsigned int dly;
while(ms--)
{dly = 100;
while(dly--){;}
}
}
void Driver595 (unsigned char dat)
{
unsigned char i;
for(i=0;i<8;i++)
{SHCP=0;
if(dat & 0x80)DS=1;
Else DS=0;
SHCP=1;
dat <<=1;}
}
void Display(unsigned char* ptr){
unsigned char i;
STCP=0;
for(i = 0;i < 8;i++)
{Driver595(BitTab[i]);
Driver595(ptr[i]);
STCP=1;DelayXms(2);
STCP=0;}}
void update(unsigned char *dst,unsigned char hour,unsigned char minu,unsigned char sec)
{
*dst++ = SegTab[hour/10];
*dst++ = SegTab[hour%10];
*dst++ = 0x40;
*dst++ = SegTab[minu/10];
*dst++ = SegTab[minu%10];
*dst++ = 0x40;
*dst++ = SegTab[sec/10];
*dst++ = SegTab[sec%10];
}
void main(void)
{
unsigned char Hour = 11,Minu = 11,Sec = 0x00;
update(DBuf,Hour,Minu,Sec);
while(1){Display(DBuf);}
}