74HC595与数码管

                                             74HC595与数码管
先引用一句官方语:“74HC595是硅结构的CMOS器件, 兼容低电压TTL电路,遵守JEDEC标准。”
长话短说,它的功能是8位串行输入并行输出移位寄存器,也就是串行转并行。下图是封装图:

74HC595内部有两个寄存器:8位移位寄存器和8为存储寄存器,下面要PROTEUS做下各个引脚的测试:


调试一下可以看出:
DS为串行数据输入口;SH_CP为串行时钟输入口,SH_CP每个上升沿到来时,芯片内部的移位寄存器会左移一位,最低位由DS决定,最高位移出丢失,次高位成为最高位,并在Q7'体现出来(根据Q7'可以看出,74HC595也有串行输出功能);ST_CP每个上升沿会将移位寄存器的值输出到存储寄存器,存储寄存器直接和引脚Q0~Q7相连,所以存储寄存器的值会直接反映在引脚Q0~Q7上,从而实现串行转并行功能;OE是输出使能,高电平时Q0~Q7为高阻态,低电平时Q0~Q7为存储寄存器的值;MR为低电平时,移位寄存器会被清0,高电平时无效;VCC接电源;GND接地。好了,所有引脚介绍完了。有的封装图引脚名字不太一样,功能是一致的。

下面用两片74HC595(U1和U2)分别控制四位数码管(U1)的显示和选位(U2),为了减少连线,两片74HC595串联(U2的Q7'输出到U1的DS),这样连续向U2的DS写两个字节(第一个是要显示的数字,第二个是位选),就可以显示了。这样LPC2103用三个口(P0.4连SH_CP,P0.6连DS,P0.7连P0.7ST_CP)就可以操作此四连共阴数码管(注意是共阴,不是上篇的共阳,两者之间转换容易,把“要显示的数字”和“位选”取反即可)。如下图:

这个实验测试下:
//*****************************************************************************************************
//功能:LPC2103利用两片74HC595操作四位共阴数码管
//说明:
//用两片74HC595(U1和U2)分别控制四位数码管(U1)的显示和选位(U2),
//为了减少连线,两片74HC595串联(U2的Q7'输出到U1的DS),这样连续向U2的DS写
//两个字节(第一个是要显示的数字,第二个是位选),就可以显示了。这样LPC2103
//用三个口(P0.4连SH_CP,P0.6连DS,P0.7连ST_CP)就可以操作此四连共阴数码管。
#include<LPC2103.H>

#define SH_CP 1<<4  //移位时钟
#define DS 1<<6   //数据
#define ST_CP 1<<7  //字节输出时钟
#define u8 unsigned char

void display(u8 data,u8 n);
void send(u8 byte);
void delay(unsigned int i);
//注意:这是共阳数码管的码表,但用在共阴数码管上,两者之间转换容易,把数据取反即可
u8 table[16] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};

int main()
{
    PINSEL0=0;             //GPIO
    IODIR=SH_CP|DS|ST_CP;          //三位设定为输出
    while(1)
    {
        display(0x5,1);             //在1位显示数字5
        delay(1000000);
        display(0xA,2);
        delay(1000000);
        display(0xF,3);
        delay(1000000);
        display(7,4);
        delay(1000000);
    }
}
 

//在“n”位处显示数字“data”,用于共阴数码管
void display(u8 data,u8 n)
{
    send(~table[data]);            //发送数字,若要用于共阳,去掉“~”
    send( ~(1<<(n-1)) );         //发送 位,若要用于共阳,去掉“~”
}

//向74HC595发一个字节
void send(u8 byte)
{
    u8 i;
    IOCLR=ST_CP;             //先拉低,为后面的上升沿做准备
    for(i=0;i<8;i++)
    {
        IOCLR=SH_CP;             //先拉低,为后面的上升沿做准备
        if(byte&0x80) IOSET=DS;            //将字节最高位 输出 在DS线上
        else IOCLR=DS;
        byte=byte<<1;             //该字节右移一位
        IOSET=SH_CP;             //使74HC595接收该位(DS)
    }
    IOSET=ST_CP;            //使74HC595输出该字节
}

void delay(unsigned int i)
{
    while(i--);
}
//**************************************************************************
proteus仿真结果如下图:

硬件测试如下图:

可见,操作四位数码管本来需要12个口,利用74HC595后只要三个口就行了,大大节约了硬件资源。 

 

/************************************************************************************************************************************************************************/

                             串行到并行的数据转换

 Remote control holding register.

#include<reg51.h>

#include <intrins.h>

#define uchar unsigned char

#define uint unsigned int

 

sbit stcp1=P2^2;

sbit ds1=P2^1;  

sbit shcp1=P2^0;

 

sbit stcp2=P2^5; 

sbit ds2=P2^4; 

sbit shcp2=P2^3;

uchar code DAT[11]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};//共阴数码管显示码

uchar code tab[10]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};

uchar code wei[9]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0xff};

void delay(uint ms)

{                           

  uint x,y;

  for(x=ms;x>0;x--)

   for(y=255;y>0;y--);

}

void QR0_5951(uchar num1)

{

    uchar j;

    for (j=0;j<8;j++)

    {

     num1=num1<<1 ; 

     ds1=CY;

     shcp1=1;//上升沿发生移位 

  //  shcp1=0;

    }        

}

void OUT_5951()//将移位寄存器内的数据锁存到输出寄存器并显示 

{

 stcp1=0;     

 stcp1=1;//上升沿将数据送到输出锁存器   

 stcp1=0;

void QR1_5952(uchar num2)

{

 uchar j;

 for (j=0;j<8;j++)

 {

   num2=num2<<1 ; 

   ds2=CY;

   shcp2=1;//上升沿发生移位 

//   shcp2=0;

 }        

}                             

void OUT_5952()//将移位寄存器内的数据锁存到输出寄存器并显示 

{

 stcp2=0;     

 stcp2=1;//上升沿将数据送到输出锁存器   

 stcp2=0;

}

void main()

{

 uchar i;

 while(1)

 {

   for(i=0;i<2;i++)

   {

     QR0_5951(DAT[0]);

    OUT_5951();

    QR1_5952(wei[i]);

      OUT_5952();

      delay(1);        

   }

 }

}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值