74HC595驱动8位段选数码管

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上升沿有效一次,此时,输入的数据就被送到了输出端。
74HC595驱动8位段选数码管_第1张图片

#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);}
}

你可能感兴趣的:(单片机,嵌入式,单片机,c语言)