数码管是什么,在哪里,效果如何?
数码管就是这些 单片机中的位置 数码管可以用来显示数字(包括小数),实现流水灯式数字显示,时间(需结合时钟、中断等模块,后续补充)
数码管内部电路
数码管的一个数字-对应八个电位-abcdefgh对应01234567L口
如上图所示,abcdefgh按照电平可组合显示出数字
那这电平应该也是高电平吗
其实不是,显示数字,肯定是同电位的组合合成,而数码管的构造,是有共阳极和共阴极结构之分(下图所示)
若共阳,则8个端的一侧连接vcc,另一侧连接相应的输入端,若输入低电平,则为亮,高电平为暗(不显示)
反之,若共阴,则8个端的一侧接地,另一侧连接相应的输入端,若输入高电平,则为亮,低电平为暗(不显示)
那是哪种结构呢,要看开发板,芯片配置,使用手册。
这里用的51开发板的数码管为共阴极结构
那驱动的整体结构呢
如下,在这里谈及两个知识点,一个叫段选,一个叫位选。段选指的是一个数字使用了abcdefgh哪些个;位选指的是选了那些位。
如何实现段选,这里用到的是74HC245。值得注意的是,由于芯片引脚只有32个,那么不可能8*8=64个都有相应的引脚输入端。这里可见,指定的是8个位的a,b,c,d...都连接到同一个引脚输入端上,比如把b亮,那么八个为的a都会亮
那么为什么驱动时只有一个数字,那是因为位选的原因
如何实现位选,这里用到的是74HC138(三八译码器)
三八译码器,能够实现三个口控制8个输出效果,数码管用此节约引脚占用的条件来设置位选
其输出低电平有效:输入111则输出8端会为0--有效(这里开发板第一个就是8端对应的位)
这里解释亮a而只显示一个数字,因为三八译码器,默认三输入为上拉电阻,所以默认为1,1,1---所以输出8口为输出低电平有效。其他都为1无效所以不亮。
数码管编程实现
亮一个数字
P0=0x6F;
一个位从0到f一直循环
#include <REGX52.H>
#include "Delay.h"
typedef unsigned char u8;
typedef unsigned int u16;
#define SMG_A_DP_PORT P0
u8 i;
u8 gsmg_code[16]= {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71
};
void main() {
for(i=0;i<16;i++)
{
SMG_A_DP_PORT= gsmg_code[i];
Delay(500);
}
}
8位-01234567
主函数
#include <REGX52.H>
#include "smg_display.h"
void main() {
while(1) {
smg_display();
}
}
核心函数-位选段选执行
原理:for循环-Switch(i)-控制位选--同时赋予数字--延时控制+消隐
#include <REGX52.H>
#include "Delay.h"
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
#define SMG_A_DP_PORT P0
unsigned char gsmg_code[17]= {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71
};
void smg_display() {
unsigned char i=0;
for(i=0; i<8; i++) {
switch(i) {
//LSA-B-C是指第几个数码管
//case对应了上面显示上面数字
case 0:
LSA=1;
LSB=1;
LSC=1;
break;
case 1:
LSA=0;
LSB=1;
LSC=1;
break;
case 2:
LSA=1;
LSB=0;
LSC=1;
break;
case 3:
LSA=0;
LSB=0;
LSC=1;
break;
case 4:
LSA=1;
LSB=1;
LSC=0;
break;
case 5:
LSA=0;
LSB=1;
LSC=0;
break;
case 6:
LSA=1;
LSB=0;
LSC=0;
break;
case 7:
LSA=0;
LSB=0;
LSC=0;
break;
}
SMG_A_DP_PORT=gsmg_code[i];
Delay(1);//为什么,因为用到了余晖效应,即整一个周期(一个while里)当执行周期不超过50ms,则会保持看上去没有重新执行的效果,明明2已经设置了,但1看上去还是亮的;而每一个位设置值后,Delay(1)能使得相隔极小确保总体小于50ms
SMG_A_DP_PORT=0x00;//消影,也是由于余晖效应,不会让数字暗下来
}
}