在各种控制或测量系统中,通常用七段数码管(简称数码管)来显示各种数字。由于它具有显示清晰、可靠性高、功耗低、寿命长等特点,所以使用非常广泛。例如,十字路口的倒计时牌、出租车的计价器等。数码管一般都是由8个发光二极管(LED)组成。其中,7个长条形的LED排列成“8”字形,另一个圆点形的LED在数码管的右下角作为显示小数点用,如图4-14a所示。
数码管有两类不同的形式:一类是8个LED的阴极都连在一起的,称之为共阴极数码管,如图4-14b所示;另一类是8个LED的阳极都连在一起的,称之为共阳极数码管,如图4-14c所示。
图4-14 数码管显示原理
a)正面 b)共阴极数码管 c)共阳极数码管
共阴和共阳结构的数码管各笔划段名和安排位置是相同的。其中,“abcdefgh”分别为每个LED的阳极引脚标号(对于图4-14b而言)或阴极引脚标号(对于图4-14c而言)。在“abcdefgh”和COM引脚加入适当的电压就会使相应的LED导通,不同的导通组合会使数码管显示出各种不同字形。以共阴极数码管为例,把COM接地,将b和c接高电平,其他引脚接地,那么b和c对应的LED发光,此时数码管将显示数字1的字形;而将a、b和c都接高电平,其他阳极引脚接地,此时数码管将显示数字7的字形。其他字符的显示原理类同。表4-7是两类七段数码管的字形码。
表4-7 七段数码管的字形码编码表
单片机的输出端口(如PORTD或PORTC)可以用于输出高电平和低电平,如果把单片机和数码管合理地连接在一起,就可以用单片机来控制数码管显示了。由于PIC单片机的输出端口对应的引脚具有很强的驱动能力(大多数引脚最大25mA,总计最大不超过200mA,具体参考相应单片机的数据手册),所以可以通过PIC的引脚外加限流电阻直接驱动一个小功率数码管。一种简单的PIC单片机驱动一位数码管的电路图如图4-15所示。
【例4-18】硬件电路如图4-15所示。编程实现显示数字1。
电路图在光盘位置:“\Example\Chapter4\S043\sch\smg1.dsn”。
图4-15 PIC单片机控制一位数码管的电路图
程序分析
由图4-15可知,数码管的公共端是阴极,所以此数码管是共阴极数码管,其阳极与C口相连,在Proteus ISIS中的数码管其引脚排列顺序从上到下依次是abcdefg,也就是引脚RC0与数码管的a引脚相连,RC1与数码管的b引脚相连,依次类推。数码管内部的字形排列顺序是标准顺序。要想显示数字1,需要把b和c置为高电平,其他引脚为低电平,这样就应该向C口输出0b00000110,使引脚RC2、RC1输出高电平,其他引脚输出低电平,数码管就显示数字1了。
设计过程
1)新建一个项目,命名为S043,新建main.c文件并加入项目中,把以下代码输入main.c文件中。
2)将以上代码编译后用Proteus VSM运行一次,查看数码管显示的内容是什么。
以上的代码非常简单。读者可以试着分别显示数字0、2、3、……、8、9。下面再举一个复杂一些的例子。
【例4-19】按照图4-15编程实现循环显示数字0、1、2、3、……、8、9。效果就是先显示0,过一会儿变为1,再过一会儿变为2,依此类推,到9后再过一会儿又变回0,循环显示。
程序分析
●要想循环显示0~9,其编程思路就是先显示0的字形后延时一会儿,再显示1的字形后延时一会儿,再显示2的字形后延时一会儿,直到显示9的字形后延时一会儿。(www.daowen.com)
●例4-18已经介绍显示1的方法了,显示2、3、……、9就很容易了。
●延时功能前文已经介绍过了。
●把这些显示功能和延时功能按顺序放在一个死循环内部就能实现循环显示了。
设计过程
1)修改S043项目中的main.c内容,改为如下所示。
2)将以上代码编译后用Proteus VSM运行,查看数码管显示的内容如何变化。
代码的内容很好理解,但读者会发现代码过长,而且很多部分都是类似的,那么有没有什么方法能简化这个程序的代码量呢?答案是肯定的,要想简化这个程序的代码量就需要使用循环和数组。
【例4-20】改进例4-19的程序,用循环加数组的方式简化其程序代码,但程序功能要求不变。
程序分析
●通过阅读以上代码可以发现主循环内部做了10次类似的重复工作,这里可以引入一个循环变量j用for循环简化之。
●每次工作唯一的差别就是送PORTC的值不同。这里可以把送PORTC输出的字形码值数据按顺序放在一个数组中。例如,定义并初始化一个数组:
●这里把SMG_Font定义为const属性是告诉编译器这是不变的量,对于PIC单片机而言,编译器会把SMG_Font存放在程序存储器中,这样能节省数据存储器空间。然后把上边的代码改为
●这次看一下修改后的功能跟原功能是否相同。当j为0时,SMG_Font[0]为0b00111111,恰好是0的字形码。程序显示0的字形码后延时一会儿,延时完成后j自增1变为1,由于j<10成立,所以继续执行PORTC=SMG_Font[j],此时j为1,SMG_Font[1]=0b00000110,程序显示1的字形码后延时一会儿,依次类推。读者会发现以上的5行代码就能代替刚才的20行代码,且功能完全相同,这就是使用循环和数组简化程序设计的一种方法。
设计过程
1)修改例4-19的main.c内容,改为如下所示。
2)将以上代码编译后用Proteus VSM运行一次,查看数码管显示的内容。结合显示效果来理解数组和循环在此程序中的作用。当有重复性代码出现时,可以考虑用循环+数组的方法来简化代码书写量。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。