先上SMG.c
#include <regx52.h>
unsigned char Number1[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
void SMG (unsigned char Location , Number)
{
int i=1;
switch (Location)
{
case 1:P2_4=1;P2_3=1;P2_2=1; break ;
case 2:P2_4=1;P2_3=1;P2_2=0; break ;
case 3:P2_4=1;P2_3=0;P2_2=1; break ;
case 4:P2_4=1;P2_3=0;P2_2=0; break;
case 5:P2_4=0;P2_3=1;P2_2=1; break ;
case 6:P2_4=0;P2_3=1;P2_2=0; break ;
case 7:P2_4=0;P2_3=0;P2_2=1; break ;
case 8:P2_4=0;P2_3=0;P2_2=0; break ;
}
P0=Number1[Number];
while(i--);
P0=0x00;
}
数码管是我认为51单片机中非常非常有意思的一部分。
作为初学者的我当时非常惧怕数码管,但只要理解了就非常简单了。
数码管当然需要显示数字了,
unsigned char Number1[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
//这里是 0-10和A-F 共计16个
这些就是数字(虽然他们长得根本不像),这是由于数码管是这样组成的
如果我要显示【1】,那么就需要【b】和【c】这两个灯亮,也就是0110用16进制是0x06。
这样一样的整体一共有8个。
太多了,因此我们需要
仅仅用3个口就可以控制哪一个数码管亮,注意是哪一个,不是亮什么数字
代码为
switch (Location)
{
case 1:P2_4=1;P2_3=1;P2_2=1; break ;
case 2:P2_4=1;P2_3=1;P2_2=0; break ;
case 3:P2_4=1;P2_3=0;P2_2=1; break ;
case 4:P2_4=1;P2_3=0;P2_2=0; break;
case 5:P2_4=0;P2_3=1;P2_2=1; break ;
case 6:P2_4=0;P2_3=1;P2_2=0; break ;
case 7:P2_4=0;P2_3=0;P2_2=1; break ;
case 8:P2_4=0;P2_3=0;P2_2=0; break ;
}
而具体的数字是由P0输出的:
P0=Number1[Number];
除此以外,数码管显示多个数字需要不断的刷新(比如for)
它一次只能显示一个数字!
因此需要清屏:
P0=0x00;
在main.c中使用:
SMG(1,2); //即在第一个数码管显示2这个数字
大一新生,忘海涵