天行健,君子以自强不息
分类: C/C++
2010-06-03 14:28:33
|
源代码如下:
#include
#define uchar unsigned char
#define uint unsigned int
///数码管位选管脚定义
#define wei P0
///数码管段选管脚定义
#define duan P2
///短延时时间宏定义
#define short_delay 1
///抢答开始标志位
#define start 0
#define not_start 1
///八组参赛者抢答按键
#define key0 P1^0
#define key1 P1^1
#define key2 P1^2
#define key3 P1^3
#define key4 P1^4
#define key5 P1^5
#define key6 P1^6
#define key7 P1^7
///主持人加分键
#define key8 P3^6
///主持人抢答开始按键
#define key9 P3^7
///主持人数码管位选管脚定义
sbit zhuchi_dis1=P3^0;
sbit zhuchi_dis2=P3^1;
///蜂鸣器输出管脚定义
sbit ring=P3^4;
uchar cnt=20;
uchar person=0;//主持台前抢答者编号显示
///数码管位码表
uchar wei_dis[]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x
///数码管断码表
uchar table[]={
0x
0x66,0x6d,0x7d,0x07,
0x
};
volatile uchar fenshu1,fenshu2,fenshu3,fenshu4,fenshu5,fenshu6,fenshu7,fenshu8;//八组成员分数缓冲寄存器
uchar daojishi_flag=1; //倒计时标志位
uchar start_flag=not_start;//开始抢答标志位
///*********************蜂鸣器初始化****************************///
void ring_init()
{
ring=0;
}
///*********************记分牌分数初始化****************************///
void init_fenshu()
{
fenshu1=0;
fenshu2=0;
fenshu3=0;
fenshu4=0;
fenshu5=0;
fenshu6=0;
fenshu7=0;
fenshu8=0;
}
///*********************定时器0初始化****************************///
void timer0_init()
{
TMOD=0x01;
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
ET0=1;//开定时器0中断
//TR0=1;//定时器0开始计数
}
///*********************外部中断0初始化****************************///
void int0_init()
{
EX0=1;//外部中断0使能
IT0=0;//负边沿触发方式
EA=1; //总中断使能
}
///*********************外部中断1初始化****************************///
void int1_init()
{
EX1=1;//外部中断0使能
IT1=0;//负边沿触发方式
EA=1; //总中断使能
}
///*********************设备初始化****************************///
void int_device()
{
timer0_init();
int0_init();
int1_init();
init_fenshu();
ring_init();
}
///*********************延时子函数****************************///
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
///*********************数码管显示子函数****************************///
void led_display(uchar z)
{
///*********************主持人****************************///
zhuchi_dis1=0;
duan=table[z/10];
delay(short_delay);
zhuchi_dis1=1;
zhuchi_dis2=0;
duan=table[z%10];
delay(short_delay);
zhuchi_dis2=1;
///*********************第一组****************************///
wei=wei_dis[0];
duan=table[fenshu1/10];
delay(short_delay);
wei=wei_dis[1];
duan=table[fenshu1%10];
delay(short_delay);
///*********************第二组****************************///
wei=wei_dis[2];
duan=table[fenshu2/10];
delay(short_delay);
wei=wei_dis[3];
duan=table[fenshu2%10];
delay(short_delay);
///*********************第三组****************************///
wei=wei_dis[4];
duan=table[fenshu3/10];
delay(short_delay);
wei=wei_dis[5];
duan=table[fenshu3%10];
delay(short_delay);
///*********************第四组****************************///
wei=wei_dis[6];
duan=table[fenshu4/10];
delay(short_delay);
wei=wei_dis[7];
duan=table[fenshu4%10];
delay(short_delay);
///*********************第五组****************************///
wei=wei_dis[8];
duan=table[fenshu5/10];
delay(short_delay);
wei=wei_dis[9];
duan=table[fenshu5%10];
delay(short_delay);
///*********************第六组****************************///
wei=wei_dis[10];
duan=table[fenshu6/10];
delay(short_delay);
wei=wei_dis[11];
duan=table[fenshu6%10];
delay(short_delay);
///*********************第七组****************************///
wei=wei_dis[12];
duan=table[fenshu7/10];
delay(short_delay);
wei=wei_dis[13];
duan=table[fenshu7%10];
delay(short_delay);
///*********************第八组****************************///
wei=wei_dis[14];
duan=table[fenshu8/10];
delay(short_delay);
wei=wei_dis[15];
duan=table[fenshu8%10];
delay(5);
}
///*********************主函数****************************///
void main()
{
//fenshu1=12;
uchar second=15;
int_device();
while(1)
{
if(start_flag==start)
TR0=1;
else
TR0=0;
if(daojishi_flag)
{
if(cnt==0) //定时已达到一秒
{
cnt=20;
second--;
if(second<=0)
{
daojishi_flag=0;
second=0;
}
}
led_display(second);
}
else
led_display(person);
}
}
///*********************外部中断0服务子函数****************************///
void int0() interrupt 0
{
if( start_flag==not_start)
ring=1;
if(start_flag==start)
ring=0;
switch(P1)
{
case 0xfe: {person=1;daojishi_flag=0;} break;
case 0xfd: {person=2;daojishi_flag=0;} break;
case 0xfb: {person=3;daojishi_flag=0;} break;
case 0xf7: {person=4;daojishi_flag=0;} break;
case 0xef: {person=5;daojishi_flag=0;} break;
case 0xdf: {person=6;daojishi_flag=0;} break;
case 0xbf: {person=7;daojishi_flag=0;} break;
case 0x
//case 0xfd: person=2; break;
}
}
///*********************外部中断1服务子函数****************************///
void int1() interrupt 2
{
if(key8==0)
{
delay(300);
switch(person)
{
case 1:{fenshu1+=5;if(fenshu1>=99) fenshu1=0;}break;
case 2:{fenshu2+=5;if(fenshu2>=99) fenshu2=0;}break;
case 3:{fenshu3+=5;if(fenshu3>=99) fenshu3=0;}break;
case 4:{fenshu4+=5;if(fenshu4>=99) fenshu4=0;}break;
case 5:{fenshu5+=5;if(fenshu5>=99) fenshu5=0;}break;
case 6:{fenshu6+=5;if(fenshu6>=99) fenshu6=0;}break;
case 7:{fenshu7+=5;if(fenshu7>=99) fenshu7=0;}break;
case 8:{fenshu8+=5;if(fenshu8>=99) fenshu8=0;}break;
}
}
if(key9==0)
{
start_flag=start;
}
}
///*********************定时器0中断服务子函数****************************///
void timer0() interrupt 1
{
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
cnt--;
}