找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 5170|回復(fù): 2
收起左側(cè)

請(qǐng)各位大佬看一下,我編的lcd屏八路搶答器存在問題,不能正常顯示,請(qǐng)幫忙指出或改正

[復(fù)制鏈接]
ID:184770 發(fā)表于 2017-5-28 18:49 | 顯示全部樓層 |閱讀模式
50黑幣
我編這個(gè)程序的思路:在按下RESET鍵復(fù)位后,在沒按下START鍵時(shí),選手按下鍵不做出響應(yīng),按下START鍵后,蜂鳴器發(fā)出信號(hào),選手開始搶答,屏幕顯示倒計(jì)時(shí),若有人搶答,則屏幕上顯示第一個(gè)按下按鍵的標(biāo)號(hào),蜂鳴器響起一會(huì)兒,對(duì)應(yīng)相應(yīng)的燈亮起,其他人按下無效,若無人搶答,則屏幕顯示倒計(jì)時(shí)至結(jié)束,顯示“Time Up!”。(希望大佬多多指導(dǎo),多提出建議)

  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;         // 數(shù)據(jù)命令選擇
  18. sbit rw=P2^5;         //讀寫選擇
  19. sbit e=P2^7;          //使能
  20. #define led P3
  21. uint8 a[]="Ans successfully";  //要顯示的字符
  22. uint8 num[]=" 12345678";//鍵盤數(shù)據(jù)
  23. uint8 b[]="number             ";
  24. uint8 time[]="0123456789";//顯示倒計(jì)時(shí)
  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;                  //默認(rèn)剩余時(shí)間30秒

  30. void delay(uint16);
  31. void wrc(uint8);         //寫命令
  32. void wrd(uint8);          //寫數(shù)據(jù)
  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)          //寫數(shù)據(jù)
  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;      //開啟定時(shí)器   
  109.                 Beep=1;      
  110.                 delay(500);  //報(bào)警500ms
  111.                 Beep=0;      
  112.                 m=1;   //開啟選手搶答權(quán)限
  113.           s=0;//自鎖
  114.          }   
  115.         }        
  116.         if(s)
  117.         {   
  118.                 if(ADD==0)   
  119.                 {   
  120.                         delay(200);  //防止按鍵抖動(dòng)重復(fù)加一   
  121.                         input++;    //時(shí)間加一
  122.                 }
  123.         if(DEC==0)   
  124.         {   
  125.                 delay(200);   
  126.                 input--;  //時(shí)間減一
  127.         }
  128.   }
  129.         if(m)    //按下開始,檢查按鍵
  130.         {
  131.         P1=0xff;
  132.         if(P1!=0xff) //如果搶答,找出編號(hào)   
  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;//一號(hào)選手
  146.                 case 0xfd: n=2;break;//二號(hào)選手
  147.                 case 0xfb: n=3;break;//三號(hào)選手
  148.                 case 0xf7: n=4;break;//四號(hào)選手
  149.                 case 0xef: n=5;break;//五號(hào)選手
  150.                 case 0xdf: n=6;break;//六號(hào)選手
  151.                 case 0xbf: n=7;break;//七號(hào)選手
  152.                 case 0x7f: n=8;break;//八號(hào)選手
  153.                 default : n=0;break;
  154.         }
  155.                 TR0=0;         //關(guān)定時(shí)器,時(shí)間不再減少
  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;  //關(guān)定時(shí)器
  211.         TH0=(65536-50000)/256;   //重裝初值
  212.         TL0=(65536-50000)%256;  //低8位
  213.         t=0;            //中斷函數(shù)計(jì)數(shù)清零  
  214.         Beep=1;      
  215.         delay(500);       //報(bào)警500ms
  216.         Beep=0; //  
  217.         n=0;      //選手編號(hào)清零
  218.         input=30; //設(shè)置剩余時(shí)間
  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)                        //沒人搶答,自動(dòng)復(fù)位   
  237.                 {
  238.                         for(i=0;i<16;i++)
  239.                         {
  240.                                 wrd(c[i]);
  241.                         }
  242.                   delay(10000);
  243.                  FUWEI();
  244.                 }
  245.                
  246.         }
  247. }  
復(fù)制代碼

回復(fù)

使用道具 舉報(bào)

ID:184770 發(fā)表于 2017-9-10 22:24 | 顯示全部樓層
/**********************************************
        LCD1602 八路搶答器
  制作組 : 電子設(shè)計(jì)王者組
**********************************************/
#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()        //初始化函數(shù)
{
        TMOD=0x01;
        TH0=0x3c;
        TL0=0xb0;
        ET0=1;
        TR0=0;
        EA=1;
        P2=0x0f;
        model=0;
        time=30;
}

void delay(unsigned char i)        //延時(shí)
{
        unsigned char j,k;
        while(i--)
                for(j=100;j>0;j--)
                        for(k=100;k>0;k--);
}

void star() //啟動(dòng)
{
        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() //刷新倒計(jì)時(shí)
{
        lcd_xml(0x80);lcd_xsj(" Countdown :    ");
        lcd_xml(0x8d);lcd_xsj2(num[time/10]);
        lcd_xml(0x8e);lcd_xsj2(num[time%10]);
}

void reset()        //復(fù)位
{
        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)        //復(fù)位鍵檢測(cè)
                {
                        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函數(shù)中斷
{
        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                        //數(shù)據(jù)口定義
sbit lcd_rs=P2^6;
sbit lcd_rw=P2^5;
sbit lcd_e=P2^7;

//延時(shí)函數(shù)
void lcd_delay()
{
        unsigned char i;
        for(i=0;i<100;i++);
}

//寫數(shù)據(jù)串函數(shù)
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();
        }
}

//寫數(shù)據(jù)函數(shù)
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();
}

//寫命令函數(shù)
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();
}

//初始化函數(shù)
void lcd_init()               
{
        lcd_xml(0x38);
        lcd_xml(0x0c);
        lcd_xml(0x01);
        lcd_xml(0x06);
}

回復(fù)

使用道具 舉報(bào)

ID:184770 發(fā)表于 2017-9-10 22:15 | 顯示全部樓層
/**********************************************
        LCD1602 八路搶答器
  制作組 : 電子設(shè)計(jì)王者組
**********************************************/
#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()        //初始化函數(shù)
{
        TMOD=0x01;
        TH0=0x3c;
        TL0=0xb0;
        ET0=1;
        TR0=0;
        EA=1;
        P2=0x0f;
        model=0;
        time=30;
}

void delay(unsigned char i)        //延時(shí)
{
        unsigned char j,k;
        while(i--)
                for(j=100;j>0;j--)
                        for(k=100;k>0;k--);
}

void star() //啟動(dòng)
{
        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() //刷新倒計(jì)時(shí)
{
        lcd_xml(0x80);lcd_xsj(" Countdown :    ");
        lcd_xml(0x8d);lcd_xsj2(num[time/10]);
        lcd_xml(0x8e);lcd_xsj2(num[time%10]);
}

void reset()        //復(fù)位
{
        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)        //復(fù)位鍵檢測(cè)
                {
                        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函數(shù)中斷
{
        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                        //數(shù)據(jù)口定義
sbit lcd_rs=P2^6;
sbit lcd_rw=P2^5;
sbit lcd_e=P2^7;

//延時(shí)函數(shù)
void lcd_delay()
{
        unsigned char i;
        for(i=0;i<100;i++);
}

//寫數(shù)據(jù)串函數(shù)
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();
        }
}

//寫數(shù)據(jù)函數(shù)
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();
}

//寫命令函數(shù)
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();
}

//初始化函數(shù)
void lcd_init()               
{
        lcd_xml(0x38);
        lcd_xml(0x0c);
        lcd_xml(0x01);
        lcd_xml(0x06);
}

回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表