用了一天时间,终于修改完了这个程序,请大神看看那些地方需要优化的。
#include <reg52.h> //52系列头文件
#define uchar unsigned char //宏定义
#define uint unsigned int //宏定义
sbit key=P1^4; //声明P1口的第5位是按键引脚
sbit tt=P2^6; //声明P2口按键十位数是数码管位选引脚
sbit st=P2^7; //声明P2口按键个位数是数码管位选引脚
sbit thdis=P2^0; //
sbit ttdis=P2^1; //
sbit tsdis=P2^2; //
sbit oput1=P1^0; //声明P1.0为输出引脚
uchar code table[]={ //编码定义
0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
0x80,0x90};
void delayms(uint); //声明子函数
uchar num0,num1,hendreds,tens,single; //声明显示变量的数据类型
uint time0; //声明计时变量的数据类型
/**************************************************
初始化函数
***************************************************/
void init()
{
oput1=0;
TMOD=0x01; //设置定时器0为工作方式1(0000 0001)
TH0=(65536-45827)/256; //装初值50ms一次中断
TL0=(65536-45827)%256; //
IE=0x82; //开总中断,开定时器0中断
}
/**************************************************
按键显示函数
***************************************************/
void display(uchar numdis) //
{
tens=numdis/10; //
single=numdis%10; //
tt=0; //十位数显示
P0=table[tens]; //
delayms(5);
tt=1;
P0=0xff;
st=0; //个位数显示
P0=table[single]; //
delayms(5);
st=1;
P0=0xfff;
}
/**************************************************
倒数显示函数
***************************************************/
void tdisplay(uint tdis)
{
hendreds=tdis/100;
tens=tdis%100/10;
single=tdis%10;
thdis=0;
P0=table[hendreds];
delayms(5);
thdis=1;
P0=0xff;
ttdis=0;
P0=table[tens];
delayms(5);
ttdis=1;
P0=0xff;
tsdis=0;
P0=table[single];
delayms(5);
tsdis=1;
P0=0xff;
}
/**************************************************
键盘扫描函数
***************************************************/
void keyscan()
{
if(key==0)
{
delayms(10);
if(key==0)
{
num1++; //显示变量num自增1
time0=num1*60; //输出变量时间
if(num1>5) //如果显示到5就清0
num1=0;
while(!key);
}
}
}
/**************************************************
P1.0输出的时间
***************************************************/
void oput()
{
if((num1>0)&&(time0>0))
{
oput1=1;
TR0=1;
}
else
{
oput1=0;
TR0=0;
num1=0;
time0=0;
}
}
/**************************************************
延时函数
***************************************************/
void delayms(uint xms)
{
uchar i,j;
for (i=xms;i>0;i--) //i=xms 即延时约xms毫秒
for(j=110;j>0;j--);
}
/**************************************************
主函数
***************************************************/
void main() //
{
init();
while(1) //大循环
{
keyscan();
display(num1);
tdisplay(time0);
oput();
}
}
/**************************************************
中断函数
***************************************************/
void T0_time() interrupt 1 //
{
TH0=(65536-45872)/256; //
TL0=(65536-45872)%256;
num0++;
if(num0==20) //如果到时了20次,说明一秒时间到
{
num0=0;
time0--;
}
}
|