#includereg51.h
#defineu8unsignedchar
#defineu16unsignedint
u8b1,ss1,ss2,i,js;
bitdd;
sbitout=P3^5; ///输出控制口
sbits0=P3^0; ///启动键
sbits1=P3^1; ///设置键
sbits2=P3^2; ///减
sbits3=P3^3; ///加
sbitge=P3^7;
sbitshi=P3^4;
charcodeshu[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};//数码管段码
voiddelay(u16q) //普通延时函数
{
chard;
while(q--)
for(d=;d0;d--);
}
voidZD_Init() //中断初始化子函数
{
EA=1; //打开总中断开关
ET0=1; //打开定是器0开关
TR0=0; //定时器0开始工作
TMOD=0X01; //选择定时器0工作模式位定时器
TH0=(-)/; //定时器高8位装初值 定时50MS
TL0=(-)%; //定时器低8位装初值
}
voidxianshi(u8ss,u8gg) //显示函数
{
if(b1==2) //判断各十位数闪烁标志位
{
if(dd)
{
ss=10;
}
}
if(b1==1) //判断各位数闪烁标志位
{
if(dd)
{
gg=10;
}
}
P1=shu[ss]+0x80;
shi=0;
delay(2);
shi=1;
P1=shu[gg];
ge=0;
delay(2);
ge=1;
}
voidjianpan() //键盘扫描子程序
{
if(s3==0) ///设置建
{
delay(5);
if(s3==0)
{
while(s3==0)xianshi(ss1,ss2); //松手检测
b1++;
TR0=1;
if(b1=3)
{
b1=0;
TR0=0;
}
}
}
if(b1!=0) ///判断是否按下设置健
{
if(s2==0) ///加建
{
delay(5);
if(s2==0)
{
while(s2==0)xianshi(ss1,ss2); //松手检测
if(b1==1) ////判断各位数加
{
ss2++;
if(ss2==10)ss2=0;
}
if(b1==2) ///判断十位数加
{
ss1++;
if(ss1==10)ss1=0;
}
}
}
if(s1==0) //减键
{
delay(5);
if(s1==0)
{
while(s1==0)xianshi(ss1,ss2); ///松手检测
if(b1==1) ///判断各位数减
{
ss2--;
if(ss2==)ss2=9;
}
if(b1==2) ////判断十位数减
{
ss1--;
if(ss1==)ss1=9;
}
}
}
}
if(b1==0) ///启动电焊键
{
if(s0==0)
{
delay(5);
if(s0==0)
{
while(s0==0);
js=ss1*10+ss2;
if(js!=0)
{
TR0=1;
out=0;
}
}
}
}
}
voidmain()
{
ZD_Init(); //中断初始化
while(1)
{
xianshi(ss1,ss2);//显示子函数
jianpan(); //键盘子程序
}
}
voidTime0()interrupt1using0 //中断函数
{
TH0=(-)/; //定时器高8位装初值 重装初值
TL0=(-)%; //定时器低8位装初值 重装初值
if(b1!=0)
{
i++;
if(i==10) //数码管的闪烁
{
i=0;
dd=~dd;
}
out=1;
}
else
{
js--;
if(js==0) //点焊延时输出
{
TR0=0;
out=1;
}
}
}