目录
一、数码管内部结构
二、数码管的显示方式
三、数码管显示编程思想
1、内部结构有八个发光二极管,一个8字只需要显示7段,但是有一个小数点,dp,所以有八个发光二极管。
2、单个数码管封装十个引脚。3、8引脚是连在一起的,组成公共端。八个发光二极管分别与一个限流电阻串联后再并联,有一个公共端,公共端可以分为共阳或共阴极。
共阴极是公共端接地,然后给高电平让想让亮的字段亮起来。想让显示几,就给对应的字段高电平;
共阳极需要给需要的字段低电平,注意发光二极管本身需要通过5毫安以上的电流才可以发光,且电流不得过大。但是单片机的I/O口送不了这么大的电流,所以需要驱动电路。可以用上拉电阻的方式也可以直接使用专门的驱动芯片,可以使用74HC573锁存器芯片、74HC138译码器,也可以使用专门的数码管驱动芯片LM1640。
3、当多位一体的数码管时内部的公共端是独立的,而负责显示什么数字的段选线是全部连接在一起的。
公共端控制哪个位亮,称为“位选线”,控制单个数码管哪一段亮的叫做“段选线”。
一般单位数码管和二位数码管都有10个引脚,四位数码管有12个引脚。
数码管有两种显示方式:静态显示和动态显示。
位选去选哪几个数字亮,而由于段选是连在一起的所以显示的数字是相同的,这称为静态显示。静态显示就是选中不同的数码管显示相同的数字。
数码管动态显示又叫做动态扫描显示,就是选中几个数码管同时显示不同的数字。
数码管的动态是以扫描的方式轮流向数码管送出段选码和位选,利用发光管的余辉和人眼的视觉暂留作用,使人感觉各位数码管同时都在显示,而实际上是多为数码管一位一位的轮流显示,只是轮流的速度非常快,人眼已经无法分辨。
由于数码管动态显示的特性,动态显示时,我们要在每次送完段选数据后、送入位选数据前,加上语句P0 = 0xff或P0=0x00,看采用的是共阳极还是共阴极的数码管。这个操作叫做消影。如果不执行消影操作,语句再接下来的打开位选命令后,仍保持着上次的段选数据,该段选数据将立刻加在数码管上,接下来才是再次通过IO口给位选送入位选数据,数码管上会出现混乱的现象。
数码管显示步骤:1、送段码 2、送位选 3、延时一下,不要超过10ms(不是必须的) 4、消隐
数码管显示时,最好将段码数据和位选数据按顺序放到各自的数组中,这样调用各自的数组,便可以用数字的方式给数码管送入位选和段选数据,更加方便直观。
我们只需将代表不同数字的段码和位选地址放入数组中,便可以直接调用
unsigned char code leddata[] = {//数码管段码表
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"
0x37,//"n"
0x3e,//"u"
0x73,//"P"
0x5c,//"o"
0x40,//"-"
0x00,//"熄灭"
};
unsigned char LEDBUF[] = {22,22,22,22};//数据显示缓冲区
unsigned char code PLACE_CODE[] = {0xfe, 0xfd, 0xfb, 0xf7};//位选信号
我们可以在我们设置的数据缓冲区数组中填入我们想要显示的内容,就可以通过数组之间的相互调用的实现显示。
void Display()//因为有数据显示缓冲区,就不用带参数的函数
{
static unsigned char i = 0;//静态变量只在第一次时初始化,再次调用就不会被初始化
//1、送段码
GPIO_DIG = leddata[LEDBUF[i]];
//2、送位选
GPIO_PLACE = PLACE_CODE[i];
//3、延时 1ms,所有数码管整体延时时间不要超过10ms
DelayXms(1);
//4、消隐
GPIO_DIG = 0x00;
i++;
if(i == N)
i = 0;
}