2020-03-03 16:43:54 来源:范文大全收藏下载本文
#include
unsigned char code table[]={0xc0,0xf9,0xa4,0xb0,
//0~f显示表
0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,
0xc6,0xa1,0x86,0x8e}; unsigned char code table0[]={0xf1,0xf2,0xf4,0xf8};
//P2口位选
unsigned char code table2[]={0xef,0xdf,0xbf,0x7f};
//P3口送行信号 unsigned char display[]={0,0,0,0}; //显示位 void sw1();
//子函数申明 void sw2(); void sw3(); void sw4(); void xianshi(); void init(); unsigned char temp,num2,x,x1,x2,a,count;
//变量声明 int num,num1; unsigned char key; unsigned char i,j; sbit P3_4=P3^4; sbit P3_5=P3^5; sbit P3_6=P3^6; sbit P3_7=P3^7; sbit k1=P1^0;
//位申明(时间加) sbit k2=P1^1;
//位申明(时间减) sbit k3=P1^2;
//位申明(开始) sbit k4=P1^3;
//位申明(复位) sbit sp=P1^4;
//蜂鸣器 sbit l1=P1^5;
//LED显示 sbit l2=P1^6;
//LED显示
void delay(unsigned char z)
//延时1ms子函数 {
unsigned char x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--); }
void init()
//初始化子函数 { a=0; TMOD=0x01;
//定时器T0工作方式设定
TH0=(65536-10000)/256; //装初值
TL0=(65536-10000)%256; EA=1;
//开定时器T0 ET0=1;
if(k1==0)
//判断时间加K1是否按下
{
delay(5);
//延时躲过抖动
if(k1==0)
//再次确认是否按下K1
{
num++;
//时间自加1
if(num==99)
//如果时间num=99,清零num
{
num=0;
}
num2=num;
//将num值赋值给num2
while(k1==0); //等待K1松手
}
}
if(k2==0)
//判断时间减K2是否按下
{
delay(5);
//延时躲过抖动
if(k2==0)
//再次确认是否按下K2
{
num--;
//时间自减1
if(num==-1) //如果时间num=-1,赋值num=99
{
num=99;
}
num2=num; //将num值赋值给num2
while(k2==0); //等待K2松手
}
}
if(k3==0)
//判断开始按钮K3是否按下
{
delay(5);
//延时躲过抖动
if(k3==0) //再次确认是否按下K3
{
x++;
//自加1
if(x==2) //假如x=2,清零x
{
x=0;
}
}
} }
void keyboad()
//按键检测子函数 { while(1)
{
P3=0xff;
//读引脚前需写入高电平
P3_4=0;
//置第一行线为低
temp=P3;
//P3口信息送入temp中
temp=temp & 0x0f; //屏蔽高四位,保留低四位
if (temp!=0x0f) //判断:假如列线有不为高的时候,执行if循环体
{
delay(5); //延时躲过抖动
temp=P3;
temp=temp & 0x0f;
if (temp!=0x0f)
{
temp=P3;
temp=temp & 0x0f; //判断是哪个键按下
switch(temp)
{
case 0x0e: //第一行第四个按下
{delay(5);num1=4;l2=0;xianshi();} //第一行第一个键按下
break;
case 0x0d:
//第一行第三个按下
{delay(5);num1=3;l2=0;xianshi();}
break;
case 0x0b:
//第一行第二个按下
{delay(5);num1=2;l2=0;xianshi();}
break;
case 0x07: //第一行第一个按下
{delay(5);num1=1;l2=0;xianshi();} break; //第一行第一个键按下
}
}
}
P3=0xff;
P3_5=0;
temp=P3;
temp=temp & 0x0f;
if (temp!=0x0f)
{
delay(5); //延时躲过抖动
temp=P3;
temp=temp & 0x0f;
if (temp!=0x0f)
{
temp=P3;
temp=temp & 0x0f;
switch(temp)
{
case 0x0e:
{delay(5);num1=8;l2=0;xianshi();} break;
case 0x0d:
{delay(5);num1=7;l2=0;xianshi();} break;
case 0x0b:
{delay(5);num1=6;l2=0;xianshi();} break;
case 0x07:
{delay(5);num1=5;l2=0;xianshi();} break;
}
}
}
P3=0xff;
P3_6=0;
temp=P3;
temp=temp & 0x0f;
if (temp!=0x0f)
{
delay(5); //延时躲过抖动
temp=P3;
temp=temp & 0x0f;
if (temp!=0x0f)
{
temp=P3;
temp=temp & 0x0f;
switch(temp)
{
case 0x0e:
{delay(5);num1=12;l2=0;xianshi();} break;
case 0x0d:
{delay(5);num1=11;l2=0;xianshi();} break;
case 0x0b:
{delay(5);num1=10;l2=0;xianshi();} break;
case 0x07:
{delay(5);num1=9;l2=0;xianshi();} break;
//第二行第四个键按下//第二行第三个键按下//第二行第二个键按下//第二行第一个键按下//第三行第四个键按下//第三行第三个键按下//第三行第二个键按下//第三行第一个键按下
}
}
}
P3=0xff;
P3_7=0;
temp=P3;
temp=temp & 0x0f;
if (temp!=0x0f)
{
delay(5); //延时躲过抖动
temp=P3;
temp=temp & 0x0f;
if (temp!=0x0f)
{
temp=P3;
temp=temp & 0x0f;
switch(temp)
{
case 0x0e:
{delay(5);num1=16;l2=0;xianshi();} break;
case 0x0d:
{delay(5);num1=15;l2=0;xianshi();} break;
case 0x0b:
{delay(5);num1=14;l2=0;xianshi();} break;
case 0x07:
{delay(5);num1=13;l2=0;xianshi();} break;
}
temp=P3;
P0=table[key];
}
}
} }
void xianshi() {
TR0=0;
//停止定时计数
num=0;
//倒计时num清零
sp=1;
//成功抢答,蜂鸣器叫
delay(100);
//延时一段时间
sp=0;
//关蜂鸣器
//第四行第四个键按下//第四行第三个键按下//第四行第二个键按下//第四行第一个键按下
while(1)
{
for(a=0;a
{
delay(5);
P2=table0[a];
P0=table[display[a]];
}
display[0]=num/10;
//倒计时显示0
display[1]=num%10;
display[2]=num1/10;
//显示抢答者号
display[3]=num1%10;
if(k4==0)
//判断复位键K4是否按下
{
num=num2;
//num2值赋值给num
num1=0;
//清零抢答者号显示
TR0=1;
//启动定时器TO
l1=1;
//D1,D2关闭
l2=1;
return;
}
} }
void main()
//主函数 {
l1=1;
//D1,D2关闭
l2=1;
sp=0;//初始化蜂鸣器
x=0;
num=num2=30;
//赋初值
while(1)
{
if(x==1)
//开始键按下
{
delay(5);
TR0=1;
//启动定时
while(1)
{
keyboad(); //调用按键检测子函数
if(k4==0) //判断复位键是否按下
{
l1=1; //D1,D2关闭
l2=1;
delay(5);
num=num2; //倒计时时间30秒赋值给num
TR0=1; //启动定时器T0
}
}
}
else
//开始键没有按下
{
for(a=0;a
//显示部分位选
{
delay(5);
P2=table0[a];
P0=table[display[a]];
}
display[0]=num/10; //倒计时显示0
display[1]=num%10;
display[2]=num1/10;
//显示抢答者号
display[3]=num1%10;
init();
//初始化
}
} }
void time0() interrupt 1 //定时器T0中断 {
TH0=(65536-10000)/256;
//重装初值
TL0=(65536-10000)%256; count++;
//中断次数记录
if(k4==0)
//复位键K4检测
{
num=num2;
TR0=1;
num1=0;
return;
}
for(a=0;a
{
delay(10);
P2=table0[a];
P0=table[display[a]];
} display[0]=num/10;
//倒计时显示0
display[1]=num%10;
display[2]=num1/10; //显示抢答者号
display[3]=num1%10;
if(count==100)
//1秒定时是否已到
{
count=0;
//清零记录
num--;
//显示倒计时自减一
if(num
//倒计时倒数6秒,D2亮,蜂鸣器报警
{
l1=~l1;
sp=1;
delay(100);
sp=0;
if(num==0)
//倒计时为0,D2亮,蜂鸣器报警
{
l1=0;
sp=1;delay(200);sp=0;
delay(100);
sp=1;delay(200);sp=0;
delay(100);
sp=1;delay(200);sp=0;
}
if(num==0)
{
while(1)
{
xianshi();
//调用延时子函数
if(k4==0) //假如复位键按下
{
l1=1;
//D1,D2灭
l2=1;
num=num2; //30秒倒计时赋值给num
TR0=1; //启动定时器T0
return;
}
}
}
} } x2++; if(x2==4) {
x2=0; } P3=table2[x2];
//分别给行线送低电?
人人范文网 m.inrrp.com.cn 手机版