求51单片机8路抢答器程序,请各位大侠帮帮忙,急……

:项目要求
基于AT89S52单片机设计制作一个抢答器,晶振采用12MHZ。具体设计要求如下:
(1)设计一个智力竞赛抢答器,可同时供8名选手或8个代表队参加比赛,编号为0、1、2、3、4、5、、6、7,各用一个按钮。
(2)给节目主持人设置一个控制开关,用来控制系统的清零和抢答的开始。
(3)抢答器具有数据锁存功能、显示功能和声音提示功能。抢答开始后,若有选手按动抢答按钮,编号立即锁存,并在液晶显示器上显示选手的姓名灯同时亮且伴随声音提示。此外,要封锁输入电路,禁止其他选手抢答,最先抢答选手的编号一直保持到主持人将系统清零。看清楚了是姓名

//这是六路抢答器,八路的话就是相应位显示,而不是不显示,ox00为清屏功能,如下
#include<reg51.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
uchar code table[16] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x00}; ///gong yin ji
/********************************************************************
* 名称 : Delay_1ms()
* 功能 : 延时子程序,延时时间为 1ms * x
* 输入 : x (延时一毫秒的个数)
* 输出 : 无
***********************************************************************/
void Delay_1ms(uint i)//1ms延时
{
uchar x,j;
for(j=0;j<i;j++)
for(x=0;x<=148;x++);
}

/********************************************************************
* 名称 : Keyscan()
* 功能 : 实现按键的读取。下面这个子程序是按处理 矩阵键盘 的基本方法处理的。
* 输入 : 无
* 输出 : 按键值
***********************************************************************/
uchar Keyscan(void)
{
uchar i,j, temp, Buffer[4] = {0xfe, 0xfd, 0xfb, 0xf7}; //让矩阵键盘的每行分别为低电平
for(j=0; j<4; j++)
{
P1 = Buffer[j];
temp = 0x10;
for(i=0; i<4; i++)
{
if(!(P1 & temp)) //判断P1口高4位某一行为低电平
{
return (i+j*4); //返回键码
}
temp <<= 1;
}
}
}
/********************************************************************
* 名称 : Main()
* 功能 : 主函数
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Main(void)
{
uchar Key_Value; //读出的键值
int k=0;
while(1)
{
P1 = 0xf0;
if(P1 != 0xf0) //判断有无按键按下
{
Delay_1ms(20); //按键消抖
if(P1 != 0xf0) //第二次判断有无按键按下
{
Delay_1ms(20); //按键消抖
if(P1 != 0xf0) //第三次判断有无按键按下
{
k++;
Key_Value = Keyscan();
}
}
}
if(k==1)
{
P0 = table[Key_Value];
P2 = 0x07;
}
if(Key_Value==15)
{
k=0;
P0 = table[Key_Value];
P2=0x07;
}
}
}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-05-17
按照你的要求来设计,一时也难有结果。

先参考一下:

http://hi.baidu.com/do_sermon/item/ae2e0656175672c8d2e10c27