|
|
flag=4;//開始賦值為4,修復啟動時要先按復位鍵BUG while(1) { |
|
while(1) { if(flag!=0) { if(key1==0) delay10ms(); if(key1==0) flag=1; //開始標志 key_scan(); switch(flag) { case 1:daojishi();break; case 2:yihao();break; case 3:erhao();break; case 4:fuwei();break; } } else if(key4==0) delay10ms(); if(key4==0) flag=4; //復位標志 } 這樣調整一下,修復搶答鍵按下后,再按開始鍵繼續倒計時BUG |
|
#include <reg51.h> #define uchar unsigned char #define uint unsigned int uchar code zixingma[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; sbit P20=P2^0; sbit P21=P2^1; sbit P22=P2^2; //黃燈 sbit P23=P2^3; //紅燈 sbit P26=P2^6; sbit P27=P2^7; sbit key1=P3^2; //倒計時開關 sbit key2=P3^0; //1 sbit key3=P3^1; //2 sbit key4=P3^5; //復位開關 void daojishi(void); void yihao(void); void erhao(void); void fuwei(void); void key_scan(void); uchar n,k,flag; void delay5ms() { uchar i,j; for(i=10;i>0;i--) for(j=248;j>0;j--); } void delay10ms() { unsigned char i,j; for(i=20;i>0;i--) for(j=248;j>0;j--); } void main() { n=60; k=20; P22=0; P23=0; P1=0xff; TMOD=0x01; //T0用中斷定時1s,方式一 TH0=(65536-50000)/256; TL0=(65536-50000)%256; IE=0x8f; IT0=1; IT1=1; flag=0; while(1) { if(key1==0) delay10ms(); if(key1==0) flag=1; //開始標志 if(flag!=0) { key_scan(); switch(flag) { case 1:daojishi();break; case 2:yihao();break; case 3:erhao();break; case 4:fuwei();break; } } else if(key4==0) delay10ms(); if(key4==0) flag=4; //復位標志 } } void t_0() interrupt 1 { TH0=(65536-50000)/256; TL0=(65536-50000)%256; k--; if(k==0) { k=20; if(n>0) //增加一個判斷 {n--;} else /* n--; if(n==0) */ { TR0=0; P23=1; P0=0xff; flag=0; //禁止除復位按鈕外其它按鈕 標志 } } } void key_scan() { if(key1==0) { delay10ms(); if(key1==0) { flag=1; while(key1==1) { delay10ms(); flag=0; } } } if(key2==0) { delay10ms(); if(key2==0) { flag=2; while(key2==1) { delay10ms(); flag=0; } } } if(key3==0) { delay10ms(); if(key3==0) { flag=3; while(key3==1) { delay10ms(); flag=0; } } } if(key4==0) { delay10ms(); if(key4==0) { flag=4; while(key4==1) { delay10ms(); flag=0; } } } } void daojishi() { TR0=1; P0=0xff; P20=1; P21=0; if(n>=10) P0=zixingma[n/10]; delay5ms(); P0=0xff; P20=0; P21=1; P0=zixingma[n%10]; delay5ms(); } void yihao() { P0=0xff; P1=0xf9; P22=1; flag=0;//禁止除復位按鈕外其它按鈕 標志 } void erhao() { P0=0xff; P1=0xa4; P22=1; flag=0 ;//禁止除復位按鈕外其它按鈕標志 } void fuwei() { TR0=0; P2=0; P0=0xff; P1=0xff; n=60; } |
|
本帖最后由 機電小生 于 2020-4-17 21:35 編輯 程序如下: #include <reg51.h> #define uchar unsigned char #define uint unsigned int uchar code zixingma[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; sbit P20=P2^0; sbit P21=P2^1; sbit P22=P2^2; //黃燈 sbit P23=P2^3; //紅燈 sbit P26=P2^6; sbit P27=P2^7; sbit key1=P3^2; //倒計時開關 sbit key2=P3^0; //1 sbit key3=P3^1; //2 sbit key4=P3^5; //復位開關 void daojishi(void); void yihao(void); void erhao(void); void fuwei(void); void key_scan(void); uchar n,k,flag; void delay5ms() { uchar i,j; for(i=10;i>0;i--) for(j=248;j>0;j--); } void delay10ms() { unsigned char i,j; for(i=20;i>0;i--) for(j=248;j>0;j--); } void main() { n=60; k=20; P22=0; P23=0; P1=0xff; TMOD=0x01; //T0用中斷定時1s,方式一 TH0=(65536-50000)/256; TL0=(65536-50000)%256; IE=0x8f; IT0=1; IT1=1; flag=0; while(1) { key_scan(); switch(flag) { case 1:daojishi();break; case 2:yihao();break; case 3:erhao();break; case 4:fuwei();break; } } } void t_0() interrupt 1 { TH0=(65536-50000)/256; TL0=(65536-50000)%256; k--; if(k==0) { k=20; n--; if(n==0) { TR0=0; P23=1; P0=0xff; } } } void key_scan() { if(key1==0) { delay10ms(); if(key1==0) { flag=1; while(key1==1) { delay10ms(); flag=0; } } } if(key2==0) { delay10ms(); if(key2==0) { flag=2; while(key2==1) { delay10ms(); flag=0; } } } if(key3==0) { delay10ms(); if(key3==0) { flag=3; while(key3==1) { delay10ms(); flag=0; } } } if(key4==0) { delay10ms(); if(key4==0) { flag=4; while(key4==1) { delay10ms(); flag=0; } } } } void daojishi() { TR0=1; P0=0xff; P20=1; P21=0; if(n>=10) P0=zixingma[n/10]; delay5ms(); P0=0xff; P20=0; P21=1; P0=zixingma[n%10]; delay5ms(); } void yihao() { P0=0xff; P1=0xf9; P22=1; } void erhao() { P0=0xff; P1=0xa4; P22=1; } void fuwei() { TR0=0; P2=0; P0=0xff; P1=0xff; n=60; } |