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

  以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

弱音~

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

暂无评论

发表评论

相关推荐

STM32 C++编程系列一:STM32 C++编程介绍

一、STM32及其他单片机开发现状 在目前绝大部分的单片机开发当中,C语言占据着主流的地位,但由于C语言本身是一种面向过程的语言,因此在当前利用面向对象思想构建可复用代码为主流的今天显得比较麻烦&#x

串口补充2

串口流量控制: 在串口协议中规定了传输数据的速率,即单位时间内传输的字节数。根据不同的传输速率,在接收端和发送端可以进行流量控制。接收端如果接收缓冲区满了,向发送端发出暂停发送信号;等接收缓冲区数据被取走后,向发送端发出继续发送

GD32 ADC DMA

ADC_F450.cpp #include "Adc_F450.hpp" #include "main.h" #include /* STM32 所用管脚和ADC通道PA4 --- ADC1_IN4 --- ADC24

课程实习stm32主从蓝牙计算器+温度测量

说明:对于主从蓝牙计算器项目中的代码都是本人经过思考之后自行创作出来的,没有经过任何的网上抄录,由于课程实习的要求不高,所以我就没有对一些出现的bug进行修改(没有删除功能等