C51 3.数码管
前言
数码管就是八根LED
祝愉快
1.原理图
段选和位选
- 数码管模块里面有8个“8.”,每一个数码管为一位,选择哪一个“8.”就是位选。
- 而一个“8.”里面有【a b c d e f g dp】8个段。我们通过段选来控制显示什么样的符号。
段选
- 八个数码管的段选都是共用一组引脚P0。
- 也就是说在一个时间点下,八个数码管只能显示一个相同的符号,当然我们可以通过人眼无法察觉的刷新来实现一次显示不同的符号。
- 图中的74HC245作为驱动器,来提升负载能力。
位选
- 数码管模块标号为LED1~8,为位选,它们连向一个38译码器。
- 38译码器通过P22、P23、P24三位引脚来控制8路选择。
- 38译码器的2进制端对应10进制端,如101对应5,数码管编号0~7。
2.C代码
模块代码
#include <REGX52.H>
#include "Delay.h" //包含Delay头文件
//数码管段码表 0 1 2 3 4 5 6 7 8 9
unsigned char NixieTable[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
//数码管显示子函数
void Nixie(unsigned char Location,Number)
{
switch(Location) //位码输出
{
case 1:P2_4=1;P2_3=1;P2_2=1;break; //111 数值为7 对应普中数码管最左
case 2:P2_4=1;P2_3=1;P2_2=0;break;
case 3:P2_4=1;P2_3=0;P2_2=1;break;
case 4:P2_4=1;P2_3=0;P2_2=0;break;
case 5:P2_4=0;P2_3=1;P2_2=1;break;
case 6:P2_4=0;P2_3=1;P2_2=0;break;
case 7:P2_4=0;P2_3=0;P2_2=1;break;
case 8:P2_4=0;P2_3=0;P2_2=0;break;
}
P0=NixieTable[Number]; //段码输出
Delay(1); //显示一段时间
P0=0x00; //段码清0,消影
}
- 注意消影,当我们想数码管显示多位数字时,要用到快速的刷新,但是太快会导致乱码,这时我们要先Delay一下并且把数码管给清除,再显示下一个数字。
- 为什么会有乱码?因为我们传输的数据是【位选 段选 位选 段选】,那么当顺序被错误解读为【段选 位选 段选 位选 】时就会产生乱码。
显示多位数码管
#include <REGX52.H>
#include "Delay.h" //包含Delay头文件
#include "Nixie.h" //包含数码管头文件
void main()
{
while(1)
{
Nixie(1,1); //在数码管的第1位置显示1
Nixie(2,2); //在数码管的第2位置显示2
Nixie(3,3); //在数码管的第3位置显示3
Nixie(4,4); //在数码管的第4位置显示4
Nixie(5,5); //在数码管的第5位置显示5
Nixie(6,6); //在数码管的第6位置显示6
}
}
- 用到快速刷新,函数要放在死循环里面。
总结
38译码器和数码管都是数电的老熟人了。
还有其他驱动方式的数码管,使用专用驱动芯片可以使用更少的引脚完成工作,不过这里就提及了。