单片机中动态数码管闪烁问题

  以51单片机为例,数码管动态显示如何让某一位数值闪烁,考虑到有新人不一定能熟练运用定时器和中断,这里提供两种简单的思路。

  本次示例中让数码管某一位亮起的函数为  XianShi(数码管位置,显示的字符)

1.利用if语句让需要闪烁的一位先显示一段时间(或次数),再让其显示“空”一段时间。

  数码管是不能同时显示多位字符的,我们可以先让某一位显示,再让其显示空字符,其他位置的数码管不变,利用main函数的刷新原理和人眼的视觉暂留就可以实现闪烁,本次示例均令第一位数码管闪烁,示例代码如下:

unsigned char HaoMa[]={1,2,3,4,5,6,7,8};//需要显示的数组
void main()
{ 
  unsigned char a=0,b=0,i;
   while(1)
  {
     if(a<100)	
    {
	for(i=1;i<9;i++)
	 {
		XianShi(i,HaoMa[i-1]);
	 }
        a++;
    }                                       //一开始全部显示,每显示一次a加1,当显示100次(a等于100)时,跳出此循环
		if(a==100)
	{
		HaoMa(1,0x00);                      //第一位显示空
	for(i=2;i<9;i++)
	{
		XianShi(i,Hao[i-1]);
	}                                       //其余位正常显示
		b++;
	if(b==100)  {a=0;}
	}                                       //a等于100时,让第一位显示空(0x00),其余位置正常显示。每显示一次b加1,当显示100次(b=100)时,让a=0,跳出此循环

  }
}

  这样,先正常显示100次,再让闪烁位显示空100次,再利用主函数刷新原理即可实现某一位或多位闪烁。

2.利用while嵌套循环(需注意重复赋值)

 另一种思路是利用while循环,这样做能使代码更简洁,但容易出错,读者在编写程序时需注意,示例代码如下:

unsigned char HaoMa[]={1,2,3,4,5,6,7,8};
unsigned char a;
void main()
{  
  while(1)
 {
    a=200;
   for(i=1;i<9;i++)
	 {
		XianShi(i,HaoMa[i-1]);           //所有位正常显示
	 }
    while(a--)                           //闪烁的时间是a自减到0的时间                         
  {
     HaoMa(1,0x00);                      //第一位显示空

    for(i=2;i<9;i++)
	{
		XianShi(i,HaoMa[i-1]);           //其余位正常显示
	}

  }

}

  此代码在嵌套循环结束时变量a=0,因此需要在主函数while循环时,要将a变量赋初值,这里测试时150-250比较合适,读者可自行尝试其他数值。

 以上两个代码均可移至中断函数中,利用这两种思路也可实现多位动态显示闪烁,有兴趣的读者可自行尝试。

版权声明:本文为CSDN博主「弱音~」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_59954476/article/details/120687142

  以51单片机为例,数码管动态显示如何让某一位数值闪烁,考虑到有新人不一定能熟练运用定时器和中断,这里提供两种简单的思路。

  本次示例中让数码管某一位亮起的函数为  XianShi(数码管位置,显示的字符)

1.利用if语句让需要闪烁的一位先显示一段时间(或次数),再让其显示“空”一段时间。

  数码管是不能同时显示多位字符的,我们可以先让某一位显示,再让其显示空字符,其他位置的数码管不变,利用main函数的刷新原理和人眼的视觉暂留就可以实现闪烁,本次示例均令第一位数码管闪烁,示例代码如下:

unsigned char HaoMa[]={1,2,3,4,5,6,7,8};//需要显示的数组
void main()
{ 
  unsigned char a=0,b=0,i;
   while(1)
  {
     if(a<100)	
    {
	for(i=1;i<9;i++)
	 {
		XianShi(i,HaoMa[i-1]);
	 }
        a++;
    }                                       //一开始全部显示,每显示一次a加1,当显示100次(a等于100)时,跳出此循环
		if(a==100)
	{
		HaoMa(1,0x00);                      //第一位显示空
	for(i=2;i<9;i++)
	{
		XianShi(i,Hao[i-1]);
	}                                       //其余位正常显示
		b++;
	if(b==100)  {a=0;}
	}                                       //a等于100时,让第一位显示空(0x00),其余位置正常显示。每显示一次b加1,当显示100次(b=100)时,让a=0,跳出此循环

  }
}

  这样,先正常显示100次,再让闪烁位显示空100次,再利用主函数刷新原理即可实现某一位或多位闪烁。

2.利用while嵌套循环(需注意重复赋值)

 另一种思路是利用while循环,这样做能使代码更简洁,但容易出错,读者在编写程序时需注意,示例代码如下:

unsigned char HaoMa[]={1,2,3,4,5,6,7,8};
unsigned char a;
void main()
{  
  while(1)
 {
    a=200;
   for(i=1;i<9;i++)
	 {
		XianShi(i,HaoMa[i-1]);           //所有位正常显示
	 }
    while(a--)                           //闪烁的时间是a自减到0的时间                         
  {
     HaoMa(1,0x00);                      //第一位显示空

    for(i=2;i<9;i++)
	{
		XianShi(i,HaoMa[i-1]);           //其余位正常显示
	}

  }

}

  此代码在嵌套循环结束时变量a=0,因此需要在主函数while循环时,要将a变量赋初值,这里测试时150-250比较合适,读者可自行尝试其他数值。

 以上两个代码均可移至中断函数中,利用这两种思路也可实现多位动态显示闪烁,有兴趣的读者可自行尝试。

版权声明:本文为CSDN博主「弱音~」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_59954476/article/details/120687142

生成海报
点赞 0

弱音~

我还没有学会写个人说明!

暂无评论

发表评论

相关推荐

华大MCU的IAP升级

折腾了些时间,总算解决了 芯片型号是HC32F460,用串口实现IAP升级,从21IC论坛中找到了同样的IAP升级源码,下载后,在自己的开发板上测试也没问题,阅读源码发现,作者的源码中串口通信部分没有用中断。 不过像这样的IAP程序也没有

W806芯片性能测试

资料下载 HLK-W806 - 资料下载 - 海凌科电子 1、指令执行时间测试 在CPU为160Mhz下测试 SystemClock_Config(CPU_CLK_160M); 1.1、GPIO翻转测试 while (1){GPIOB-