数码管的应用
来自百度:
数码管,也称作辉光管,是一种可以显示数字和其他信息的电子设备。玻璃管中包括一个金属丝网制成
的阳极和多个阴极。大部分数码管阴极的形状为数字。管中充以低压气体,通常大部分为氖加上一些
汞和/或氩。给某一个阴极充电,数码管就会发出颜色光,视乎管内的气体而定,一般都是橙色或绿色。
数码管显示的原理
数码管根据内部连接不同分为共阴极和共阳极。八段数码管内部有8颗LED 组成,如果想要显示特定字形只需控制相应的LED亮起,其他LED熄灭即可。
共阴极数码码表:
0x3F, //"0"
0x06, //"1"
0x5B, //"2"
0x4F, //"3"
0x66, //"4"
0x6D, //"5"
0x7D, //"6"
0x07, //"7"
0x7F, //"8"
0x6F, //"9"
0x77, //"A"
0x7C, //"B"
0x39, //"C"
0x5E, //"D"
0x79, //"E"
0x71, //"F"
0x76, //"H"
0x38, //"L"
0x40, //"-"
0x00, //熄灭
静态与动态显示
LED显示器工作方式有两种:静态显示方式和动态显示方式。
静态显示
静态显示的特点是每个数码管的段选必须接一个8位数据线来保持显示的字形码。当送入一次字形码后,显示字形可一直保持,直到送入新字形码为止。
动态显示
动态显示的特点是将所有位数码管的段选线并联在一起,由位选线控制是哪一位数码管有效。选亮数码管采用动态扫描显示。所谓动态扫描显示即轮流向各位数码管送出字形码和相应的位选,利用发光管的余辉和人眼视觉暂留作用,使人的感觉好像各位数码管同时都在显示。
锁存器工作原理
锁存器的作用是将数据输入端与输出端进行隔离或者连接
输出口Q要想输出高低电平OE脚必须接GND。
LE脚为高时,输出端Q随输入端D的数据而变化。
LE脚为低时,输出端Q数据保持不变,输入端D数据变化不会改变Q的数据。
因此,通过对锁存器的应用,可以达到数码管动态显示的条件
实践编程
静态显示
所有注释放在代码块中
#include <reg52.h>
#include <intrins.h>
#define uint unsigned int //自定义两个变量名称
#define uchar unsigned char
sbit we = P2^7;//将两个锁存器对应的芯片端口重命名,方便记忆
sbit du = P2^6;//we表示位选,选择要点亮的数码管组,du表示段选,选择要点亮的单个数码管
void delay(uint z)//延时函数,暂时无用
{
uint x,y;
for(x = z; x > 0; x--)
for(y = 114; y > 0 ; y--);
}
void main()
{
we=1;//we位选锁存器打开,选择要显示的数码管组
P0=0xee;//1110 1110,表示第4,8数码管被点亮
we=0;//关闭锁存器,保持电流输出
du=1;//du段选锁存器打开
P0=0x06;//0000 0110,点亮八根数码管的两根,组成数字1
du=0;//关闭锁存器
while(1)
{
}
}
代码效果如下:
动态显示
在动态显示中,由于display函数使用unsigned char传递参数,导致调用函数来显示三位数时,只能显示0-255的数字,而使用double进行传参的话,无法将个·十·百三个数位分离。目前仍未找到解决方法。
#include <reg52.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
uchar code table[]= {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F};
sbit we = P2^7;
sbit du = P2^6;
void delay(uint z)
{
uint x,y;
for(x = z; x > 0; x--)
for(y = 114; y > 0 ; y--);
}
void display(uchar i)
{
uchar bai,shi,ge;
bai=i/100;
shi=i%100/10;
ge=i%10;
P0=0xff;
we=1;
P0=0xfe;
we=0;
du=1;
P0=table[bai];
du=0;
delay(5);
P0=0xff;
we=1;
P0=0xfd;
we=0;
du=1;
P0=table[shi];
du=0;
delay(5);
P0=0xff;
we=1;
P0=0xfb;
we=0;
du=1;
P0=table[ge];
du=0;
delay(5);
}
void main()
{
while(1)
{
display(255);
}
}
效果如下:
总结
总的来说写笔记是很有用的,我之前并未发现显示数字超过255后会显示错误的现象,而通过记笔记我找到了这个错误。并且,在学习过程中我知道了为什么需要添加延时函数,他的作用是防止电路中电流变化过快,导致数码管显示混乱。
比较失败的是,我还没有找到将double类型数据进行数位分离的方法。如果能够找到,我会在文章末尾贴出。
补充
Holy Shit!!
我居然忘了int,我下意识以为int和char都支持到127,然鹅int实际上大的多,那么显示不全面的问题就得到了解决。只需将传递参数的类型改为int即可完美解决