久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5124|回復: 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. }  
復制代碼

回復

使用道具 舉報

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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日本三级线观看 视频 | 精品一区二区免费视频 | 欧美一级网站 | 黄片毛片 | 91玖玖| 国产精品亚洲精品久久 | 国产精品美女久久久久久久网站 | 国产精品日日做人人爱 | 久久99精品久久久久久国产越南 | 久久国产精品一区 | 久久99精品久久久 | 欧美性网 | 超碰97免费观看 | 国产高清在线观看 | 日本久久久一区二区三区 | 毛片在线看片 | 日韩毛片 | 亚洲国产精品第一区二区 | 久久亚洲一区 | 欧美一区二区三区视频在线 | 一区二区三区四区不卡 | 玖玖视频 | 日韩久久精品视频 | 国产黄色一级片 | 欧美自拍视频 | 亚洲最大av网站 | 玖玖玖在线 | 一色一黄视频 | 一级美国黄色片 | 欧美黄色大片在线观看 | 亚洲一区国产 | 韩国av一区二区 | 蜜桃av一区二区三区 | 国产一区二区在线看 | 免费黄色在线观看 | 中文字幕在线精品 | 自拍偷拍视频网 | 精品一区二区av | 国产精品日韩欧美一区二区三区 | 久久久久国产精品 | 久久一二区 |