|
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; } |