|
在P3^4上加上一个按键命名为k2,k2锁死就会自动倒计时,k2打开就恢复,可以直接先用你的k1中断0中断1设置时间再锁死k2,也可以先锁死再用你的k1和中断0中断1调整
#include<reg51.h>
#define uchar unsigned char//宏替换
#define uint unsigned int
sbit k1=P3^1; //第一个按键,选择设置
sbit k2=P3^4;
bit c;
uchar code distab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};//共阴数码管段码表(0-9,-)
uchar disbuf[8]; //声明显示缓冲区8个单元
uchar hour=12; //声明小时变量,初值为12
uchar minute=59; //声明分变量,初值为59
uchar second; //声明秒变量
uchar t0n; //定时器T0中断计数,定时50ms,中断20次为1秒
uchar dis; //调时状态下,显示小数点位
void delay() //延时子程序,用于显示子程序
{
uint j;
for(j=300;j>0;j--);
}
//显示子程序,参数dis为显示小数点位
void display(uchar dis) // ????????????????????????????
{
uchar j,disbit=0x01; //位码(未知)
for(j=0;j<8;j++)
{
P2=~disbit; //P2口输出位码
if(dis>0&&dis==j) //调时状态下,显示小数点(看不懂)
P0=distab[disbuf[j]]+0x80; //在小时,分,秒位上显示小数点
else
P0=distab[disbuf[j]]; //其它位正常显示
disbit<<=1; //取下一个位码
delay(); //延时
}
}
void main()//主函数
{
disbuf[2]=disbuf[5]=10;//数码管第3,6位显示-
TMOD=0x01; //t0定时器方式1
TH0 =0x3C; //单片机晶振频率=12M,定时50ms,时间常数=3CB0
TL0 =0xB0;
IE =0x82; //开定时器T0中断(EX1外部中断1没开)
TR0 =1; //启动定时器T0
IT0 =1; //设置外部中断为下降沿有效
IT1 =1;
while(1)
{
display(dis); //调显示子程序(未知)
if(k1==0) //选择设置
{
dis++; //停止计时,进入调时状态(暂停了秒计时)
EX0=1; //调时状态下,允许外部INT0,INT1中断
EX1=1; //用来调小时,分,秒
if(dis>7) //调小时,在小时位显示小数点
{
dis=0; //灭小数点
t0n=0; //调时结束,开始计时
TR0=1;
EX0=0; //关外部中断
EX1=0;
}
else if(dis==2)dis=4; //调分,在分位显示小数点
else if(dis==5)dis=7; //调秒,在秒位显示小数点
while(k1==0)display(dis); //等待按键释放
}
//这里做改动
if(c==0);
{
if(t0n>=20&&dis==0) //中断20次,1秒到,计时状态下时钟计时
{
t0n=0;
second++; //秒加1
if(second>=60) //到60秒
{
second=0;
minute++; //分加1
if(minute>=60) //到60分
{
minute=0;
hour++; //小时加1
if(hour>=24)
hour=0;
}
}
}
}
if(k2==0)
{
c=~c;
ET0=~ET0;
while(k1==0)display(dis);
}
if(c==1)
{
second--; //秒加1
if(second==0xff) //到60秒
{
second=59;
minute--; //分加1
if(minute==0xff) //到60分
{
minute=59;
hour--; //小时加1
if(hour==0xff)
hour=23;
}
}
}
disbuf[0]=hour/10; //显示小时十位
disbuf[1]=hour%10; //显示小时个位
disbuf[3]=minute/10; //显示分十位
disbuf[4]=minute%10; //显示分个位
disbuf[6]=second/10; //显示秒十位
disbuf[7]=second%10; //显示秒个位
}
}
//定时器T0中断服务子程序
void T0_isr() interrupt 1
{
TH0=0x3C; //重写时间常数
TL0=0xb0;
t0n++; //中断次加1
}
//外部中断INT0服务程序,调时状态下,加1
void INT0_ISR() interrupt 0
{
if(dis==1) //调小时
{
hour++; //小时加1
if(hour>=24)
hour=0;
}
if(dis==4) //调分
{
minute++; //分加1
if(minute>=60)
minute=0;
}
if(dis==7) //调秒
{
second++; //秒加1
if(second>=60)
second=0;
}
}
//外部中断INT1服务程序,调时状态下,减1
void INT1_ISR() interrupt 2
{
if(dis==1) //调小时
{
hour--; //小时减1
if(hour==0xff)
hour=23;
}
if(dis==4) //调分
{
minute--; //分减1
if(minute==0xff)
minute=59;
}
if(dis==7) //调秒
{
second--;//秒减1
if(second==0xff)
second=59;
}
}
|
|