从零开始学习单片机15

用三个IO控制一个数码管

复制代码
#include <reg52.h>

sbit ds = P0^3;
sbit shcp = P0^5;
sbit stcp = P0^4;

unsigned char num[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

//hc595的发送数据以及显示
void hc595_send_byte(unsigned char byte){
	int index = 0;
	for(index = 0;index<8;index++)
	{
        //串行输入引脚,所谓串行就是使数据在一根信号线上按顺序一位一位地传输
		if(byte & 0x80)
			ds = 1;
		else 
			ds = 0;
		shcp = 0;
		shcp = 1;
        //SHCP发生一次上升沿的时候,74HC595才会从DS引脚上取得当前的数据
		byte = byte << 1;
	}
	//上升沿把移位寄存器里的数据发送到锁存寄存器里
	//在对应的Q0-Q7输出对应的信号
}
void main()
{
    while(1)
    {
	    hc595_send_byte(num[0]);//在第一个数码管显示数字0
	    hc595_send_byte(0xFE);
	    stcp = 0;
	    stcp = 1;
	    //上升沿把移位寄存器里的数据发送到锁存寄存器里
    }
}

用三个IO控制多个数码管

LED灯虽然是逐个点亮的,但由于速度非常快,人眼看不出灿烁,可以认为是常亮,多位数码管的原理也是这样

51单片机使用了一个2位的数码管,为共阴型,为了节省单片机的IO口,使用了两片74HC595作为数码管的驱动芯片,共占用3个IO口(分别连接DS,STCP,SHCP)。

Q0、Q1连接WE1、WE2,可以选择哪个数码管被点亮,切换速度足够快时,就像是常亮

第二个595的Q0-Q7接到数码管的数据位,第一个595的Q7S是串行输出把输入的数据按同样的顺序去输出,接到第二个595的DS口上。向第一个595发送第二个数据时,第一次的数据通过Q7S输出到第二个595上。先发送数据,再选择是要哪个数码管

复制代码
#include <reg52.h>

sbit ds = P0^3;
sbit shcp = P0^5;
sbit stcp = P0^4;

unsigned char num[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

//向74HC595发送1个字节数据的函数
void hc595_send_byte(unsigned char byte)
{
	unsigned int index = 0;
	for(index = 0;index < 8;index++)
	{
		if(byte & 0x80)
			ds = 1;
		else 
			ds = 0;
		shcp = 0;
		shcp = 1;//上升沿,将ds引脚数据移入移位寄存器
		byte = byte << 1;
	}
}
void hc595_send_data(unsigned char num, unsigned char addr)
{
	hc595_send_byte(num);//先发送数码管段码,决定显示什么数字
	if(addr == 1){
		hc595_send_byte(0xFE);
	}
	else if(addr == 2){
		hc595_send_byte(0xFD);
	}
	stcp = 0;
    stcp = 1;上升沿将位移寄存器中数据锁存到输出,让数码管显示
}

void main()
{
	while(1)
	{
		hc595_send_data(num[5],1);
		hc595_send_data(num[3],2);
	}
}