单片机数码管动态显示—C语言版

 最近自己用C语言写了个单片机控制数码管显示的程序,范围是0~9999的,虽然代码简单,但是期间却又不少的弯路,写出来,希望对大家能有所帮助。

 

首先要说明一下功能实现和参数设置:

这个子函数是在NEC9234单片机上实现的,不过对大部分单片机应该都适用的,就是不同的单片机里的延时有差别,这个还是自己算吧,就不具体介绍了。

这个子函数是四位数码管共阴动态显示,display_buff是段选,display_bit是位选。 

代码如下:
unsigned int display_buff[4];
unsigned int display_bit[4]={0x01,0x02,0x04,0x08};
unsigned int buff={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
/***共阴极显示:**** 0 ** 1 *** 2 ** 3 ** 4 ** 5 ** 6 ** 7 ** 8 ** 9 ***/
unsigned int qian,bai,shi,ge; 

void display(unsigned int temp)
{
   int k;

   qian = temp/1000;    //问题1   
   bai  = temp%1000/100;
   shi  = temp%100/10;
   ge   = temp%10; 

   display_buff[0] = buff[ge];
   display_buff[1] = buff[shi];
   display_buff[2] = buff[bai];
   display_buff[3] = buff[qian];

   if(qian == 0)    /**如果高位为0,则不显示**/
  {
    display_buff[3] = 0x00;
    if(bai == 0)
    {
      display_buff[2] = 0x00;
      if(shi == 0)
      {
        display_buff[1] = 0x00;
      }
    }
   }

   for(k=0; k<4; k++)       //问题2
   {
     P0 = display_bit[k];
     P4 = display_buff[k];
     delay();       //延时
     P4 = 0x00; //问题3
    }
}
 

问题点:

 1)首先是qian,bai,shi,ge变量的设置,最初是设置为局部变量,但是在运行的时候只是显示最高位,后来喜爱发现是变量设置的问题,因为如果设置成局部变量的话,在执行完display()函数后局部变量的值就会出现错误,所以应当设置为全局变量。

2)这个地方由于粗心,让我费了不少功夫,因为用的是共阴极显示,所以我也没有想硬件方面的问题(数码管的共阴极是用三极管控制的),就想当然的用{0xfe,0xfd,0xfb,0xf7}来控制数码管的位选,所以怎么弄也不对,让我很恼火……呵呵,后来在检查硬件的时候才发现我一开始就错了,看来细心是相当的重要呢O(∩_∩)O~

3)这个问题比较小,但是也挺重要的,如果没有的话,会在其它数码管上有非常微小的显示,让人看着不爽,加上P4 = 0x00是为了屏蔽干扰。

你可能感兴趣的:(专业方面)