


#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
bit enabled = 0;
sbit led_enabled = P3^0;
sbit alarm = P3^1;
uchar buzzer_code;
uchar code disp_code[12]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf};4
// 共陽字形碼
void delay_ms(uint i)
{
uint j;
while(i--)
{
for(j = 0; j < 125; j++);
}
}
void int0_isr() interrupt 0
{
enabled = ! enabled;
if(enabled == 1) //主持人"開始"鍵按下,允許搶答,
led_enabled = 0; //點亮搶答允許指示燈
else
{
led_enabled = 1; //主持人再次按下"開始"鍵,關閉搶答允許指示燈
P2 = 0xff; //關閉所有搶答者指示燈
P0 = 0xff; //熄滅數碼管顯示的搶答者編號
}
}
void int1_isr() interrupt 2
{
uchar temp;
EA = 0; //關閉中斷,防止新的搶答者按鍵按下觸發中斷
temp = P1; //獲取搶答者所按的按鍵資訊
P2 = temp; //搶答者指示燈點亮
if(enabled == 0)//如果在尚未允許搶答之前有人搶答,則告警
alarm = 0;
switch(temp)//根據搶答者所按的按鍵資訊獲取搶答者編號
{
case 0xfe: buzzer_code = 1;break;
case 0xfd: buzzer_code = 2;break;
case 0xfb: buzzer_code = 3;break;
case 0xf7: buzzer_code = 4;break;
case 0xef: buzzer_code = 5;break;
case 0xdf: buzzer_code = 6;break;
case 0xbf: buzzer_code = 7;break;
case 0x7f: buzzer_code = 8;break;
default:break;
}
P0 = disp_code[buzzer_code];//顯示搶答者編號
delay_ms(1000); //延時一段時間
alarm = 1; //關閉告警
EA = 1; //開放中斷,允許接收新的中斷
}
void main()
{
EX0 = 1;
EX1 = 1;
IT0 = 1;
IT1 = 1;
EA = 1;
P1 = 0xff; //為讀取P1口連接的按鍵,先將相應的埠置1
while(1);
}
uj5u.com熱心網友回復:
防沉zsbd轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/241590.html
標籤:單片機/工控
