我每次添加的時候,我的倒計時就不動了求解
- #include<reg52.h>
- #define uint unsigned int
- #define uchar unsigned char
- sbit RS = P2^0;
- sbit RW = P2^1;
- sbit EN = P2^2;
- sbit K0 = P3^0;
- sbit K1 = P1^0;
- sbit K2 = P1^1;
- sbit K3 = P1^2;
- sbit K4 = P1^3;
- sbit K5 = P3^1;
- sbit K6 = P2^3;
- sbit K7 = P2^4;
- sbit K8 = P3^4;
- sbit Buzz = P3^7;
- sbit beep=P1^4; //蜂鳴器
- uint cnt = 0;//記錄中斷次數
- uint cnt1= 0;
- uint sec = 20;//記錄倒計時
- uchar num = 0;//記錄搶答選手
- uchar flag = 1;//搶答標志
- uchar s_flag = 0;//開始標志
- uchar e_flag = 0;//結束標志
- uchar score[4]={0};
- void init1602();
- void Lcdshow(uchar x,uchar y,uchar *str);
- void KeyScan();
- void Keycontrol() ;
- void Judge();
- uchar IntToString(uchar *str, int dat);
- void main()
- {
- uchar str1[12];
- uchar str2[12];
- uchar len,len1;
- EA = 1;
- ET0 = 1;
- TMOD = 0x11;//打開定時器T0,T1
- TR0 = 0;
- TH0 = 0xFC;
- TL0 = 0x67;
-
- TR1 = 0;
- TH1 = 0xFC;
- TL1 = 0x67;
- ET1 = 1;
- init1602();
-
-
-
- Lcdshow(0,0,str1);
- while(1)
- {
- Keycontrol();
- KeyScan();
- len = IntToString(str1,sec);
- len1= IntToString(str2,num);
- if(e_flag==0)
- {
- Lcdshow(0,0,"Time:");
- Lcdshow(6,0,str1);
- }
- if(num!=0&&e_flag==0&&flag==0)//沒有結束且有人按下按鍵
- {
- Lcdshow(0, 1, "answerer:");
- Lcdshow(9, 1, str2);
- }
- if(e_flag==1)
- {
- Judge();
- }
- }
- }
- /*等待液晶準備*/
- void Lcdready()
- {
- uchar sta;
- P0 = 0xFF;
- RS = 0;
- RW = 1;
- do
- {
- EN = 1;
- sta = P0;//讀取狀態字
- EN = 0;
- }while(sta & 0x80);
- }
- /* 向 LCD1602 液晶寫入命令,cmd-待寫入命令值 */
- void WriteCmd(uchar cmd)
- {
- Lcdready();
- RS = 0;
- RW = 0;
- P0 = cmd;
- EN = 1;
- EN = 0;
- }
- /* 向 LCD1602 液晶寫入數據,dat-待寫入數據 */
- void WriteData(uchar dat)
- {
- Lcdready();
- RS = 1;
- RW = 0;
- P0 = dat;
- EN = 1;
- EN = 0;
- }
- /* 設置顯示 RAM 起始地址(x,y)-對應屏幕上的字符坐標 */
- void Lcdaddr(uchar x,uchar y)
- {
- uchar m;
- if(y==0)
- m = 0x00+x; //第一行字符地址從 0x00 起始
- else
- m = 0x40+x; //第二行字符地址從 0x40 起始
- WriteCmd(m | 0x80);//設置 RAM 地址
- }
- /* 在液晶上顯示字符串,(x,y)-對應屏幕上的起始坐標,str-字符串指針 */
- void Lcdshow(uchar x,uchar y,uchar *str)
- {
- Lcdaddr(x,y);
- while(*str != '\0')
- {
- WriteData(*str++);
- }
- }
- /* 初始化 1602 液晶 */
- void init1602()
- {
- WriteCmd(0x38);
- WriteCmd(0x0C);
- WriteCmd(0x06);
- WriteCmd(0x01);
- }
- /* 整型數轉換為字符串,str-字符串指針,dat-待轉換數,返回值-字符串長度 */
- unsigned char IntToString(unsigned char *str, int dat)
- {
- uchar i = 0;
- unsigned char len = 0;
- unsigned char buf[6];
- if (dat < 0) //如果為負數,首先取絕對值,并在指針上添加負號
- {
- dat = -dat;
- *str++ = '-';
- len++;
- }
- do //先轉換為低位在前的十進制數組
- {
- buf[i++] = dat % 10;
- dat /= 10;
- } while (dat > 0);
- len += i; //i最后的值就是有效字符的個數
- while (i-- > 0) //將數組值轉換為ASCII碼反向拷貝到接收指針上
- {
- *str++ = buf[i] + '0';
- }
- *str = '\0'; //添加字符串結束符
- return len; //返回字符串長度
- }
- /*簡易延時*/
- void delay(uint x)
- {
- uchar i,j;
- for(i=x;i>0;i--)
- for(j=110;j>0;j--);
- }
- /*控制鍵掃描函數,開始結束*/
- void Keycontrol()
- {
- if(K0==0) //開始鍵
- {
- delay(10);
- if(K0==0)
- {
- while(!K0);
- WriteCmd(0x01);
- sec=20;
- TR0=~TR0;
- e_flag=0;
- flag=1;
- s_flag = 1;//表示已經開始
- }
- }
- if(K5==0)
- {
- delay(10);
- if(K5==0 && flag==0)
- {
- while(!K5);
- e_flag =1;//表示結束
- Buzz = 0;
- Lcdshow(9,0,"Successed");
- }
- }
- if(K8==0) //查分鍵
- {
- uchar ch;
- delay(10);
- if(K8==0 && e_flag==1) //按鍵按下且此時已結束
- {
- while(!K8);
- WriteCmd(0x01);
- Lcdshow(0,0,"P1:");
- ch=(char) (score[1]+48);
- WriteData(ch);
- Lcdshow(10,0,"P2:");
- ch=(char) (score[2]+48);
- WriteData(ch);
- Lcdshow(0,1,"P3:");
- ch=(char) (score[3]+48);
- WriteData(ch);
- Lcdshow(10,1,"P4:");
- ch=(char) (score[4]+48);
- WriteData(ch);
- }
- }
- }
- /*四路熱鍵掃描(哪個鍵先按下,哪個優先級最高) */
- void KeyScan()
- {
- if( K1==0 && flag != 0 && s_flag==1)
- {
- delay(10);
- if(K1==0)
- {
- while(!K1);
- num=1; //數碼管顯示1號"1"
- TR0=0; //關閉定時器0,時間停止
- TR1=1; //按下搶答器,蜂鳴器提醒
- flag=0; //關閉開始鍵標志位,使再按其他三個鍵不會響應
- }
- }
- if( K2==0 && flag != 0 && s_flag==1) //以下三個按鍵同一
- {
- delay(10);
- if(K2==0)
- {
- while(!K1);
- num=2;
- TR0=0;
- TR1=1;
- flag=0;
- }
- }
- if( K3==0 && flag != 0 && s_flag==1)
- {
- delay(10);
- if(K3==0)
- {
- while(!K1);
- num=3;
- TR0=0;
- TR1=1;
- flag=0;
- }
- }
- if( K4==0 && flag != 0 && s_flag==1)
- {
- delay(10);
- if(K4==0)
- {
- while(!K1);
- num=4;
- TR0=0;
- TR1=1;
- flag=0;
- }
- }
- }
- void Judge()
- {
- if( K6==0 ) //Yes按鍵
- {
- delay(10);
- if(K6==0)
- {
- while(!K6);
- WriteCmd(0x01);
- Lcdshow(0, 0, "Your answer is:");
- Lcdshow(0, 1, "Right");
- score[num]++;//為選手加分
- }
- }
- if( K7==0 )
- {
- delay(10);
- if(K7==0)
- {
- while(!K7);
- WriteCmd(0x01);
- Lcdshow(0, 0, "Your answer is:");
- Lcdshow(0, 1, "Worry");
- }
- }
- }
- void Time0 () interrupt 1
- {
- TH0 = 0xFC;
- TL0 = 0x67;//重賦值
- cnt++;
- if(cnt>=1000)
- {
- cnt = 0;
- sec--;
- if(sec==0)
- TR0 = 0;
- }
- }
- void Time1 () interrupt 3
- {
- TH1=(65536-2000)/256;
- TL1=(65536-2000)%256;
- Buzz = ~Buzz;
- cnt1++;
- if(cnt1==1000)
- {
- cnt1=0;
- TR1=0;
- }
- }
復制代碼
|