用74HC595和74LS247驱动四位数码管

1     74HC595芯片

74HC595是一个8位串行输入、并行输出的移位寄存器

 

管脚如下:

用74HC595和74LS247驱动四位数码管_第1张图片用74HC595和74LS247驱动四位数码管_第2张图片

 

 

2     74LS247芯片

74ls247是4线——七段译码器/驱动器

管脚如下:

用74HC595和74LS247驱动四位数码管_第3张图片

 

其中, A,B,C,D为译码地址输入端;

         a~g为段输出(低电平有效)

用74HC595和74LS247驱动四位数码管_第4张图片

 

3     四位数码管

 

针脚定义:

                  1-4:位选

                  a-h:段选

用74HC595和74LS247驱动四位数码管_第5张图片

3 原理图

用74HC595和74LS247驱动四位数码管_第6张图片

注:该原理图只说明各针脚连接关系,未画出其它器件。

 

由图可见,对于共阳数码管,位选编码如下表:

1

2

3

4

编码

0xe0H

0xd0H

0xb0H

0x70H

注:表中编码将段选信号假设为0.

由于控制信号是由单片机等微处理器串行输入到74HC595,所以根据74LS247译码器编码对段选信号也编码如下:

数字

0

1

2

3

4

5

6

7

8

9

编码

0x00H

0x01H

0x02H

0x03H

0x04H

0x05H

0x06H

0x07H

0x08H

0x09H

注:表中编码将位选信号假设为0.

4 程序代码

   unsigned char LED_0F[] = //共阳

    {// 0    1    2     3     4       5     6      7     8       9

0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09  };

    

    unsigned char LED[4];  //用于LED的4位显示缓存

    int SCLK = 2;

    int RCLK = 3;

    int DIO = 4; //这里定义了那三个脚

    void setup ()

    {

      pinMode(SCLK,OUTPUT);

      pinMode(RCLK,OUTPUT);

      pinMode(DIO,OUTPUT); //让三个脚都是输出状态

    }

    void loop()

    {

        LED[0]=1;

           LED[1]=2;

           LED[2]=3;

           LED[3]=4;

           while(1)

           {

                  LED4_Display ();

        }

     

    }

   

    void LED4_Display (void)

    {

           unsigned char *led_table;          // 查表指针

           unsigned char i;

      unsigned char j;

           //显示第1位

           led_table = LED_0F + LED[0];

           i = *led_table;

      j=i|0xe0; 

        LED_OUT(j);  

        digitalWrite(RCLK,LOW);

        digitalWrite(RCLK,HIGH);

         delay(1000);

           //显示第2位

           led_table = LED_0F + LED[1];

           i = *led_table;

        j=i|0xd0; 

        LED_OUT(j);         

        digitalWrite(RCLK,LOW);

        digitalWrite(RCLK,HIGH);

         delay(1000);

           //显示第3位

           led_table = LED_0F + LED[2];

           i = *led_table;

        j=i|0xb0; 

        LED_OUT(j);  

        digitalWrite(RCLK,LOW);

        digitalWrite(RCLK,HIGH);

         delay(1000);

           //显示第4位

           led_table = LED_0F + LED[3];

           i = *led_table;

        j=i|0x70; 

        LED_OUT(j);         

        digitalWrite(RCLK,LOW);

        digitalWrite(RCLK,HIGH);

        delay(1000);

    }

   

    void LED_OUT(unsigned char X)

    {

           unsigned char i;

           for(i=8;i>=1;i--)

           {

                  if (X&0x80)

                {

                  digitalWrite(DIO,HIGH);

                 } 

                else

                {

                  digitalWrite(DIO,LOW);

                }

                  X<<=1;

                digitalWrite(SCLK,LOW);

                digitalWrite(SCLK,HIGH);

           }

}

你可能感兴趣的:(开发经验,电路设计,编程)