|
主要功能:
key9:主持人键 黄灯
key1~8:抢答人键 红灯
只有主持人按下后,抢答才有效,都有声音提示
主持人按下前:lcd显示 SUSPEND 暂停
主持人按下,抢答人按下前://lcd显示 START 开始 // D9亮//时间开始倒计时
抢答人按下:lcd显示 AND 结束 相应灯亮//时间停止
抢答结束所有按键不再起作用
Proteus仿真原理图:
C程序代码:
- #include<reg52.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit rs=P3^5;
- sbit rw=P3^6;
- sbit lcden=P3^7;
- sbit button=P3^0;
- sbit D9=P3^1;
- sbit beep=P3^2;
- uchar table1[]="SUSPEND";//暂停 //要显示的字表
- uchar table2[]="START ";//开始
- uchar table3[]="AND ";//结束
- uchar table4[]=" 00:03:00";//抢答时间
- uchar fen,miao,sfmshi,sfmge,count,temp,flag,num,aa,bb,cc;
- /*************************************************************
- 延时函数 ms
- *************************************************************/
- void delay(uint t)
- {
- uint x,y;
- for(x=t;x>0;x--)
- for(y=110;y>0;y--);
- }
- /*************************************************************
- lcd1602指令写入函数
- *************************************************************/
- void write_com(uchar com)
- {
- P0=com;
- rs=0;//rs低,指令
- rw=0;//低,写
- lcden=0;
- delay(5);
- lcden=1;
- delay(5);
- lcden=0;
- }
- /*************************************************************
- lcd1602数据写入函数
- *************************************************************/
- void write_date(uchar date)
- {
- P0=date;
- rs=1;//rs高,数据
- rw=0;//低,写
- lcden=0;
- delay(5);
- lcden=1;
- delay(5);
- lcden=0;
- }
- /*************************************************************
- lcd1602初始化函数
- *************************************************************/
- void init()
- {
- fen=3;
- miao=0;
- write_com(0x38);//选择16x2显示,5x7点阵
- delay(5);
- write_com(0x0f);//开显示,开光标,光标闪烁
- delay(5);
- write_com(0x06);//读或写后,指针加一,光标加一
- delay(5);
- write_com(0x01);//清屏
- delay(5);
- /***********************************
- 中断初始化
- ************************************/
- TMOD=0x01;//定时器T0,方式1
- TH0=(65536-50000)/256;//装高8位初值
- TL0=(65536-50000)%256;//装低8位初值
- EA=1;//总中断开
- ET0=1;
- TR0=0;//定时器T0关闭,待主持按下
- }
- /*************************************************************
- 显示状态函数
- *************************************************************/
- void display1()
- {
- uchar i;
- write_com(0x80);//lcd1602第一行第一位 指令
- delay(5);
- for(i=0;i<7;i++)
- {
- if(flag==0)
- write_date(table1[i]);
- if(flag==1)
- write_date(table2[i]);
- if(flag==2)
- write_date(table3[i]);
- delay(5);
- }
- }
- /*************************************************************
- 初始化时间函数
- *************************************************************/
- void display2()
- {
- uchar i;
- write_com(0x80+0x40);//lcd1602第二行第一位 指令
- delay(5);
- for(i=0;i<12;i++)
- {
- write_date(table4[i]);
- delay(5);
- }
- }
- /*************************************************************
- 显示时间函数
- *************************************************************/
- void sfm(uchar com,uchar date)
- {
- sfmshi=date/10;
- sfmge=date%10;
- write_com(0xc0+com);
- delay(5);
- write_date(0x30+sfmshi);
- delay(5);
- write_date(0x30+sfmge);
- delay(5);
- write_com(0x80+17);
- }
- /*************************************************************
- 按键检测并时实还回按键号数
- *************************************************************/
- uchar keyscan()
- {
- if(P2!=0xff)
- {
- delay(5);//消抖
- if(P2!=0xff)
- switch(P2)
- {
- case 0xfe:num=1;break;
- case 0xfd:num=2;break;
- case 0xfb:num=3;break;
- case 0xf7:num=4;break;
- case 0xef:num=5;break;
- case 0xdf:num=6;break;
- case 0xbf:num=7;break;
- case 0x7f:num=8;break;
- default:break;
- }
- while(P2!=0xff);//松手检测
- }
- if(button==0)
- {
- delay(5);
- if(button==0&&cc==0)
- {
- while(button==0);
- num=9;
- TR0=1;
- cc=1;
- beep=0;
- delay(500);
- beep=1;
- }
-
- }
- return num;
- }
- /*************************************************************
- main函数
- *************************************************************/
- void main()
- {
- init();
- display1();
- display2();
- write_com(0x0c);//开显示,关闭光标,不闪烁
- delay(5);
- while(1)
- {
- keyscan();
- if(num==9&&TR0!=0)
- {display1();aa=1;}
- if(aa==1)
- {
- D9=0;
- flag=1;
- switch(num)
- {
- case 1:
- {P1=0xfe;TR0=0;flag=2;display1();aa=0;break;}
- case 2:
- {P1=0xfd;TR0=0;flag=2;display1();aa=0;break;}
- case 3:
- {P1=0xfb;TR0=0;flag=2;display1();aa=0;break;}
- case 4:
- {P1=0xf7;TR0=0;flag=2;display1();aa=0;break;}
- case 5:
- {P1=0xef;TR0=0;flag=2;display1();aa=0;break;}
- case 6:
- {P1=0xdf;TR0=0;flag=2;display1();aa=0;break;}
- case 7:
- {P1=0xbf;TR0=0;flag=2;display1();aa=0;break;}
- case 8:
- {P1=0x7f;TR0=0;flag=2;display1();aa=0;break;}
- default:break;
- }
- }
- if(flag==2&&bb==0)
- {
- write_com(0x80+12);
- write_date(0x30+num);
- write_date(0x50+7);
- write_date(0x40+9);
- write_date(0x40+14);
- bb=1;
- beep=0;
- delay(500);
- beep=1;
- }
- }
复制代码
因文章限制,全部资料在下面压缩包中........
多路抢答器.zip
(94.28 KB, 下载次数: 64)
|
评分
-
查看全部评分
|