标题:
请各位大佬看一下,我编的lcd屏八路抢答器存在问题,不能正常显示,请帮忙指出或改正
[打印本页]
作者:
szrb
时间:
2017-5-28 18:49
标题:
请各位大佬看一下,我编的lcd屏八路抢答器存在问题,不能正常显示,请帮忙指出或改正
我编这个程序的思路:在按下RESET键复位后,在没按下START键时,选手按下键不做出响应,按下START键后,蜂鸣器发出信号,选手开始抢答,屏幕显示倒计时,若有人抢答,则屏幕上显示第一个按下按键的标号,蜂鸣器响起一会儿,对应相应的灯亮起,其他人按下无效,若无人抢答,则屏幕显示倒计时至结束,显示“Time Up!”。(希望大佬多多指导,多提出建议)
#include<reg52.h>
typedef unsigned char uint8;
typedef unsigned int uint16;
sbit SW1=P1^0;
sbit SW2=P1^1;
sbit SW3=P1^2;
sbit SW4=P1^3;
sbit SW5=P1^4;
sbit SW6=P1^5;
sbit SW7=P1^6;
sbit SW8=P1^7;
sbit START=P2^3;
sbit RESET=P2^4;
sbit ADD=P2^5;
sbit DEC=P2^6;
sbit Beep=P2^7;
sbit rs=P2^6; // 数据命令选择
sbit rw=P2^5; //读写选择
sbit e=P2^7; //使能
#define led P3
uint8 a[]="Ans successfully"; //要显示的字符
uint8 num[]=" 12345678";//键盘数据
uint8 b[]="number ";
uint8 time[]="0123456789";//显示倒计时
uint8 c[]="Time Up!";
uint8 d[]="Remaining Time:";
uint8 si[]="s";
uint8 i,t=0,n=0,m=0,s=1;
uint8 input=30; //默认剩余时间30秒
void delay(uint16);
void wrc(uint8); //写命令
void wrd(uint8); //写数据
void init();
void time0init();
uint8 keyscan(); //键盘扫描
void keypros(); //按键处理
void display();
void deng(uchar);
void FUWEI();
void main()
{
init();
time0init();
while(1)
{
display();
}
}
void delay(uint16 i)
{
while(i--);
}
void wrc(uint8 c) //写命令
{
delay(1000);
rs=0;
rw=0;
e=0;
P0=c;
e=1;
delay(10);
e=0;
}
void wrd(uint8 dat) //写数据
{
delay(1000);
rs=1;
rw=0;
e=0;
P0=dat;
e=1;
delay(10);
e=0;
rs=0;
}
void init()
{
delay(1000);
wrc(0x38);
wrc(0x38);
wrc(0x38);
wrc(0x06);
wrc(0x0c);
wrc(0x01);
}
void time0init()
{
TMOD=0X01;
TH0=0XFC;
TL0=0X18;
TR0=1;
ET0=1;
EA=1;
}
uint8 keyscan() //键盘扫描
{
uint8 value;
if(RESET==0)
{
delay(200);
FUWEI();
s=1; //表示还没开始抢答
}
if(s)
{
if(START==0) //开始抢答(需要自锁)
{
TR0=1; //开启定时器
Beep=1;
delay(500); //报警500ms
Beep=0;
m=1; //开启选手抢答权限
s=0;//自锁
}
}
if(s)
{
if(ADD==0)
{
delay(200); //防止按键抖动重复加一
input++; //时间加一
}
if(DEC==0)
{
delay(200);
input--; //时间减一
}
}
if(m) //按下开始,检查按键
{
P1=0xff;
if(P1!=0xff) //如果抢答,找出编号
{
value=P1;
return value;
}
}
}
void keypros() //按键处理
{
uint8 key=0;
key=keyscan();
switch(key)
{
case 0xfe: n=1;break;//一号选手
case 0xfd: n=2;break;//二号选手
case 0xfb: n=3;break;//三号选手
case 0xf7: n=4;break;//四号选手
case 0xef: n=5;break;//五号选手
case 0xdf: n=6;break;//六号选手
case 0xbf: n=7;break;//七号选手
case 0x7f: n=8;break;//八号选手
default : n=0;break;
}
TR0=0; //关定时器,时间不再减少
}
void display()
{
uint8 i;
if(m)
{
if(n!=0)
{
wrc(0x00+0x80);
for(i=0;i<16;i++)
{
wrd(a[i]);
}
wrc(0x40+0x80);
for(i=0;i<15;i++)
{
wrd(b[i]);
}
wrd(num[n]);
deng(n);
}
if(n=0&&input>0)
{
wrc(0x00+0x80);
for(i=0;i<16;i++)
{
wrd(d[i]);
}
wrc(0x40+0x80);
wrd(time[input/10]);
wrd(time[input%10]);
for(i=0;i<16;i++)
{
wrd(si[i]);
}
}
}
}
void deng(uint8 n)
{
switch(n)
{
case 1:led=0x01;break;
case 2:led=0x02;break;
case 3:led=0x04;break;
case 4:led=0x08;break;
case 5:led=0x10;break;
case 6:led=0x20;break;
case 7:led=0x40;break;
case 8:led=0x80;break;
}
}
void FUWEI()
{
TR0=0; //关定时器
TH0=(65536-50000)/256; //重装初值
TL0=(65536-50000)%256; //低8位
t=0; //中断函数计数清零
Beep=1;
delay(500); //报警500ms
Beep=0; //
n=0; //选手编号清零
input=30; //设置剩余时间
led=0x00;
}
void timer0() interrupt 1
{
TH0=0XFC;
TL0=0X18;
keypros();
}
void timer1() interrupt 1
{
TH1=(65536-50000)/256; //重装初值
TL1=(65536-50000)%256;
t++;
if(t==20)
{
t=0;
input--;
if(input==0) //没人抢答,自动复位
{
for(i=0;i<16;i++)
{
wrd(c[i]);
}
delay(10000);
FUWEI();
}
}
}
复制代码
作者:
szrb
时间:
2017-9-10 22:15
/**********************************************
LCD1602 八路抢答器
制作组 : 电子设计王者组
**********************************************/
#include<reg51.h>
#include<lcd1602.h>
sbit time_add=P2^3;
sbit time_dec=P2^2;
sbit START=P2^1;
sbit RESET=P2^0;
sbit beep=P2^4;
unsigned char num[]={'0','1','2','3','4','5','6','7','8','9'},num2;
unsigned char model,time,temp;
void init() //初始化函数
{
TMOD=0x01;
TH0=0x3c;
TL0=0xb0;
ET0=1;
TR0=0;
EA=1;
P2=0x0f;
model=0;
time=30;
}
void delay(unsigned char i) //延时
{
unsigned char j,k;
while(i--)
for(j=100;j>0;j--)
for(k=100;k>0;k--);
}
void star() //启动
{
lcd_xml(0x80);lcd_xsj(" welcome ");
delay(100);
lcd_xml(0xc0);lcd_xsj("===>> ");
delay(30);
lcd_xml(0xc0);lcd_xsj("=======>> ");
delay(30);
lcd_xml(0xc0);lcd_xsj("=========>> ");
delay(30);
lcd_xml(0xc0);lcd_xsj("===========>> ");
delay(30);
lcd_xml(0xc0);lcd_xsj("==============>>");
delay(30);
lcd_xml(0xc0);lcd_xsj(" Good Luck! ");
lcd_xml(0x80);lcd_xsj(" 8 Way Responder");
delay(80);
}
void led_num() //刷新倒计时
{
lcd_xml(0x80);lcd_xsj(" Countdown : ");
lcd_xml(0x8d);lcd_xsj2(num[time/10]);
lcd_xml(0x8e);lcd_xsj2(num[time%10]);
}
void reset() //复位
{
TR0=0;
P2=0x0f;
P3=0x00;
model=0;
time=30;
led_num();
lcd_xml(0xc0);lcd_xsj(" Not started ");
}
void Not_started()
{
if(time_add==0)
{
delay(10);
if(time_add==0)
{
time++;
if(time==100)
time=0;
led_num();
}
}
if(time_dec==0)
{
delay(10);
if(time_dec==0)
{
time--;
if(time==0)
time=99;
led_num();
}
}
if(START==0)
{
delay(10);
if(START==0)
{
model=1;
lcd_xml(0xc0);
lcd_xsj(" Are you ready! ");
delay(80);
TR0=1;
lcd_xml(0xc0);
lcd_xsj(" Start Responder");
beep=1;delay(20);beep=0;
}
}
}
void anjian()
{
if(P1 != 0xff)
{
delay(5);
if(P1 != 0xff)
{
temp=~P1;
model=3;
beep=1;delay(10);beep=0;
switch(temp)
{
case 0x01:num2=1;break;
case 0x02:num2=2;break;
case 0x04:num2=3;break;
case 0x08:num2=4;break;
case 0x10:num2=5;break;
case 0x20:num2=6;break;
case 0x40:num2=7;break;
case 0x80:num2=8;break;
}
lcd_xml(0xc0);lcd_xsj(" Competitor: ");
lcd_xml(0xce);lcd_xsj2(num[num2]);
lcd_xml(0x80);lcd_xsj("Ans successfully");
time=60;
delay(80);
P3=temp;
}
}
}
void finish()
{
if(!time)
{
lcd_xml(0xc0);
lcd_xsj(" Time Up! ");
}
}
void main()
{
init();
lcd_init();
star();
reset();
while(1)
{
if(RESET==0) //复位键检测
{
delay(1);
if(RESET==0)
reset();
}
switch(model)
{
case 0:Not_started();break;
case 1:anjian();break;
case 2:finish();break;
case 3:break;
default : model=0;break;
}
}
}
void timee() interrupt 1 //1s函数中断
{
unsigned char a;
TH0=0x3c;
TL0=0xb0;
a++; //是否满1s
if(a==24)
{
a=0;
if(model==1 || model==3)
{
time--;
led_num();
if(time==0)
{
model=2;
beep=1;delay(20);beep=0;
}
}
}
}
#define lcd_db P0 //数据口定义
sbit lcd_rs=P2^6;
sbit lcd_rw=P2^5;
sbit lcd_e=P2^7;
//延时函数
void lcd_delay()
{
unsigned char i;
for(i=0;i<100;i++);
}
//写数据串函数
void lcd_xsj(unsigned char dat[])
{
unsigned char a;
for(a=0;a<16;a++)
{
lcd_rs=1;
lcd_rw=0;
lcd_db=dat[a];
lcd_e=0;lcd_delay();
lcd_e=1;lcd_delay();
lcd_e=0;lcd_delay();
}
}
//写数据函数
void lcd_xsj2(unsigned char dat)
{
lcd_rs=1;
lcd_rw=0;
lcd_db=dat;
lcd_e=0;lcd_delay();
lcd_e=1;lcd_delay();
lcd_e=0;lcd_delay();
}
//写命令函数
void lcd_xml(unsigned char ml)
{
lcd_rs=0;
lcd_rw=0;
lcd_db=ml;
lcd_e=0;lcd_delay();
lcd_e=1;lcd_delay();
lcd_e=0;lcd_delay();
}
//初始化函数
void lcd_init()
{
lcd_xml(0x38);
lcd_xml(0x0c);
lcd_xml(0x01);
lcd_xml(0x06);
}
作者:
szrb
时间:
2017-9-10 22:24
/**********************************************
LCD1602 八路抢答器
制作组 : 电子设计王者组
**********************************************/
#include<reg51.h>
#include<lcd1602.h>
sbit time_add=P2^3;
sbit time_dec=P2^2;
sbit START=P2^1;
sbit RESET=P2^0;
sbit beep=P2^4;
unsigned char num[]={'0','1','2','3','4','5','6','7','8','9'},num2;
unsigned char model,time,temp;
void init() //初始化函数
{
TMOD=0x01;
TH0=0x3c;
TL0=0xb0;
ET0=1;
TR0=0;
EA=1;
P2=0x0f;
model=0;
time=30;
}
void delay(unsigned char i) //延时
{
unsigned char j,k;
while(i--)
for(j=100;j>0;j--)
for(k=100;k>0;k--);
}
void star() //启动
{
lcd_xml(0x80);lcd_xsj(" welcome ");
delay(100);
lcd_xml(0xc0);lcd_xsj("===>> ");
delay(30);
lcd_xml(0xc0);lcd_xsj("=======>> ");
delay(30);
lcd_xml(0xc0);lcd_xsj("=========>> ");
delay(30);
lcd_xml(0xc0);lcd_xsj("===========>> ");
delay(30);
lcd_xml(0xc0);lcd_xsj("==============>>");
delay(30);
lcd_xml(0xc0);lcd_xsj(" Good Luck! ");
lcd_xml(0x80);lcd_xsj(" 8 Way Responder");
delay(80);
}
void led_num() //刷新倒计时
{
lcd_xml(0x80);lcd_xsj(" Countdown : ");
lcd_xml(0x8d);lcd_xsj2(num[time/10]);
lcd_xml(0x8e);lcd_xsj2(num[time%10]);
}
void reset() //复位
{
TR0=0;
P2=0x0f;
P3=0x00;
model=0;
time=30;
led_num();
lcd_xml(0xc0);lcd_xsj(" Not started ");
}
void Not_started()
{
if(time_add==0)
{
delay(10);
if(time_add==0)
{
time++;
if(time==100)
time=0;
led_num();
}
}
if(time_dec==0)
{
delay(10);
if(time_dec==0)
{
time--;
if(time==0)
time=99;
led_num();
}
}
if(START==0)
{
delay(10);
if(START==0)
{
model=1;
lcd_xml(0xc0);
lcd_xsj(" Are you ready! ");
delay(80);
TR0=1;
lcd_xml(0xc0);
lcd_xsj(" Start Responder");
beep=1;delay(20);beep=0;
}
}
}
void anjian()
{
if(P1 != 0xff)
{
delay(5);
if(P1 != 0xff)
{
temp=~P1;
model=3;
beep=1;delay(10);beep=0;
switch(temp)
{
case 0x01:num2=1;break;
case 0x02:num2=2;break;
case 0x04:num2=3;break;
case 0x08:num2=4;break;
case 0x10:num2=5;break;
case 0x20:num2=6;break;
case 0x40:num2=7;break;
case 0x80:num2=8;break;
}
lcd_xml(0xc0);lcd_xsj(" Competitor: ");
lcd_xml(0xce);lcd_xsj2(num[num2]);
lcd_xml(0x80);lcd_xsj("Ans successfully");
time=60;
delay(80);
P3=temp;
}
}
}
void finish()
{
if(!time)
{
lcd_xml(0xc0);
lcd_xsj(" Time Up! ");
}
}
void main()
{
init();
lcd_init();
star();
reset();
while(1)
{
if(RESET==0) //复位键检测
{
delay(1);
if(RESET==0)
reset();
}
switch(model)
{
case 0:Not_started();break;
case 1:anjian();break;
case 2:finish();break;
case 3:break;
default : model=0;break;
}
}
}
void timee() interrupt 1 //1s函数中断
{
unsigned char a;
TH0=0x3c;
TL0=0xb0;
a++; //是否满1s
if(a==24)
{
a=0;
if(model==1 || model==3)
{
time--;
led_num();
if(time==0)
{
model=2;
beep=1;delay(20);beep=0;
}
}
}
}
#define lcd_db P0 //数据口定义
sbit lcd_rs=P2^6;
sbit lcd_rw=P2^5;
sbit lcd_e=P2^7;
//延时函数
void lcd_delay()
{
unsigned char i;
for(i=0;i<100;i++);
}
//写数据串函数
void lcd_xsj(unsigned char dat[])
{
unsigned char a;
for(a=0;a<16;a++)
{
lcd_rs=1;
lcd_rw=0;
lcd_db=dat[a];
lcd_e=0;lcd_delay();
lcd_e=1;lcd_delay();
lcd_e=0;lcd_delay();
}
}
//写数据函数
void lcd_xsj2(unsigned char dat)
{
lcd_rs=1;
lcd_rw=0;
lcd_db=dat;
lcd_e=0;lcd_delay();
lcd_e=1;lcd_delay();
lcd_e=0;lcd_delay();
}
//写命令函数
void lcd_xml(unsigned char ml)
{
lcd_rs=0;
lcd_rw=0;
lcd_db=ml;
lcd_e=0;lcd_delay();
lcd_e=1;lcd_delay();
lcd_e=0;lcd_delay();
}
//初始化函数
void lcd_init()
{
lcd_xml(0x38);
lcd_xml(0x0c);
lcd_xml(0x01);
lcd_xml(0x06);
}
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1