|
這是我自己花了好久,查了很多資料做的八位搶答器,其他功能現(xiàn)已全部實(shí)現(xiàn),但是關(guān)于液晶屏顯示方面,依然有些問(wèn)題。
我用液晶屏做了一個(gè)分?jǐn)?shù)顯示器,一開(kāi)始八個(gè)選手都是零分時(shí)顯示沒(méi)有問(wèn)題,但是我在搶答結(jié)束后進(jìn)行加減分操作后,顯示就出現(xiàn)了問(wèn)題,檢查了很多地方都不知道哪兒出現(xiàn)了問(wèn)題,希望有大佬看到幫忙解答一下,萬(wàn)分感謝!!源程序?qū)嵲谶^(guò)長(zhǎng),都放在附件里了,麻煩了。
搜狗截圖19年03月25日2147_1.png (9.25 KB, 下載次數(shù): 71)
下載附件
初始狀態(tài)
2019-3-25 21:49 上傳
搜狗截圖19年03月25日2147_2.png (7.64 KB, 下載次數(shù): 63)
下載附件
加減分操作之后
2019-3-25 21:49 上傳
單片機(jī)源程序如下:
- #include<reg52.h>
- #include<intrins.h>
- #define uint unsigned int
- #define uchar unsigned char
- void delay(uint z) //1ms延時(shí)
- {
- uint x,y;
- for(x=z;x>0;x--)
- for(y=110;y>0;y--);
- }
- uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, //編碼表1-F和-
- 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x40};
- uchar code tablewei[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//各位燈亮
- const uchar code ZF_tab[] =
- {
- 0xF8,0xFC,0x04,0xC4,0x24,0xFC,0xF8,0x00, // -0-
- 0x07,0x0F,0x09,0x08,0x08,0x0F,0x07,0x00,
- 0x00,0x10,0x18,0xFC,0xFC,0x00,0x00,0x00, // -1-
- 0x00,0x08,0x08,0x0F,0x0F,0x08,0x08,0x00,
- 0x08,0x0C,0x84,0xC4,0x64,0x3C,0x18,0x00, // -2-
- 0x0E,0x0F,0x09,0x08,0x08,0x0C,0x0C,0x00,
- 0x08,0x0C,0x44,0x44,0x44,0xFC,0xB8,0x00, // -3-
- 0x04,0x0C,0x08,0x08,0x08,0x0F,0x07,0x00,
- 0xC0,0xE0,0xB0,0x98,0xFC,0xFC,0x80,0x00, // -4-
- 0x00,0x00,0x00,0x08,0x0F,0x0F,0x08,0x00,
- 0x7C,0x7C,0x44,0x44,0xC4,0xC4,0x84,0x00, // -5-
- 0x04,0x0C,0x08,0x08,0x08,0x0F,0x07,0x00,
- 0xF0,0xF8,0x4C,0x44,0x44,0xC0,0x80,0x00, // -6-
- 0x07,0x0F,0x08,0x08,0x08,0x0F,0x07,0x00,
- 0x0C,0x0C,0x04,0x84,0xC4,0x7C,0x3C,0x00, // -7-
- 0x00,0x00,0x0F,0x0F,0x00,0x00,0x00,0x00,
- 0xB8,0xFC,0x44,0x44,0x44,0xFC,0xB8,0x00, // -8-
- 0x07,0x0F,0x08,0x08,0x08,0x0F,0x07,0x00,
- 0x38,0x7C,0x44,0x44,0x44,0xFC,0xF8,0x00, // -9-
- 0x00,0x08,0x08,0x08,0x0C,0x07,0x03,0x00,
- };
- sbit beep=P2^3;//蜂鳴器
- sbit deng=P2^5;//燈鎖存
- sbit duan=P2^6;//段鎖存
- sbit wei=P2^7;//位鎖存
- sbit key1=P1^0;//八個(gè)選手
- sbit key2=P1^1;
- sbit key3=P1^2;
- sbit key4=P1^3;
- sbit key5=P1^4;
- sbit key6=P1^5;
- sbit key7=P1^6;
- sbit key8=P1^7;
- sbit keyks=P2^0;//開(kāi)始
- sbit keyjia=P2^1;//加
- sbit keyjian=P2^2;//減
- sbit keyfw=P2^4;//復(fù)位
- sbit keysz=P3^0;//設(shè)置,按一次設(shè)置搶答時(shí)間,按兩次設(shè)置答題時(shí)間,按三次返回
- sbit keyqc=P3^1;//清除積分
- sbit ye=P3^2;//液晶鎖存
- sbit Reset = P3^3; //復(fù)位
- sbit RS = P3^5; //指令數(shù)據(jù)選擇
- sbit E = P3^4; //指令數(shù)據(jù)控制
- sbit CS1 = P3^6; //左屏幕選擇,低電平有效
- sbit CS2 = P3^7; //右屏幕選擇
- uchar *ZF; //數(shù)據(jù)指針,ZF為首地址
- uchar d,x,y;
- uchar num;//選手編號(hào)
- uchar t0,t1,t2,t3,t4,s3;//定時(shí)器時(shí)間
- uchar dtds,dtds1;//答題定時(shí),設(shè)置答題定時(shí)
- uchar ds,ds1;//搶答定時(shí),設(shè)置搶答定時(shí)
- uchar kaif;//開(kāi)始標(biāo)記,0表示未開(kāi)始,1表示開(kāi)始
- uchar wanf;//搶答完成標(biāo)記,0表示未完成,1表示完成
- uchar daf;//開(kāi)始答題標(biāo)記,0表示未開(kāi)始答題,1表示3s倒計(jì)時(shí),2表示開(kāi)始答題倒計(jì)時(shí)
- uchar setf;//設(shè)置標(biāo)記,0表示未在設(shè)置中,1表示正在設(shè)置搶答定時(shí),2表示正在設(shè)置答題定時(shí)
- uchar temp;//流水燈
- uchar q;//8人按鍵選擇
- uchar fen;//分?jǐn)?shù)的中間量
- uchar fen1;//八個(gè)選手的分?jǐn)?shù)
- uchar fen2;
- uchar fen3;
- uchar fen4;
- uchar fen5;
- uchar fen6;
- uchar fen7;
- uchar fen8;
- uchar f1,f2,f3,f4,f5,f6,f7,f8;
- void init() //初始化子程序
- {
- deng=0;//關(guān)燈鎖存
- duan=0;//關(guān)段鎖存
- wei=0;//關(guān)位鎖存
- beep=1;//關(guān)蜂鳴器
- keyks=1;//開(kāi)始按鍵置1
- keyfw=1;//復(fù)位按鍵置1
- keyjia=1;//加時(shí)間按鍵置1
- keyjian=1;//減時(shí)間按鍵置1
- P1=0xff;//P1口置1
- dtds=dtds1;//設(shè)置答題時(shí)間
- ds=ds1;//設(shè)置搶答時(shí)間
- temp=0xfe;
- t0=0;
- t1=0;
- t2=0;
- t3=0;
- t4=0;
- s3=3;
- kaif=0;//開(kāi)始標(biāo)記置0
- wanf=0;//搶答完成標(biāo)記置0
- daf=0;//答題標(biāo)記置0
- setf=0;//設(shè)置標(biāo)記置0
- TMOD=0x11;//設(shè)置定時(shí)器0為方式1
- TH0=(65536-50000)/256;//設(shè)置50ms
- TL0=(65536-50000)%256;
- EA=1;//開(kāi)總中斷
- ET0=1;//開(kāi)定時(shí)器0中斷
- TR0=0;//啟動(dòng)定時(shí)器0
- TH1=(65536-50000)/256;//設(shè)置50ms
- TL1=(65536-50000)%256;
- ET1=1;//開(kāi)定時(shí)器1中斷
- TR1=1;//啟動(dòng)定時(shí)器1
- }
- void Time0() interrupt 1 //定時(shí)器0中斷
- {
- TH0=(65536-50000)/256;
- TL0=(65536-50000)%256;
- if(daf==0)//未開(kāi)始答題,顯示搶答倒計(jì)時(shí)
- {
- t0++;
- if(t0==20)//1s計(jì)時(shí)
- {t0=0;ds--;}
- }
- if(daf==1)//開(kāi)始答題之前的3秒倒計(jì)時(shí)
- {
- t2++;
- if(t2==20)
- {
- t2=0;
- s3--;
- if(s3==0)
- {
- beep=0;
- delay(100);
- beep=1;
- daf=2;
- }
- }
- }
- if(daf==2)//開(kāi)始答題倒計(jì)時(shí)
- {
- t3++;
- if(t3==20)
- {t3=0;dtds--;}
- }
- if(ds<=6||dtds<=6)//5秒內(nèi)蜂鳴器報(bào)警
- {
- t4++;
- if(t4==20)
- {
- t4=0;
- beep=0;
- delay(100);
- beep=1;
- }
- }
- if(ds==0||dtds==0)//計(jì)時(shí)到0,關(guān)閉定時(shí)器
- {
- wanf=1;
- beep=0;
- delay(5);
- TR0=0;
- }
- }
- void Time1() interrupt 3 //定時(shí)器1中斷
- {
- TH1=(65536-50000)/256;
- TL1=(65536-50000)%256;
- t1++;
- if(t1==10)//1s計(jì)時(shí)
- {t1=0;temp=_crol_(temp,1);}//流水燈循環(huán)左移
- }
- void liushui() //流水燈
- {
- P0=temp;//燈亮
- deng=1;
- deng=0;
-
- P0=0xfe;
- wei=1;
- wei=0;
- }
- void chushi() //數(shù)碼管初始化 顯示四個(gè)-
- {
- P0=table[16];//第一位顯示-
- duan=1;
- duan=0;
- delay(5);
-
- P0=0xfd;
- wei=1;
- wei=0;
- P0=table[16];//第二位顯示-
- duan=1;
- duan=0;
- delay(5);
-
- P0=0xfb;
- wei=1;
- wei=0;
- P0=table[16];//第三位顯示-
- duan=1;
- duan=0;
- delay(5);
-
- P0=0xf7;
- wei=1;
- wei=0;
- P0=table[16];//第四位顯示-
- duan=1;
- duan=0;
- delay(5);
- }
- void shuzi(uchar a,uchar b) //數(shù)碼管時(shí)間號(hào)碼顯示
- {
- uchar shi,ge;
- shi=a/10;
- ge=a%10;
-
- P0=0xfe;
- wei=1;
- wei=0;
-
- P0=table[shi];//第一位顯示十位
- duan=1;
- duan=0;
- delay(5);
-
- P0=0xfd;
- wei=1;
- wei=0;
- P0=table[ge];//第二位顯示各位
- duan=1;
- duan=0;
- delay(5);
-
- P0=0xfb;
- wei=1;
- wei=0;
- P0=table[16];//第三位顯示-
- duan=1;
- duan=0;
- delay(5);
-
- P0=0xf7;
- wei=1;
- wei=0;
- P0=table[b];//第四位顯示選手號(hào)碼
- duan=1;
- duan=0;
- delay(5);
-
- }
- void baojing(uchar c) //違規(guī)報(bào)警
- {
- P0=0xfe;
- wei=1;
- wei=0;
-
- P0=table[15];//第一位顯示F
- duan=1;
- duan=0;
- delay(5);
-
- P0=0xfd;
- wei=1;
- wei=0;
- P0=table[15];//第二位顯示F
- duan=1;
- duan=0;
- delay(5);
-
- P0=0xfb;
- wei=1;
- wei=0;
- P0=table[16];//第三位顯示-
- duan=1;
- duan=0;
- delay(5);
-
- P0=0xf7;
- wei=1;
- wei=0;
- P0=table[c];//第四位顯示選手號(hào)碼
- duan=1;
- duan=0;
- delay(5);
-
- beep=0;//蜂鳴器報(bào)警
- delay(5);
- }
- void szxianshi(uchar d,uchar e) //數(shù)碼管設(shè)置時(shí)的顯示
- {
- uchar dshi,dge,eshi,ege;
- dshi=d/10;
- dge=d%10;
- eshi=e/10;
- ege=e%10;
-
- P0=0xfe;
- wei=1;
- wei=0;
-
- P0=table[dshi];//第一位顯示搶答定時(shí)十位
- duan=1;
- duan=0;
- delay(5);
-
- P0=0xfd;
- wei=1;
- wei=0;
- P0=table[dge];//第二位顯示搶答定時(shí)個(gè)位
- duan=1;
- duan=0;
- delay(5);
-
- P0=0xfb;
- wei=1;
- wei=0;
- P0=table[eshi];//第三位顯示答題定時(shí)十位
- duan=1;
- duan=0;
- delay(5);
-
- P0=0xf7;
- wei=1;
- wei=0;
- P0=table[ege];//第四位顯示答題定時(shí)個(gè)位
- duan=1;
- duan=0;
- delay(5);
- }
- void shezhi() //設(shè)置搶答時(shí)間和答題時(shí)間
- {
- if(keysz==0)//判斷按下一次設(shè)置按鍵
- {
- delay(5);//延時(shí)消抖
- if(keysz==0)
- {
- while(!keysz);//松手判斷
- setf++;//setf標(biāo)志加1
- while(setf==1)//設(shè)置搶答時(shí)間
- {
- liushui();
- szxianshi(ds1,dtds1);//顯示搶答時(shí)間和答題時(shí)間
- if(keyjia==0)//加搶答時(shí)間
- {
- delay(5);
- if(keyjia==0)
- {
- while(!keyjia);
- ds1++;
- ds=ds1;
- if(ds1>99)ds1=0;
- }
- }
- if(keyjian==0)//減搶答時(shí)間
- {
- delay(5);
- if(keyjian==0)
- {
- while(!keyjian);
- ds1--;
- ds=ds1;
- }
- }
- if(keysz==0)//判斷按下第二次設(shè)置按鍵
- {
- delay(5);//延時(shí)消抖
- if(keysz==0)
- {
- while(!keysz);//松手判斷
- setf++;//setf標(biāo)志加1
- }
- }
- }
- while(setf==2)//設(shè)置答題時(shí)間
- {
- liushui();
- szxianshi(ds1,dtds1);//顯示搶答時(shí)間和答題時(shí)間
- if(keyjia==0)//加答題時(shí)間
- {
- delay(5);
- if(keyjia==0)
- {
- while(!keyjia);
- dtds1++;
- dtds=dtds1;
- if(dtds1>99)dtds1=0;
- }
- }
- if(keyjian==0)//減答題時(shí)間
- {
- delay(5);
- if(keyjian==0)
- {
- while(!keyjian);
- dtds1--;
- dtds=dtds1;
- }
- }
- if(keysz==0)//判斷按下第三次設(shè)置按鍵
- {
- delay(5);//延時(shí)消抖
- if(keysz==0)
- {
- while(!keysz);//松手判斷
- setf++;//setf標(biāo)志加1
- }
- }
- }
- if(setf==3)//setf標(biāo)志滿3清0
- {
- setf=0;
- chushi();//數(shù)碼管初始化
- }
- }
- }
- }
- void xuanze() //8個(gè)選手按鍵選擇
- {
- switch (q)//num對(duì)q進(jìn)行選擇
- {
- 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;
- }
- P0=tablewei[num-1];//對(duì)應(yīng)燈亮
- deng=1;
- deng=0;
- }
- void scan() //鍵盤掃描
- {
- if(P1!=0xff&&wanf==0&&kaif==1)//判斷是否有人按下
- {
- delay(5);//延時(shí)消抖
- if(P1!=0xff&&wanf==0&&kaif==1)
- {
- q=P1;
- while(P1!=0xff);//松手判斷
- beep=0;
- delay(100);
- beep=1;
- wanf=1;//搶答完成
- daf=1;//開(kāi)始答題
- xuanze();//8人按鍵選擇
- }
- }
- }
- void jifen() //計(jì)分子函數(shù)
- {
- switch(num)//對(duì)選手號(hào)碼進(jìn)行選擇,給fen賦值
- {
- case 1:fen=fen1;break;
- case 2:fen=fen2;break;
- case 3:fen=fen3;break;
- case 4:fen=fen4;break;
- case 5:fen=fen5;break;
- case 6:fen=fen6;break;
- case 7:fen=fen7;break;
- case 8:fen=fen8;break;
- }
- if(keyjia==0)//加分
- {
- delay(5);
- if(keyjia==0)
- {
- while(!keyjia);
- fen=fen+10;
- }
- }
- if(keyjian==0)//減分
- {
- delay(5);
- if(keyjian==0)
- {
- while(!keyjian);
- fen=fen-10;
- }
- }
- switch(num)//對(duì)選手號(hào)碼進(jìn)行選擇, 把fen值賦給選手
- {
- case 1:fen1=fen;f1=fen1;break;
- case 2:fen2=fen;f2=fen2;break;
- case 3:fen3=fen;f3=fen3;break;
- case 4:fen4=fen;f4=fen4;break;
- case 5:fen5=fen;f5=fen5;break;
- case 6:fen6=fen;f6=fen6;break;
- case 7:fen7=fen;f7=fen7;break;
- case 8:fen8=fen;f8=fen8;break;
- }
- }
- void delayus(uint time) //延時(shí)
- {
- while(time --);
- }
- void writedata(uchar dat) //寫(xiě)數(shù)據(jù)
- {
- delayus(5);
- E = 1;
- RS = 1;
- P0 = dat;
- ye=1;
- ye=0;
- E = 0;
- }
- void writecmd(uchar cmd) //寫(xiě)地址/命令
- {
- delayus(5);
- E = 1;
- RS = 0;
- P0 = cmd;
- ye=1;
- ye=0;
- E = 0;
- }
- void setPM(uchar PM) //選擇屏幕( 0-左屏,1-右屏,2-全屏 )
- {
- switch(PM)
- {
- case 0 : CS1 = 0; CS2 = 1; break;
- case 1 : CS1 = 1; CS2 = 0; break;
- default : CS1 = 0; CS2 = 0;
- }
- }
- void set_x( x) //x -> 0 : 7 頁(yè)
- {
- x = x&0x07|0xb8;
- writecmd(x);
- }
-
- void set_y( y) //y -> 0 :63 列
- {
- y = y & 0x3f|0x40;
- writecmd(y);
- }
- void chearPM(uchar PM) //清屏(0-清左屏,1-清右屏,2-清全屏 )
- {
- uchar i,j;
- setPM(PM);
- for(i = 0;i < 8;i++)
- {
- set_x(i); //從第0到第7頁(yè)
- set_y(0); //從第0列開(kāi)始
- for(j = 0;j < 64; j++) //在PM=2的情況下左右半屏同時(shí)全寫(xiě)0.
- writedata(0x00);
- }
- }
- void InitLcd() //LCD初始化
- {
- Reset = 0;
- delayus(2);
- Reset = 1;
- delayus(2);//軟件復(fù)位
- chearPM(2); //清屏
- }
- void showZF( x, y, uchar *ZF) //顯示一個(gè)字符
- {
- uchar i;
- set_x(x); set_y(y); //設(shè)置頁(yè)地址,設(shè)置列地址
- for(i = 0;i < 8;i ++) writedata(*(ZF++)); // 寫(xiě)字符的上半部分
- set_x(x + 1);set_y(y);
- for(i = 0;i < 8;i ++) writedata(*(ZF++)); // 寫(xiě)字符的下半部分
- }
- void display()//液晶顯示
- {
- setPM(0);
- showZF(0,1,ZF_tab+16);
- showZF(0,17,ZF_tab+f1*16);
- showZF(0,25,ZF_tab);
-
- showZF(2,1,ZF_tab+32);
- showZF(2,17,ZF_tab+f2*16);
- showZF(2,25,ZF_tab);
-
- showZF(4,1,ZF_tab+48);
- showZF(4,17,ZF_tab+f3*16);
- showZF(4,25,ZF_tab);
-
- showZF(6,1,ZF_tab+64);
- showZF(6,17,ZF_tab+f4*16);
- showZF(6,25,ZF_tab);
- setPM(1);
- showZF(0,1,ZF_tab+80);
- showZF(0,17,ZF_tab+f5*16);
- showZF(0,25,ZF_tab);
-
- showZF(2,1,ZF_tab+96);
- showZF(2,17,ZF_tab+f6*16);
- showZF(2,25,ZF_tab);
-
- showZF(4,1,ZF_tab+112);
- showZF(4,17,ZF_tab+f7*16);
- showZF(4,25,ZF_tab);
-
- showZF(6,1,ZF_tab+128);
- showZF(6,17,ZF_tab+f8*16);
- showZF(6,25,ZF_tab);
- setPM(2);
- }
- void main() //主函數(shù)
- {
- ds1=60;//搶答時(shí)間和答題時(shí)間初始化
- dtds1=60;
- ye=0;
- InitLcd();
-
- LOOP0:fen=0;//分?jǐn)?shù)初始化
- fen1=0;
- fen2=0;
- fen3=0;
- fen4=0;
- fen5=0;
- fen6=0;
- fen7=0;
- fen8=0;
- f1=fen1/10;
- f2=fen2/10;
- f3=fen3/10;
- f4=fen4/10;
- f5=fen5/10;
- f6=fen6/10;
- f7=fen7/10;
- f8=fen8/10;
-
- LOOP1:init();//初始化子函數(shù)
- while(kaif==0)//搶答未開(kāi)始
- {
- liushui();//流水燈
- chushi();//數(shù)碼管初始狀態(tài)
- shezhi();//搶答時(shí)間和答題時(shí)間的設(shè)置
- display();
- if(keyqc==0)
- {
- delay(5);
- if(keyqc==0)
- {
- while(!keyqc);
- goto LOOP0;
- }
- }
- if(kaif==0&&P1!=0xff)//判斷是否有違規(guī)搶答
- {
- delay(5);
- if(kaif==0&&P1!=0xff)
- {
- q=P1;
- while(P1!=0xff);//松手判斷
- while(1)
- {
- xuanze();//8人按鍵選擇
- baojing(num);//違規(guī)報(bào)警
- if(keyfw==0)goto LOOP1;//回到初始化子程序
- }
- }
- }
- if(keyks==0&&setf==0)//判斷搶答是否開(kāi)始
- {
- delay(5);//延時(shí)消抖
- if(keyks==0)
- {
- while(!keyks);//松手判斷
- beep=0;
- delay(100);
- beep=1;
- P0=0xff;//關(guān)燈
- deng=1;
- deng=0;
- TR0=1;//開(kāi)定時(shí)器0,關(guān)定時(shí)器1
- TR1=0;
- num=0;//顯示0
- kaif=1;//搶答開(kāi)始標(biāo)記
- }
- }
- }
- while(kaif==1)//搶答開(kāi)始
- {
- if(daf==0)//未開(kāi)始答題
- {
- scan();//鍵盤掃描
- shuzi(ds,num);//數(shù)碼管顯示
- }
- else
- {
- if(daf==1)
- shuzi(s3,num);//答題之前3秒倒計(jì)時(shí)
- else
- shuzi(dtds,num);//開(kāi)始答題,答題倒計(jì)時(shí)
- if(!keyjia||!keyjian)
- {
- TR0=0;
- while(keyfw&&keyqc)
- {
- shuzi(dtds,num);
- jifen();
- display();
- }
- }
- }
- if(keyfw==0)//復(fù)位
- {
- delay(5);
- if(keyfw==0)
- {
- while(!keyfw);
- goto LOOP1;//回到初始化子程序
- }
- }
- if(keyqc==0)
- {
- delay(5);
- if(keyqc==0)
- {
- while(!keyqc);
- goto LOOP0;
- }
- }
- }
- }
復(fù)制代碼
|
-
-
加液晶.zip
2019-3-25 21:49 上傳
點(diǎn)擊文件名下載附件
112.59 KB, 下載次數(shù): 14
|