#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
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
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
}
#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
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
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
}