首先我们看这里的数码管外设,控制他的两个端口并没有提前接电源或者接地。之前的蜂鸣器和继电器两个外设他们的其中一个端口都提前与VCC相连我们对这两者都只能控制他们的一个端口。 而这里的数码管不同,它的两个端口并没有提前预设,因此我们利用其中一个端口来控制单个数码管的LED显示,用另一个端口来控制具体的哪一个数码管。而具体到这里我们在Y7C这个端口是1时LED灭,0时LED亮, Y6C这个端口是1时控制LED位置,0时LED位置失去控制。
具体为Y6C 0000 0001 时为控制第一个数码管,其他数码管不受控制。
Y7C 0000 0001 时为dp g f e d c b亮,a灭。
总之来说对于Y6C是值为1时起效果,对于Y7C是值为0时起效果。这里的意思就是LED数码管它的两个端口一个为0,一个为1,这时数码管便会成功起作用.
静态数码管一次只能有一个数码管亮
动态数码管就是多个数码管亮,但实际上就是由每一位的静态数码管组成,只不过前后亮起时他的延时非常低,使形成的视觉错觉会让人误以为多位数码管同时亮起。
具体数码管代码
#include <STC15F2K60S2.H>
code unsigned char Seg_Table[] =
{
0xc0, //0
0xf9, //1
0xa4, //2
0xb0, //3
0x99, //4
0x92, //5
0x82, //6
0xf8, //7
0x80, //8
0x90, //9
0x88, //A
0x83, //b
0xc6, //C
0xa1, //d
0x86, //E
0x8e //F
};
InitHC138(unsigned char n)
{
switch(n)
{
case 4:
P2=0x1f|0x80;
break;
case 5:
P2=0x1f|0xa0;
break;
case 6:
P2=0x1f|0xc0;
break;
case 7:
P2=0x1f|0xe0;
break;
}
}
Delay(unsigned int i)
{
while(i--);
}
Seg_Show(unsigned char pos,unsigned char dat)
{
InitHC138(6);
P0=0x01<<pos;
InitHC138(7);
P0=Seg_Table[dat];
}
//Seg_Static()//静态数码管
//{
// unsigned int i;
// unsigned int j;
// for(i=0;i<8;i++)
// {
// for(j=0;j<9;j++)
// {
// Seg_Show(i,j);
// Delay(6000);
// }
// }
//}
Seg_Dynamic()//动态数码管
{
Seg_Show(0,2);
Delay(6);
Seg_Show(1,0);
Delay(6);
Seg_Show(2,2);
Delay(6);
Seg_Show(3,4);
Delay(6);
}
void main()
{
//Seg_Static();
while(1)
{
//Seg_Dynamic();
Seg_Dynamic();
}
}