定时器控制数码管扫描显示

/************************************************************************************
 功能:定时器控制两位数码管扫描显示
 器件:STC12C5A32S2 两个数码管
************************************************************************************/
#include "config.h "

#define uint unsigned  int
#define uchar unsigned char
#define ulong unsigned long

 

int num;   // 显示数据
int FrontDot = 0; // 个位显示
int BehindDot = 0; // 小数显示
uint xms = 0;  // 毫秒数

uint LEDDATA0[10] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f};
uint LEDDATA1[10] = {0xbf, 0x86, 0xdb, 0xcf, 0xe6, 0xed, 0xfd, 0x87, 0xff, 0xef};

 

//  延时约(0.001 * n)秒
void delay(unsigned int n)

     int i;
     ulong msNum = 923;  // 指令循环923次为一秒
      for(i = 0; i < n; i++){
          while(msNum--);
     }
}

 

/*****************************************
 定时器0中断函数
 功能:每过一秒加一计时
*****************************************/
void timer0() interrupt 1
{
     TH0 = 0xfc;     // 重要!!第一次计数满后会从0开始计数,应该在中断程序中重设计数初值
     TL0 = 0x65;          
     xms++;
     if(xms == 1000){
          num++;
          if(num > 99) num = 0;
          FrontDot = num / 10;
          BehindDot = num % 10;
          xms = 0;
     }  
}

 

// 定时器0初始化
void timer0_init()
{
     TMOD = 0x01;     // 设定定时器0为工作方式1,中断只需一次设定
     TH0 = 0xfc;     // 设定计数初值
     TL0 = 0x65;
     EA = 1;      // 开总中断
     ET0 = 1;      // 开定时中断0 
     TR0 = 1;      // 启动定时器0,计数满后执行中断服务程序timer0()
}

 

// 主函数
void main(void)
{
     int x=0;
     num = 0;
     P0_0 = 0;
     P0_1 = 0;
     P0_2 = 0;
     P0_3 = 0;
     P0_4 = 0;
 
     timer0_init();

     for(;;){
         if(x++ > 100)x=0;
         switch(x%2)
         {
               delay(100);
               case 0: 
                            P0_4 = 0;                                // 关闭
                            P2 = LEDDATA0[BehindDot];   // 设置数字
                            P0_3 = 1;                                // 开启
                            break;
               case 1: 
                            P0_3 = 0;
                            P2 = LEDDATA1[FrontDot];
                            P0_4 = 1;
                            break;
          }
      } 
}

 

数码管扫描显示先关闭不需要显示的数码管,再设置要显示的数码管的数字,最后开启要显示的数码管,不然数码管会显示有问题

因为先开启要显示的数码管它会显示上一次设置的数字,在设置数字的话,会有上次的余辉。

你可能感兴趣的:(单片机,timer,delay,工作,x86,c)