最近想做一个多路抢答器,想实现的功能是可以设置倒计时的时间,设置完后按照设置的时间进行倒计时并抢答,倒计时和抢答的程序已经好了,就是时间设定的部分有问题,我想了两种:1;用中断,但是进去可以加减时间,但一退出来时间就变成0了,而且不能抢答。2:用一个子程序,但是进去可以加减时间,就是退不出来。想了好几天都没有结果,所以向各位大神求助了。帮帮忙啊!谢谢了!
新建 WinRAR ZIP 压缩文件.zip
(2.13 KB, 下载次数: 9)
下面是我的程序:
#include<reg52.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
unsigned char code tab[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //时间设定
unsigned char code LED[] = {~0x6F,~0x7F,~0x07,~0x7D,~0x6D,~0x66,~0x4F,~0x5B,~0x06,~0x3F,}; //倒计时
unsigned char code jianpan[] = {~0x3F,~0x06,~0x5B,~0x4F,~0x66,~0x6D,~0x7D,~0x07,~0x7F,~0x6F,~0x77,~0x7C,~0x39,~0x5E,~0x79,~0x71}; //键盘号码
unsigned char code jishi[] = {~0x3F,~0x06,~0x5B,~0x4F,~0x66,~0x6D,~0x7D,~0x07,~0x7F,~0x6F,};
uchar dis_buf; //显示缓存
uchar temp;
sbit P34=P3^4;
sbit P35=P3^5;
sbit P36=P3^6;
sbit P37=P3^7;
uint i=0;
uchar key,num,flag,tt,stop;
void keydown(void);
void keyscan(void);
void beep();
void
timeset();
void delay(uchar x)
{ uchar j;
while((x--)!=0)
{ for(j=0;j<125;j++)
{;}
}
}
void main()
{
flag=0;
tt=0;
TMOD=0x01;
TH0=(65535-5000)/256;
TL0=(65535-5000)%256;
EA=1; //开定时器中断和开外部中断
ET0=1;
TR0=1;
while(1)
{
timeset();
keydown();
if(flag==1) //若标志位为1,退出计时,显示抢答成功的选手号码
{
flag=0;
TR0=0;
P0 = jianpan[dis_buf%16]; //%16表示输出16进制
delay(2000);
while(1)
{
beep();
}
}
else //若标志位为0,继续计时,
if(tt==20)
{
tt=0;
if(num>=10) num=0;
P0=LED[num];
num++;
if(num==10)
TR0=0;
}
}
}
void timer0() interrupt 1 //计时中断
{
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
tt++;
}
//键盘扫描
void keyscan(void)
{ temp = 0;
P1=0xF0; //高四位输入 行为高电平 列为低电平
delay(1);
temp=P1; //读P1口
temp=temp&0xF0; //屏蔽低四位
temp=~((temp>>4)|0xF0);
if(temp==1) // p1.4 被拉低
key=1;
else if(temp==2) // p1.5 被拉低
key=2;
else if(temp==4) // p1.6 被拉低
key=3;
else if(temp==8) // p1.7 被拉低
key=4;
P1=0x0F; //低四位输入 列为高电平 行为低电平
delay(1);
temp=P1; //读P1口
temp=temp&0x0F;
temp=~(temp|0xF0);
if(temp==2) // p1.1 被拉低
key=key+0;
else if(temp==4) // p1.2 被拉低
key=key+4;
else if(temp==8) // p1.3 被拉低
key=key+8;
else
key=16;
dis_buf = key; //键值入显示缓存
dis_buf = dis_buf & 0x0f;
}//以上是键盘扫描
//判断是否按下
void keydown(void)
{
P1=0xF0;
if(P1!=0xF0) //判断按键是否按下 如果按钮按下 会拉低P1其中的一个端口
{
flag=1;
keyscan(); //调用按键扫描程序
}
}
void beep() //蜂鸣器间断响
{
P34=1;
delay(150);
P34=0;
delay(150);
}
void timeset() //时间设定:P34开始设定,P35退出设定,P36时间加,P37时间减
{
while(P34==0)
{
delay(5);
if(P34==0)
{
if(P35==0)
{
delay(5);
if(P35==0)
break;
}
if(P36==0)
{
delay(5);
if(P36==0)
{
i++;
delay(200);
if(i>=9) i=9;
}
}
else
{
if(P37==0)
{
delay(5);
if(P37==0)
{
i--;
delay(200);
if((i<=0)||(i>9)) i=0;
}
}
}
P0=~tab
;
}
}
这是中断的
void counter0(void) interrupt 0
{
EX0=0;
while(flag==1)
{
if(P35==0) flag=0;
if(P36==0)
{
delay(5);
if(P36==0)
{
i++;
delay(200);
if(i>=9) i=9;
}
}
else
{
if(P37==0)
{
delay(5);
if(P37==0)
{
i--;
delay(200);
if((i<=0)||(i>9)) i=0;
}
}
}
P0=~tab;
num=i;
}
EX0=1;
}
}
一周热门 更多>