image.png
    用上拉电阻:IO口输出电流非常小,应增大才能点亮
    image.png
    原理:LED
    对共阴极数码来说,其8个发光二极管的阴极在数码管内部全部连接在一起,所以称“共阴“,而它们的阳极是独立的,通常在设计电路时一般把阴极接地。当我们给数码管的任一个阳极加一个高电平时,对应的这个发光二极管就点亮了。如果想要显示出一个8字,并且把右下角的小数点也点亮的话,可以给8个阳极全部送高电平,如果想让它显示出一个0字,那么我们可以除了给第”g,dp”这两位送低电平外,其余引脚全部都送高电平,这样它就显示出0字了。想让它显示几,就给相对应的发光二极管送高电平,因此我们在显示数字的时候首先做的就是给0~9十个数字编码,在要它亮什么数字的时候直接把这个编码送到它的阳极就行了。
    共阳极数码管其内部8个发光二极管的所有阳极全部连接在一起,电路连接时,公共端接高电平,因此我们要点亮的那个发光管二极管就需要给阴极送低电平,此时显示数字的编码与共阳极编码是相反的关系,数码管内部发光二极管点亮时,也需要5mA以上的电流,而且电流不可过大,否则会烧毁发光二极管。由于单片机的I/O口送不出如此大的电流,所以数码管与单片机连接时需要加驱动电路,可以用上拉电阻的方法或使用专门的数码管驱动芯片,TX-lC实验板上使用的是74HC573锁存器,其输出电流较大,电路接口简单,可借鉴使用,普中A2开发板用的是38译码器。
    例:共阳极,亮“1”,则b和c赋值1,其余赋值0;共阴极则相反
    image.png
    注意:只有输入0x00才无显示,否则给你随机一个乱码。
    LED显示器工作方式有两种:静态显示方式和动态显示方式。
    静态数码管
    静态显示的特点是每个数码管的段选必须接一个8位数据线来保持显示的字形码。当送入一次字形码后,显示字形可一直保持,直到送入新字形码为止。
    因此不用程序终止语句。
    优点是占用CPU时间少,显示便于监测和控制。缺点是硬件电路比较复杂,成本较高。

    74HC573锁存器
    image.pngimage.png
    左边时段选,右边是位选,两个值存储在芯片里,相当于x和y坐标轴。

    显示原理
    位选:控制哪个数码管亮,如0111 1111在共阴极数码管里表示第一位亮,0011 1111就是前两个都亮……
    段选:控制亮什么东西,见前面的段选字码
    锁存器:0或1存放字码,锁存器在由1到0的下降沿存放字码
    段选锁存器 位选锁存器
    image.png

    代码

    1. #include "reg52.h"
    2. //在第一位显示1
    3. sbit wela=P2^6;
    4. sbit dula=P2^7; //锁存器的锁存端,根据原理图
    5. void main()
    6. {
    7. wela=1; //打开锁存器
    8. P0=0xfe;//位选字码
    9. wela=0; //关闭锁存器
    10. dula=1;
    11. P0=0x3f;//段选,表示字段1
    12. dula=0;
    13. while(1);
    14. }

    74HC138译码器
    看看就行74HC138(中文资料).pdf
    image.png静态数码管 - 图8更直观。
    image.png
    A0、A1、A2 输入就相当于 3 位 2 进制数,A0 是低位,A1 是次高位,A2 是高位。而 Y0-Y7 具体哪一个输出有效电平,就看输入二进制对应的十进制数值。比如输入是 101(A2,A1,A0),其对应的十进制数是 5,所以 Y5 输出有效电平(低电平)。

    1. #include "reg52.h"
    2. #include "intrins.h"
    3. typedef unsigned char u8;
    4. typedef unsigned char u16;
    5. sbit LSA=P2^2;
    6. sbit LSB=P2^3;
    7. sbit LSC=P2^4;
    8. u8 code smgduan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
    9. //字段,用数组储存
    10. void delay()
    11. {
    12. int i=100;
    13. while(i--);
    14. }
    15. void main()
    16. {
    17. LSA=0;
    18. LSB=0;
    19. LSC=1; //三个“坐标”,确定位选
    20. P0=smgduan[0]; //段选
    21. delay(); //延时显示
    22. LSA=0;
    23. LSB=1;
    24. LSC=0;
    25. P0=smgduan[1];
    26. delay();
    27. LSA=1;
    28. LSB=0;
    29. LSC=0;
    30. P0=smgduan[3];
    31. delay();
    32. P0=0x00;
    33. }

    注意:数组里储存的是段码,你打的三位二进制数是位码,两者组合,要显示什么数,在数组里操作字码。