数码显示管显示与动态显示的消影

先看原理图
上面的led灯(也就是P2)来控制灯的选择(因为只能选择一个)
控制灯的选择并不需要8个输入口来控制
用个三八译码器即可代替

上图极为138译码器
用P2的2,3,4来输入,输入的数字对应的10进制数代表选择的led灯编号 - 1
注意这里的顺序是4,3,2,也就是倒着来组成的
然后选择完灯了还要在相应的灯上面显示数字
左边的一列P0_0到P0_7就代表相应的格子
注意格子组成二进制数的顺序是从下到上的
下面是完整程序:
#include <at89c51RC2.h>
unsigned char arr[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
unsigned char fun(unsigned char loc,num)
{
switch(loc)
{
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 = arr[num];
}
int main()
{
fun(6,3);
while(1);
// P2_4 = 0;P2_3 = 1;P2_2 = 0;
// P0 = 0xFF;
}
然后可以写个while循环分别调用这个函数来显示多位数字
但是会发现上一位的数字的残影会窜到下一位数字
这时候需要一个操作来"消影"
就是在fun函数的最后加上一个延时ms的函数和将P0置为0x00;
完整程序:
#include <at89c51RC2.h>
unsigned char arr[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
void delay(unsigned int x)
{
x *= 100;
while(x) x--;
}
unsigned char fun(unsigned char loc,num)
{
switch(loc)
{
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 = arr[num];
delay(1);
P0 = 0x00;
}
int main()
{
fun(6,3);
while(1)
{
fun(1,2);
fun(2,0);
fun(3,0);
fun(4,2);
fun(5,1);
fun(6,0);
fun(7,0);
fun(8,1);
}
// P2_4 = 0;P2_3 = 1;P2_2 = 0;
// P0 = 0xFF;
}

浙公网安备 33010602011771号