大家帮我改改 按键不管事 TR1 不停止
时间:10-02
整理:3721RD
点击:
大家帮我改改 按键不管事 TR1 不停止
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
uchar temp,aa,miao,fen,shi;
int K1_FLAG=0;
sbit k1=P3^0;
sbit k2=P3^1;
sbit k3=P3^2;
sbit k4=P3^3;
sbit DELL=P1^5;
uchar code table[]={ //数码管编码表
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f};
void display(uchar miao,uchar fen,uchar shi);
void delay(uint z);
void tirm();
void init();
void beep();
void main()
{
init();//初始化子程序
shi=23;
fen=58;
miao=30;
while(1)
{
if(k1==0)
{
delay(10);
if(k1==0)
{
beep();
K1_FLAG=1;
delay(5);
}
}
if(K1_FLAG==1)
tirm();
display(miao,fen,shi);
}
}
void tirm()
{
TR1=0;
while(1)
{
if(k2==0) // 调分
{
delay(2);
if(k2==0)
while(!k2);
beep();
fen++;
if(fen==60) fen=0;
}
if(k3==0) // 调小时
{
delay(2);
if(k3==0)
while(!k3);
beep();
shi++;
if(shi==24) shi=0;
}
if(k4==0)
{
delay(5);
if(k3==0)
while(!k4);
TR1=1;K1_FLAG=0;
}
}
}
void beep()
{
int j,y,m;
m++;
for(j=0;j<1000;j++)
{
DELL=~DELL;
for(y=0;y<15;y++);
}
while(m<5);
delay(200);
}
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void display(uchar miao,uchar fen,uchar shi) // 显示子函数
{
P0=0x00;
P0=table[miao%10];
P2=0xfe;
delay(1);
P0=0x00;
P0=table[miao/10];
P2=0xfd;
delay(1);
P0=0x40;
P2=0xfb; // 显示--
delay(1);
P0=0x00;
P0=table[fen%10];
P2=0xf7;
delay(1);
P0=0x00;
P0=table[fen/10];
P2=0xef;
delay(1);
P0=0x40;
P2=0xdf; // 显示--
delay(1);
P0=0x00;
P0=table[shi%10];
P2=0xbf;
delay(1);
P0=0x00;
P0=table[shi/10];
P2=0x7f;
delay(1);
}
void init() // 初始化子函数
{
TMOD=0x11;
TH0=(65536-10000)/256;
TL0=(65536-10000)%256; //定时器初值,定时50ms(12M晶振),由于考虑MCU指令处理时间,此处赋初值位45872
TH1=(65536-30000)/256;
TL1=(65536-30000)%256;
EA=1;
ET0=1;
ET1=1;
TR0=1;
TR1=1;
}
void timer0() interrupt 1 //定时计数器中断
{
TH0=(65536-20000)/256;
TL0=(65536-20000)%256; //2ms
display(miao,fen,shi);
}
void timer1() interrupt 3 //定时计数器中断
{
TH1=(65536-30000)/256;
TL1=(65536-30000)%256; //10ms
aa++;
if(aa==30) //中断2次位1S,秒加1
{
miao++;
aa=0;
if(miao==60)
{
fen++; // 满60S, 分加1,秒清0
miao=0;
if(fen==60)
{
shi++; // 小时加1
fen=0;
if(shi==24)
miao=0;fen=0;shi=0; //小时满
}
}
}
}
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
uchar temp,aa,miao,fen,shi;
int K1_FLAG=0;
sbit k1=P3^0;
sbit k2=P3^1;
sbit k3=P3^2;
sbit k4=P3^3;
sbit DELL=P1^5;
uchar code table[]={ //数码管编码表
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f};
void display(uchar miao,uchar fen,uchar shi);
void delay(uint z);
void tirm();
void init();
void beep();
void main()
{
init();//初始化子程序
shi=23;
fen=58;
miao=30;
while(1)
{
if(k1==0)
{
delay(10);
if(k1==0)
{
beep();
K1_FLAG=1;
delay(5);
}
}
if(K1_FLAG==1)
tirm();
display(miao,fen,shi);
}
}
void tirm()
{
TR1=0;
while(1)
{
if(k2==0) // 调分
{
delay(2);
if(k2==0)
while(!k2);
beep();
fen++;
if(fen==60) fen=0;
}
if(k3==0) // 调小时
{
delay(2);
if(k3==0)
while(!k3);
beep();
shi++;
if(shi==24) shi=0;
}
if(k4==0)
{
delay(5);
if(k3==0)
while(!k4);
TR1=1;K1_FLAG=0;
}
}
}
void beep()
{
int j,y,m;
m++;
for(j=0;j<1000;j++)
{
DELL=~DELL;
for(y=0;y<15;y++);
}
while(m<5);
delay(200);
}
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void display(uchar miao,uchar fen,uchar shi) // 显示子函数
{
P0=0x00;
P0=table[miao%10];
P2=0xfe;
delay(1);
P0=0x00;
P0=table[miao/10];
P2=0xfd;
delay(1);
P0=0x40;
P2=0xfb; // 显示--
delay(1);
P0=0x00;
P0=table[fen%10];
P2=0xf7;
delay(1);
P0=0x00;
P0=table[fen/10];
P2=0xef;
delay(1);
P0=0x40;
P2=0xdf; // 显示--
delay(1);
P0=0x00;
P0=table[shi%10];
P2=0xbf;
delay(1);
P0=0x00;
P0=table[shi/10];
P2=0x7f;
delay(1);
}
void init() // 初始化子函数
{
TMOD=0x11;
TH0=(65536-10000)/256;
TL0=(65536-10000)%256; //定时器初值,定时50ms(12M晶振),由于考虑MCU指令处理时间,此处赋初值位45872
TH1=(65536-30000)/256;
TL1=(65536-30000)%256;
EA=1;
ET0=1;
ET1=1;
TR0=1;
TR1=1;
}
void timer0() interrupt 1 //定时计数器中断
{
TH0=(65536-20000)/256;
TL0=(65536-20000)%256; //2ms
display(miao,fen,shi);
}
void timer1() interrupt 3 //定时计数器中断
{
TH1=(65536-30000)/256;
TL1=(65536-30000)%256; //10ms
aa++;
if(aa==30) //中断2次位1S,秒加1
{
miao++;
aa=0;
if(miao==60)
{
fen++; // 满60S, 分加1,秒清0
miao=0;
if(fen==60)
{
shi++; // 小时加1
fen=0;
if(shi==24)
miao=0;fen=0;shi=0; //小时满
}
}
}
}
要长按很久
void tirm()函数里面的while(1)干嘛用?一旦调用这个函数程序就跑步出来了,一直在这里。
程序就跑不出来,一直在在while(1)这里了。还有下次上传代码的时候注意下格式,不然看起来很麻烦。
可不是吗!
谢谢了 ,,,