前言
数码管在现实生活中无处不在,如何实现数码管按要求显示是本文的重点。通过本文的学习,你将更清晰的了解数码管的电路结构,掌握如何编写数码管的段码表等技术。
一、数码管是什么?
数码管内部其实就是由多个LED按一定位置进行分布,最终实现数字化显示。数码管分为两种类型,一种是共阴数码管即公共端为GND。另一种为共阳数码管即公共端为VCC。具体的电路如图1所示。其实我们在真正使用的时候,你只需要把他们考虑成普通的LED灯即可,LED灯的正极接哪里,负极接哪里,只要LED灯两端的电压大于导通电压即可点亮。
图1 数码管共阴共阳电路
二、数码管段选
1.对于任何数码管,在计算段码表时,只需要考虑数码管中ABCDEFGdp
的连接和对应数码管PCB封装。如果大家在设计原理图时,未考虑购买的元器件封装的问题,很有可能就需要再次修改段码表,否则容易出现显示问题。比如原理图如图2所示,原理图的A端口在7号引脚,但是PCB的7号引脚是B端口,那么之前按照原理图设计的段码表就需要修改。正确的PCB图应该如图3所示。
图2 共阳数码管电路图
图3 共阳数码管PCB图
3.如何编写段码表
根据数码管的LED灯段选走向,如图4所示。如果要显示数字“0”,则需要abcdef都点亮;如果要显示数字“1”,则需要bc点亮;如果要显示数字“2”,则需要abged点亮。其他数字和字符显示大家有空可以自行排布,这里不过多解释。
图4.数码管段选
4.由于a~dp的引脚都需要与单片机的IO口进行连接,因此只需要考虑数码管是共阴还是共阳。如果是共阳,那么连接a-dp引脚需要是低电平即可点亮。此处列一些常见的段码表。
unsigned char code smg[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E, 0xBF,0xFF}; //共阳数码管段码表0-F、-、熄灭
unsigned char code smg[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x76,0x40,
0x00}; //共阴数码管段码表0-F、-、熄灭
三、数码管位选
1.对于1位数码管,则不需要考虑位选。
2.对于2位及以上数码管,则需要考虑数码管位选。假设是4位数码管,电路原理图如图5所示,如果段选已经设置好了,但是给哪个数码管则需要由段选来控制了。比如只要显示DIG4处的数码管,则需要让P20所连接的8550三极管导通即可,要使8550PNP管导通,P20只需要低电平即可且P21-23都为高电平。同理,只要显示DIG3处的数码管,则只需要P21为低电平且P20、P22和P23为高电平。其他数码管点亮就不再赘述了。
3.如果我们需要显示4位数,那么需要将4位数拆分成4个1位数,比如4位数拆成千位是多少,百位是多少,十位是多少,个位是多少。接下来写一个for循环,依次点亮即可。
图5.四位数码管电路图
四、具体代码实现
1.一位数码管循环显示0-9
具体代码如下:
/**
一、硬件连接
1.P0接共阳数码管的数据位
二、功能实现
1.数码管循环显示0-9
*/
#include <REGX52.H>
void delay(unsigned int Xms);//延时函数声明
unsigned char code smg[] = {
0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,
0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,0xBF,0xFF}; //共阳数码管段码表
void main()
{