用上拉电阻:IO口输出电流非常小,应增大才能点亮
原理:LED
对共阴极数码来说,其8个发光二极管的阴极在数码管内部全部连接在一起,所以称“共阴“,而它们的阳极是独立的,通常在设计电路时一般把阴极接地。当我们给数码管的任一个阳极加一个高电平时,对应的这个发光二极管就点亮了。如果想要显示出一个8字,并且把右下角的小数点也点亮的话,可以给8个阳极全部送高电平,如果想让它显示出一个0字,那么我们可以除了给第”g,dp”这两位送低电平外,其余引脚全部都送高电平,这样它就显示出0字了。想让它显示几,就给相对应的发光二极管送高电平,因此我们在显示数字的时候首先做的就是给0~9十个数字编码,在要它亮什么数字的时候直接把这个编码送到它的阳极就行了。
共阳极数码管其内部8个发光二极管的所有阳极全部连接在一起,电路连接时,公共端接高电平,因此我们要点亮的那个发光管二极管就需要给阴极送低电平,此时显示数字的编码与共阳极编码是相反的关系,数码管内部发光二极管点亮时,也需要5mA以上的电流,而且电流不可过大,否则会烧毁发光二极管。由于单片机的I/O口送不出如此大的电流,所以数码管与单片机连接时需要加驱动电路,可以用上拉电阻的方法或使用专门的数码管驱动芯片,TX-lC实验板上使用的是74HC573锁存器,其输出电流较大,电路接口简单,可借鉴使用,普中A2开发板用的是38译码器。
例:共阳极,亮“1”,则b和c赋值1,其余赋值0;共阴极则相反
注意:只有输入0x00才无显示,否则给你随机一个乱码。
LED显示器工作方式有两种:静态显示方式和动态显示方式。
静态数码管
静态显示的特点是每个数码管的段选必须接一个8位数据线来保持显示的字形码。当送入一次字形码后,显示字形可一直保持,直到送入新字形码为止。
因此不用程序终止语句。
优点是占用CPU时间少,显示便于监测和控制。缺点是硬件电路比较复杂,成本较高。
74HC573锁存器
左边时段选,右边是位选,两个值存储在芯片里,相当于x和y坐标轴。
显示原理
位选:控制哪个数码管亮,如0111 1111在共阴极数码管里表示第一位亮,0011 1111就是前两个都亮……
段选:控制亮什么东西,见前面的段选字码
锁存器:0或1存放字码,锁存器在由1到0的下降沿存放字码
段选锁存器 位选锁存器
代码
#include "reg52.h"
//在第一位显示1
sbit wela=P2^6;
sbit dula=P2^7; //锁存器的锁存端,根据原理图
void main()
{
wela=1; //打开锁存器
P0=0xfe;//位选字码
wela=0; //关闭锁存器
dula=1;
P0=0x3f;//段选,表示字段1
dula=0;
while(1);
}
74HC138译码器
看看就行74HC138(中文资料).pdf
更直观。
A0、A1、A2 输入就相当于 3 位 2 进制数,A0 是低位,A1 是次高位,A2 是高位。而 Y0-Y7 具体哪一个输出有效电平,就看输入二进制对应的十进制数值。比如输入是 101(A2,A1,A0),其对应的十进制数是 5,所以 Y5 输出有效电平(低电平)。
#include "reg52.h"
#include "intrins.h"
typedef unsigned char u8;
typedef unsigned char u16;
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
u8 code smgduan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
//字段,用数组储存
void delay()
{
int i=100;
while(i--);
}
void main()
{
LSA=0;
LSB=0;
LSC=1; //三个“坐标”,确定位选
P0=smgduan[0]; //段选
delay(); //延时显示
LSA=0;
LSB=1;
LSC=0;
P0=smgduan[1];
delay();
LSA=1;
LSB=0;
LSC=0;
P0=smgduan[3];
delay();
P0=0x00;
}
注意:数组里储存的是段码,你打的三位二进制数是位码,两者组合,要显示什么数,在数组里操作字码。