微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 我这个“数码管计时器显示有效位”出什么问题了?

我这个“数码管计时器显示有效位”出什么问题了?

时间:10-02 整理:3721RD 点击:
/*
*定时器定时数码管秒表 ,只显示有效位
*/
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
uchar code smg[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
uchar a[4];//取位数组
uint  num=0;//计时显示变量
sbit p22=P2^2;//3-8使能A
sbit p23=P2^3;//3-8使能B
sbit p24=P2^4;//3-8使能C
//MS延时
void delayMS(uint z)
{
uchar i;
while(z--)
for(i=0;i<120;i++);
}
//T0初始化
void t0_init()
{
TMOD|=0X01;
TMOD&=0Xfd;
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
TR0=1;
}
//开中断
void int_init()
{
EA=1;
ET0=1;
}
//
void main()
{

t0_init();
int_init();
while(1);
  
}
//中断函数
void inter() interrupt 1
{
uchar count=0;//定时器累加变量
uchar j,i=0;
TH1=(65536-10000)/256;
TL1=(65536-10000)%256;
count++;
if(count==10)num++;
a[0]=num%10;
a[1]=num/10%10;
a[2]=num/100%10;
a[3]=num/1000%10;
while(1)
{
if(num<10)//1WEI显示
{
  p24=1;p23=1;p22=1;P0=smg[a[0]];
  delayMS(5);
}
if((num<100)&(num>=10))//2WEI显示
{
  for(j=0;j<2;j++)
  {
    switch(i++)
   {
    case 0:p24=1;p23=1;p22=1;P0=smg[a[0]];break;
    case 1:p24=1;p23=1;p22=0;P0=smg[a[1]];break;
   }
   delayMS(5);
   if(i==2)i=0;
  }
}
if((num<1000)&(num>=100))//3WEI显示
{
  for(j=0;j<3;j++)
  {
    switch(i++)
   {
    case 0:p24=1;p23=1;p22=1;P0=smg[a[0]];break;
    case 1:p24=1;p23=1;p22=0;P0=smg[a[1]];break;
    case 2:p24=1;p23=0;p22=1;P0=smg[a[2]];break;
   }
   delayMS(5);
   if(i==3)i=0;
  }
}
if((num<10000)&(num>=1000)) //4WEI显示
{
  for(j=0;j<4;j++)
  {
    switch(i++)
   {
    case 0:p24=1;p23=1;p22=1;P0=smg[a[0]];break;
    case 1:p24=1;p23=1;p22=0;P0=smg[a[1]];break;
    case 2:p24=1;p23=0;p22=1;P0=smg[a[2]];break;
    case 3:p24=1;p23=0;p22=0;P0=smg[a[3]];break;
   }
   delayMS(5);
   if(i==4)i=0;
  }
}
}
}

搞定了,问题在中断里。定时器搞错了,count没清0,程序结构冗余,优化后如下
void inter() interrupt 1
{
        TH0=(65536-10000)/256;
        TL0=(65536-10000)%256;
        count++;
        if(count==100)
        {       
                num++;count=0;
                a[0]=num%10;
                a[1]=num/10%10;
                a[2]=num/100%10;
                a[3]=num/1000%10;
        }
        if(num<10)//1WEI
        {
                p24=1;p23=1;p22=1;P0=smg[a[0]];delayMS(2);
        }
        if((num<100)&&(num>=10))//2WEI
        {
                p24=1;p23=1;p22=1;P0=smg[a[0]];delayMS(2);
                p24=1;p23=1;p22=0;P0=smg[a[1]];delayMS(2);
        }
        if((num<1000)&&(num>=100))//3WEI
        {
                p24=1;p23=1;p22=1;P0=smg[a[0]];delayMS(2);
                p24=1;p23=1;p22=0;P0=smg[a[1]];delayMS(2);
                p24=1;p23=0;p22=1;P0=smg[a[2]];delayMS(2);
        }
        if((num<10000)&&(num>=1000)) //4WEI
        {
                p24=1;p23=1;p22=1;P0=smg[a[0]];delayMS(2);
                p24=1;p23=1;p22=0;P0=smg[a[1]];delayMS(2);
                p24=1;p23=0;p22=1;P0=smg[a[2]];delayMS(2);
                p24=1;p23=0;p22=0;P0=smg[a[3]];delayMS(2);
        }
}

不错

过奖啦,

我之前也是你那样用的if语句,,, 也没有做出来,,,, 数码管的位选端的延时函数不对哦    不过看了你的代码焕然了,,呵呵, 谢谢分享

什么叫有效位?

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top