原理
    利用循环动态扫描,在人眼中实现视觉暂留,达到显示效果
    可以随时改变显示内容

    74HC573锁存器
    代码(效果:全部点亮且都显示1->2->3->…->A->B->C…)

    1. #include "reg52.h"
    2. typedef unsigned char u8;
    3. typedef unsigned char u16;
    4. u8 i;
    5. u8 code smgduan[]={0x3f, 0x06, 0x4f, 0x66, 0x6d, 0x7d, 0x07,
    6. 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71}; //段选字码,存在数组中
    7. void delay(u8 z)
    8. {
    9. u8 x,y;
    10. for(x=z; x>0; x--)
    11. {
    12. for(y=70; y>0; y--);
    13. }
    14. }
    15. void main()
    16. {
    17. wela=1;
    18. P0=0xea; //先锁一个全部点亮
    19. wela=0;
    20. while(1)
    21. {
    22. for(i=0;i<16; i++)
    23. {
    24. dula=1; //段选释放
    25. P0=smgduan[i];
    26. dula=0;
    27. delay(1000);
    28. }
    29. }
    30. }

    74HC138译码器
    需要把管全调为0,消影

    1. #include "reg52.h"
    2. typedef unsigned char u8;
    3. typedef unsigned char u16;
    4. sbit LSA=P2^2;
    5. sbit LSB=P2^3;
    6. sbit LSC=P2^4;
    7. u8 code smgduan[]={0x3f, 0x06, 0x4f, 0x66, 0x6d, 0x7d, 0x07,
    8. 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71}; //段选字码,存在数组中
    9. void delay(u16 i) //延时函数的定义
    10. {
    11. while(i--);
    12. }
    13. void DigDisplay()
    14. {
    15. u8 i;
    16. for(i=0; i<8; i++)
    17. {
    18. switch(i)
    19. {
    20. case (0):
    21. LSA=0; LSB=0; LSC=0; break; //0和1参照原理图真值表
    22. case (1):
    23. LSA=1; LSB=0; LSC=0; break;
    24. case (2):
    25. LSA=0; LSB=1; LSC=0; break;
    26. case (3):
    27. LSA=1; LSB=1; LSC=0; break;
    28. case (4):
    29. LSA=0; LSB=0; LSC=1; break;
    30. case (5):
    31. LSA=1; LSB=0; LSC=1; break;
    32. case (6):
    33. LSA=0; LSB=1; LSC=1; break;
    34. case (7):
    35. LSA=1; LSB=1; LSC=1; break;
    36. }
    37. P0=smgduan[i]; //通过P0依次输出值,值来自数组
    38. delay(10); //延时函数,只要是动态就会用到
    39. P0=0x00; //每次循环结束对P0口清零,消影
    40. }
    41. }
    42. void main()
    43. {
    44. while(1)
    45. {
    46. DigDisplay();
    47. }
    48. }

    制作0~F闪动数码管:
    38译码器版

    1. #include "reg52.h"
    2. typedef unsigned char u8;
    3. typedef unsigned char u16;
    4. sbit LSA=P2^2;
    5. sbit LSB=P2^3;
    6. sbit LSC=P2^4;
    7. u8 code smgduan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //段选字码,存在数组中
    8. void delay(u8 z)
    9. {
    10. u8 x,y;
    11. for(x=z; x>0; x--)
    12. {
    13. for(y=99999999999; y>0; y--);//长点,要不然看不清
    14. }
    15. }
    16. void DigDisplay()
    17. {
    18. u8 i;
    19. for(i=0; i<16; i++)
    20. {
    21. LSA=0; LSB=0; LSC=0; //位选
    22. P0=smgduan[i]; //通过P0依次输出值,值来自数组
    23. delay(99999999999); //延时函数,只要是动态就会用到
    24. P0=0x00; //每次循环结束对P0口清零,消影
    25. }
    26. }
    27. void main()
    28. {
    29. while(1)
    30. {
    31. DigDisplay();
    32. }
    33. }

    锁存器版(节选)

    1. void display()
    2. {
    3. wela=1;
    4. P0=0xfe; //先锁第一个
    5. wela=0;
    6. while(1)
    7. {
    8. for(i=0;i<16; i++)
    9. {
    10. dula=1; //段选释放
    11. P0=smgduan[i];
    12. dula=0;
    13. delay(1000);
    14. }
    15. }

    拆分显示一个数

    1. #include "reg52.h"
    2. typedef unsigned char u8;
    3. typedef unsigned char u16;
    4. sbit LSA=P2^2;
    5. sbit LSB=P2^3;
    6. sbit LSC=P2^4;
    7. u8 aa,num,bai,shi,ge;
    8. u16 temp;
    9. u8 code smgduan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //段选字码,存在数组中
    10. void delay(u8 z)
    11. {
    12. u8 x,y;
    13. for(x=z; x>0; x--)
    14. {
    15. for(y=70; y>0; y--);//用于动态数码管
    16. }
    17. }
    18. void main()
    19. {
    20. temp=189;
    21. while(1)
    22. {
    23. bai=temp/100;
    24. shi=temp%100/10;
    25. ge=temp-100*bai-10*shi;
    26. LSA=1; LSB=1; LSC=1;
    27. P0=smgduan[bai];
    28. delay(1050);
    29. LSA=0; LSB=1; LSC=1;
    30. P0=smgduan[shi];
    31. delay(1050);
    32. LSA=1; LSB=0; LSC=1;
    33. P0=smgduan[ge];
    34. delay(1050);
    35. P0=0x00;
    36. }
    37. }

    数码管+定时器