数码管是一种常见的显示器件,广泛应用在家用电器、仪器仪表、自动控制领域。下图是数码管的实物照片。
下图(a)中是各种各样的数码管,(b)中是常用的7段式数码管,由7个发光二极管组成7段,形成一个日字形,还有一个发光二极管显示小数点。点亮若干段发光二极管,能够组合出阿拉伯数字0-9。
下图(a)中将7段数码管的每段分别命名为A-G,小数点命名为DP;下图(b)是P1口8条口线控制数码管的等效图,图中8个发光二极管分别对应(a)中的7段和小数点。每个发光二极管分别由单片机P1口8条口线控制,P1.7控制小数点DP、P1.6控制G段发光二极管,以此类推P1.0控制A段发光二极管。
从下图中可以看出,如果让数码管显示数字“1”,只需要点亮数码管的B、C两段发光二极管,熄灭其它段发光二极管即可,见下图(a)。结合上一讲的知识,单片机P1.1和P1.2写出“0”点亮B、C两段发光二极管,同时P1口其它口线写出“1”熄灭其它各段就可实现。这时,P1口从P1.7-P1.0的状态为“11111001”,换算成十六进制数为OxF9,OxF9就是显示数字“1”的显示码,也就是说向P1口写入十六进制数Oxf9数码管就可以显示数字“1”。
下表给出了依次点亮其它数字的显示码。
根据下图(b)中的电路写一个程序,要求循环显示数字0-9。程序如下:
#include<reg52.h>
//存储数码管显示码的一维数组【注1】
unsignedcharShowCode[]={OxCO,Oxf9,Oxa4,OxbO,Ox99,Ox92,Ox82,Oxf8,Ox80,Ox90};//主程序voiDMAin(void){unsignedchari;For(;;){
for( i =0;i<10;i++){ //执行10次,依次显示0-9十个数字
delay();1/延时0.5秒
delay();//延时0.5秒
P1=ShowCode[i];//【注2】
}
}
注1;将下表中计算出的显示码存入一维数组ShowCode[]中,调用显示数字“0”的显示码时,只需调用ShowCode[0]=OxcO,将ShowCode[0]写出P1口,数码管就可以显示“0”;类似地,将ShowCode[9]写出P1口,就相当于将“9”的显示码Ox90写出了P1口,数码管就可以显示数字“9”。
注2:在每次循环中,i从0到9不断循环,调用ShowCode[i]从而依次调用ShowCode[0]--ShowCode[9],将它们写出P1口,就可以达到循环显示数字“0”到“9”的效果。
上一篇:单片机实现干簧管计数器的实验