以解决,感兴趣的可以看看 #include<reg51.h> unsigned char shi=0,ge=0,num1,num2,a; unsigned int x,y,z; unsigned char code table[]= {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; void display(shi,ge); unsigned char key() //键盘 { unsigned char row=0,col=0,k; unsigned int t; P3=0x0F; if(P3==0x0F) return k; t=20000;while(t--); if(P3==0x0F) return k; for(row=0;row<4;row++) { P3=~(0x80>>row); k=P3&0x0F; if(k!=0x0F) { while(k&(0x08>>col)) col++; k=15-(row*4+col); return k; } } } void delay(x) //延时 { for(y=x;y>0;y--) for(z=110;z>0;z--); } void display(shi,ge) //段选位选控制函数 { P0=table[shi]; P2=0x7f; delay(5); P0=table[ge]; P2=0xbf; delay(5); } main() //主函数 { TMOD=0x01; EA=1;ET0=1;TR0=1; P0=0xc0; P2=0x3f; a=key(); if(a==1) num1=11; if(a==2) num1=21; if(a==3) num1=31; if(a==4) num1=41; if(a==5) num1=51; if(a==6) num1=61; if(a==1||a==2||a==3||a==4||a==5||a==6) {while(1) { display(shi,ge); if(num2==20) { num2=0; num1--; if(num1==0) return; if(key()==0) return; shi=num1/10; ge=num1%10; } } } } void time1() interrupt 1 { TH0=(65536-50000)/256; TL0=(65536-50000)%256; num2++; } |
wsxujn 发表于 2018-12-19 22:52 谢大佬啊,点醒了我,有点效果了,我在小改一下。 |
给你改用5ms查询方法完成动态数码管显示和倒计时,用开发板的矩阵键盘P3.7模拟地可以成为4个独立按键。 #include<reg52.h> sbit key1=P3^0; sbit key2=P3^1; //sbit key3=P3^2; //sbit key4=P3^3; sbit GND=P3^7;//开发板矩阵键盘模拟地 unsigned char shi,ge,num1=0,num2=0;//a; //unsigned int x,y,z; unsigned char code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //unsigned char code shu[]={0,10,20,30}; //void delay(x); //void shuhanshu(a); //void display(); void key() { static bit key1_sign,key2_sign; //静态-按键自锁标志 static unsigned char count1,count2;//静态-消抖计数变量 if(!key1) //按键1按下 { // 10ms消抖 自锁长按无效 倒计时中锁定按键无效 if((++count1>=2)&&(key1_sign==0)&&(num1==0)) { key1_sign=1; //按键1自锁标志置1 num1=10; //倒计时变量赋值 num2=0; //计时变量清0 } } else //按键1抬起 { key1_sign=0; //按键1自锁标志清0 count1=0; //消抖计数1清0 } if(!key2) //按键2按下 { if((++count2>=2)&&(key2_sign==0)&&(num1==0)) { key2_sign=1; //按键2自锁标志置1 num1=20; num2=0; } } else //按键2抬起 { key2_sign=0; //按键2自锁标志清0 count2=0; //消抖计数2清0 } } /* void delay(x) { for(y=x;y>0;y--) for(z=110;z>0;z--); } */ void display() { static bit i=0; shi=num1/10; ge=num1%10; P0=0xff;//消隐 if(i==0) { P0=table[shi]; P2=0x7f; i=~i; } else { P0=table[ge]; P2=0xbf; i=~i; } } void main() { // key(); // a=key(); // num1=shu[a]; TMOD=0x01; TH0=(65536-5000)/256;//5ms TL0=(65536-5000)%256; EA=1; ET0=1; TR0=1; GND=0; while(1) { if(TF0==1)//查询定时器中断溢出标志 { TF0=0; key(); num2++; if(num2==200)//1秒 { num2=0; if(num1>0) num1--; } display(); } } } void time1() interrupt 1 { TH0=(65536-5000)/256; TL0=(65536-5000)%256; } |
把按键程序放到 while 里啊 |
求大神帮忙啊 |