下面是我的秒表程序,当按KEY键,秒表走动,当停秒时,LED数码管有很多的鬼影,数码管停秒的亮度比走动时要暗很多,想了很久,还没解决问题,求指导,谢谢。
#include"reg51.h"
#include"intrins.h"
#define uchar unsigned char
#define uint unsigned int
sfr AUXR=0x8e;
sfr P4=0xC0;
sfr P4M0=0xB4;
sfr P4M1=0xB3;
sfr P2M0=0x96;
sfr P2M1=0x95;
sfr P0M0=0x94;
sfr P0M1=0x93;
sbit DUANA=P2^6;
sbit DUANB=P2^7;
sbit DUANC=P4^5;
sbit key=P3^5;
unsigned char code LedChar[16] = {
0xDD,0x11,0xD6,0x57,0x1B,0x4F,0xCF,0x15,0xDF,0x5F,0x9F,0xCB,0xCC,0xD3,0xCE,0x8E
}; //用数组来存储数码管真值表
unsigned char code LedShi[10] = {
0xFD,0x31,0xF6,0x77,0x3B,0x6F,0xEF,0x35,0xFF,0x7F
};
unsigned char LedNumber[3] = {0}; //定义全局变量
unsigned char j = 0;
unsigned int counter = 0;
//unsigned char disp;
void Delay(uint x)
{
uint a,b;
for(a=x;a>0;a--)
for(b=110;b>0;b--);
}
void main()
{
unsigned long stopwatch =0;
P2M1=0x00;
P2M0=0xFF;
P0M1=0x00;
P0M0=0xFF;
P4M1=0x00;
P4M0=0xFF;
AUXR|=0x80; //定时器0为1T模式//
//AUXR&=0x7f; //定时器0为12T模式//
TMOD=0x00; //设置定时器0为模式0
TH0=(65536-60000)/256;
TL0=(65536-60000)%256; //定时5MS初值
EA=1; //开总中断//
ET0=1; //开启内部定时器中断0;
TR0=0; //打开定时器0
DUANA=1;
DUANB=1;
DUANC=1;
P0=LedChar[0];
while(1)
{
if(key==0)
{
Delay(10);
{
if(key==0)
{
TR0=1;
}
else
TR0=0;
}
}
if(20 == counter) //判断定时器0溢出是否达到20次
{
counter = 0;
stopwatch++;
LedNumber[0] = stopwatch%10;
LedNumber[1] = stopwatch/10%10;
LedNumber[2] = stopwatch/100%10;
}
P0 = 0x00; //消隐
switch(j)
{
case 0: DUANA=0; DUANB=0; DUANC=1; j++; P0=LedChar[LedNumber[0]]; break;
case 1: DUANA=0; DUANB=1; DUANC=0; j++; P0=LedShi[LedNumber[1]]; break;
case 2: DUANA=1; DUANB=0; DUANC=0; j=0; P0=LedChar[LedNumber[2]]; break;
default: break;
} //动态刷新
}
}
void InterruptTimer0() interrupt 1 //中断函数的特殊写法,数字’1’为中断入口号
{
unsigned long stopwatch =0;
TH0=(65536-60000)/256; //溢出后进入中断重新赋值
TL0=(65536-60000)%256;
counter++; //计数值counter加1
}
|