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

先看原理图

上面的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;
}

 

posted @ 2023-04-30 15:48  rickly233  阅读(158)  评论(0)    收藏  举报