51绿板数码管动态显示

来源:互联网 发布:矩阵论教程 张绍飞 pdf 编辑:程序博客网 时间:2024/04/29 01:14
/********************************************************************************
          数码管动态显示
     定时器定时1ms,数码管以秒表计时
********************************************************************************/
#include<reg52.h>
unsigned char code LedChar[] = {
 0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
 0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E   //0到的F十六进制
 };
unsigned char LedBuff[4] = {
 0xFF,0xFF,0xFF,0xFF      //4个数码管的显示缓冲区
 };
void main()
{
 unsigned int cnt = 0;   
 unsigned long sec = 0;
 unsigned char i = 0;
 TMOD = 0x01;  //定时器模式寄存器TMOD选择模式1
 TH0 = 0xFC;   //高8位
 TL0 = 0x18;   //低8位   //定时器0定时1ms
 TR0 = 1;   //定时器0运行控制位置1,开定时器0
 while(1){
  if (TF0 == 1) //1ms定时时间到  ,  且数码管显示放在此if语句内,则使各数码管以1ms间隔轮流显示,即每个数码管隔3ms刷新一次,3ms<=10ms,有余晖效应
  {
   TF0 = 0;
   TH0 = 0xFC; //T0重新定时1ms
   TL0 = 0x18;
   cnt++;
   
   if (cnt>=1000) //1s到
   {
    cnt = 0;
    sec++;    //总时间加1s
    LedBuff[0] = LedChar[sec%10]; //分离每一位上的数字
    LedBuff[1] = LedChar[sec/10%10];
    LedBuff[2] = LedChar[sec/100%10];
    LedBuff[3] = LedChar[sec/1000%10];
   }
   P2 = 0xFF;   //此句为消除瞬间错误,例如case1下,P0已刷新而P2暂留在case0状态瞬间,会造成case0下数码管瞬间显示错误数值,在每次进入开关语句前关闭所有数码管即可消除该错误
   switch(i)   //使四位数码管以1ms间隔轮流刷新,即每个数码管隔3ms刷新一次
   {
    case 0: P0 = LedBuff[0]; P2 = 0x7F; i++; break;       //段选P0,位选P2  ,P0、P2已在<reg52.h>中sfr
    case 1: P0 = LedBuff[1]; P2 = 0xBF; i++; break;
    case 2: P0 = LedBuff[2]; P2 = 0xDF; i++; break;
    case 3: P0 = LedBuff[3]; P2 = 0xEF; i=0; break;
    default : break; 
   }
  }
 }
}
原创粉丝点击