单片机的机子上有8个数码管,当需要用到的时候可以看到这个管每次选择哪个亮的时候,数电课本上都知道138译码器是比较好的位选择器。就是当我们需要选择哪个数码管亮的时候,分别对应的就给138译码器的三个引脚位给电平,
138译码器译码规则从上往下是低位到高位1 2 4 ,右边的引脚就对应这LED位位选择端,当需要选择哪个数码管亮的时候,就给这个译码器选择就好了。
然后选择好位之后就到段选了,因为选择了数码管就有给亮的数字是多少,这里可以定义一个数组然后赋值给P0端口,数组就是两个8421码,对应着a b c d e f g dp。8421 8421这样子。然后16进制码就是在右边往左边读,就好像让数码管亮数字2就是 a b g e d 点亮就给电平,然后16进制是0x5d
选择的原理大概是这样,
这个是数组显示0-15的
#include <reg52.h>
#include "led.h"
sbit LED=P2^2; //定义138译码管脚
sbit LED1=P2^3;
sbit LED2=P2^4;
u16 code number[]={0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f,
0x77,0x7c,0x39,0x5e,0x79,0x71}; //0~15 10~15显示abcdef
下面是选择
void delay(unsigned int xms) //延迟函数 1表示1ms
{
unsigned char i, j;
while(xms--){
i = 2;
j = 239;
do
{
while (--j);
} while (--i); }
}
void led(u8 s,u8 chr)
{
switch(s)
{
case 1:LED=1;LED1=1;LED2=1;break; //选择左边往右数第一个,下面依次往右数
case 2:LED=0;LED1=1;LED2=1;break;
case 3:LED=1;LED1=0;LED2=1;break;
case 4:LED=0;LED1=0;LED2=1;break;
case 5:LED=1;LED1=1;LED2=0;break;
case 6:LED=0;LED1=1;LED2=0;break;
case 7:LED=1;LED1=0;LED2=0;break;
case 8:LED=0;LED1=0;LED2=0;break;
}
P0=number[chr]; //选择数码管显示的数字数组第几个。
delay(10);
//P0=0x00; //消隐用于同时显示多个数字出现的时候就需要把注释去掉
}
说到这里有一个注释的P0=0x00就是动态数码管和静态数码管的区别了,正常显示只能让一个数码管亮的,并不能让多个同时亮。当然可以这样,先亮一个然后灭掉,再让另一个亮,这样子只有闪的够快就能骗过人的眼睛。这样子就能让人以为是同时有多个数码管亮。其不然还是一个时间里只有一个亮,只是亮灭的够快,就好像同时亮一样。这里需要延迟一下是因为,当位选 段选 灭,位选 段选 灭,位选 段选 灭 这里执行的时间一样,会导致出现一种错觉就是,会不会下次出现的是 段选 灭 位选 或者 灭 位选 段选,所以需要给一定的机械延迟,让单片机识别出来这样时间段是不同的执行规则。给它一定的反应时间。