找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4040|回复: 2
打印 上一主题 下一主题
收起左侧

请各位大佬看一下,我编的lcd屏八路抢答器存在问题,不能正常显示,请帮忙指出或改正

[复制链接]
跳转到指定楼层
楼主
ID:184770 发表于 2017-5-28 18:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
50黑币
我编这个程序的思路:在按下RESET键复位后,在没按下START键时,选手按下键不做出响应,按下START键后,蜂鸣器发出信号,选手开始抢答,屏幕显示倒计时,若有人抢答,则屏幕上显示第一个按下按键的标号,蜂鸣器响起一会儿,对应相应的灯亮起,其他人按下无效,若无人抢答,则屏幕显示倒计时至结束,显示“Time Up!”。(希望大佬多多指导,多提出建议)

  1. #include<reg52.h>
  2. typedef unsigned char uint8;
  3. typedef unsigned int uint16;

  4. sbit SW1=P1^0;
  5. sbit SW2=P1^1;
  6. sbit SW3=P1^2;
  7. sbit SW4=P1^3;
  8. sbit SW5=P1^4;
  9. sbit SW6=P1^5;
  10. sbit SW7=P1^6;
  11. sbit SW8=P1^7;
  12. sbit START=P2^3;
  13. sbit RESET=P2^4;
  14. sbit ADD=P2^5;
  15. sbit DEC=P2^6;
  16. sbit Beep=P2^7;

  17. sbit rs=P2^6;         // 数据命令选择
  18. sbit rw=P2^5;         //读写选择
  19. sbit e=P2^7;          //使能
  20. #define led P3
  21. uint8 a[]="Ans successfully";  //要显示的字符
  22. uint8 num[]=" 12345678";//键盘数据
  23. uint8 b[]="number             ";
  24. uint8 time[]="0123456789";//显示倒计时
  25. uint8 c[]="Time         Up!";
  26. uint8 d[]="Remaining Time:";
  27. uint8 si[]="s";
  28. uint8 i,t=0,n=0,m=0,s=1;
  29. uint8 input=30;                  //默认剩余时间30秒

  30. void delay(uint16);
  31. void wrc(uint8);         //写命令
  32. void wrd(uint8);          //写数据
  33. void init();
  34. void time0init();
  35. uint8 keyscan();                //键盘扫描
  36. void keypros();                //按键处理
  37. void display();
  38. void deng(uchar);
  39. void FUWEI();  


  40. void main()
  41. {
  42.         init();
  43.         time0init();
  44.         while(1)
  45.         {
  46.                 display();
  47.         }        
  48. }
  49. void delay(uint16 i)
  50. {
  51.         while(i--);
  52. }
  53. void wrc(uint8 c)         //写命令
  54. {
  55.         delay(1000);
  56.         rs=0;
  57.         rw=0;
  58.         e=0;
  59.         P0=c;
  60.         e=1;
  61.         delay(10);
  62.         e=0;
  63. }
  64. void wrd(uint8 dat)          //写数据
  65. {
  66.         delay(1000);
  67.         rs=1;
  68.         rw=0;
  69.         e=0;
  70.         P0=dat;
  71.         e=1;
  72.         delay(10);
  73.         e=0;
  74.         rs=0;
  75. }
  76. void init()
  77. {
  78.         delay(1000);
  79.         wrc(0x38);
  80.         wrc(0x38);
  81.         wrc(0x38);
  82.         wrc(0x06);
  83.         wrc(0x0c);
  84.         wrc(0x01);
  85. }
  86. void time0init()
  87. {
  88.         TMOD=0X01;
  89.         TH0=0XFC;
  90.         TL0=0X18;
  91.         TR0=1;
  92.         ET0=1;
  93.         EA=1;
  94. }
  95. uint8 keyscan()                //键盘扫描
  96. {
  97.         uint8 value;
  98.                 if(RESET==0)   
  99.         {   
  100.                 delay(200);   
  101.                 FUWEI();      
  102.                 s=1;      //表示还没开始抢答  
  103.         }   
  104.         if(s)
  105.         {
  106.         if(START==0)  //开始抢答(需要自锁)  
  107.         {   
  108.                 TR0=1;      //开启定时器   
  109.                 Beep=1;      
  110.                 delay(500);  //报警500ms
  111.                 Beep=0;      
  112.                 m=1;   //开启选手抢答权限
  113.           s=0;//自锁
  114.          }   
  115.         }        
  116.         if(s)
  117.         {   
  118.                 if(ADD==0)   
  119.                 {   
  120.                         delay(200);  //防止按键抖动重复加一   
  121.                         input++;    //时间加一
  122.                 }
  123.         if(DEC==0)   
  124.         {   
  125.                 delay(200);   
  126.                 input--;  //时间减一
  127.         }
  128.   }
  129.         if(m)    //按下开始,检查按键
  130.         {
  131.         P1=0xff;
  132.         if(P1!=0xff) //如果抢答,找出编号   
  133.                 {   
  134.                         value=P1;
  135.                         return value;
  136.                 }
  137.         }
  138. }
  139. void keypros()                //按键处理
  140. {
  141.         uint8 key=0;
  142.         key=keyscan();
  143.         switch(key)
  144.         {
  145.                 case 0xfe: n=1;break;//一号选手
  146.                 case 0xfd: n=2;break;//二号选手
  147.                 case 0xfb: n=3;break;//三号选手
  148.                 case 0xf7: n=4;break;//四号选手
  149.                 case 0xef: n=5;break;//五号选手
  150.                 case 0xdf: n=6;break;//六号选手
  151.                 case 0xbf: n=7;break;//七号选手
  152.                 case 0x7f: n=8;break;//八号选手
  153.                 default : n=0;break;
  154.         }
  155.                 TR0=0;         //关定时器,时间不再减少
  156. }
  157. void display()
  158. {
  159.         uint8 i;
  160.         if(m)
  161.         {
  162.         if(n!=0)
  163.         {
  164.         wrc(0x00+0x80);
  165.         for(i=0;i<16;i++)
  166.         {
  167.                 wrd(a[i]);
  168.         }
  169.         wrc(0x40+0x80);
  170.         for(i=0;i<15;i++)
  171.         {
  172.                 wrd(b[i]);
  173.         }
  174.         wrd(num[n]);
  175.         deng(n);
  176.   }
  177.         if(n=0&&input>0)
  178.         {
  179.                 wrc(0x00+0x80);
  180.                 for(i=0;i<16;i++)
  181.                 {
  182.                         wrd(d[i]);
  183.                 }
  184.                 wrc(0x40+0x80);
  185.                 wrd(time[input/10]);
  186.                 wrd(time[input%10]);
  187.                 for(i=0;i<16;i++)
  188.                 {
  189.                         wrd(si[i]);
  190.                 }
  191.         }
  192.   }
  193. }
  194. void deng(uint8 n)
  195. {
  196.         switch(n)
  197.         {
  198.                 case 1:led=0x01;break;
  199.                 case 2:led=0x02;break;
  200.                 case 3:led=0x04;break;
  201.                 case 4:led=0x08;break;
  202.                 case 5:led=0x10;break;
  203.                 case 6:led=0x20;break;
  204.                 case 7:led=0x40;break;
  205.                 case 8:led=0x80;break;
  206.         }
  207. }
  208. void FUWEI()  
  209. {  
  210.         TR0=0;  //关定时器
  211.         TH0=(65536-50000)/256;   //重装初值
  212.         TL0=(65536-50000)%256;  //低8位
  213.         t=0;            //中断函数计数清零  
  214.         Beep=1;      
  215.         delay(500);       //报警500ms
  216.         Beep=0; //  
  217.         n=0;      //选手编号清零
  218.         input=30; //设置剩余时间
  219.         led=0x00;
  220. }   
  221. void timer0() interrupt 1
  222. {
  223.         TH0=0XFC;
  224.         TL0=0X18;
  225.         keypros();        
  226. }
  227. void timer1() interrupt 1   
  228. {  
  229.         TH1=(65536-50000)/256;  //重装初值   
  230.         TL1=(65536-50000)%256;  
  231.         t++;               
  232.         if(t==20)               
  233.         {     
  234.                 t=0;               
  235.                 input--;            
  236.                 if(input==0)                        //没人抢答,自动复位   
  237.                 {
  238.                         for(i=0;i<16;i++)
  239.                         {
  240.                                 wrd(c[i]);
  241.                         }
  242.                   delay(10000);
  243.                  FUWEI();
  244.                 }
  245.                
  246.         }
  247. }  
复制代码

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:184770 发表于 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);
}

回复

使用道具 举报

板凳
ID:184770 发表于 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);
}

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表