HC6800-ES-V2.0 发表于 2017-11-29 08:54 100*1000比你的44*112大啊但是。。。。 |
J木昜 发表于 2017-11-29 13:58 是的!看不懂呢 |
HC6800-ES-V2.0 发表于 2017-11-29 08:54 谢谢!原来是软件消抖的问题啊 |
廖宇航 发表于 2017-11-29 12:25 标志位keyFlag在程序中没体现出来 |
廖宇航 发表于 2017-11-29 11:20 不知道怎么回事,发表主题后格式乱了,楼主只有自己复制一下,自己排一下版了 |
Afan的单片机 发表于 2017-11-28 21:13 给楼主提个建议,将按键扫描和动态显示分别做一个模块。采用分时的方法,在键盘扫描中定义一个标志位keyflag,当按键按下按下时,keyflag=1;按键弹起来时,keyflag置1,这样就检测标志位就不用一行一行的扫描键盘,消耗cpu的时间,同时也避免了按键扫描和动态显示之间的时间冲突,比如,按一下按键,数码管会闪一下。一个小段程序可能体现不出来,但如果是一个大型复杂的程序,问题就非常重要了,所以分时的思想在单片机中非常重要。当然也可以用中断解决,但是单片机中断源有限,能节约硬件资源就节约一下吧。 标志位的状态,如果不清楚的话,可以自己写一下,就会明白了。 #include<reg51.h> #define uchar unsigned char sbit key=P3^3; bit keyflag; char counter=0; uchar code seg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //***********延时10ms*********// void delay() { uchar i,j=10; while(j--) { for(i=120;i>0;i--); } } //**********动态扫描*********// void display(void) { P2=0xfd; P1=seg[counter/10]; delay(); P2=0xfe; P1=seg[counter%10]; delay(); } //***********按键扫描*********// void keyread(void) { if(!key) { if(keyflag==0)//按键标志位 { delay(); if(!key) { keyflag=1; counter++; if(counter==100)//计满100,清0 counter=0; } } } else keyflag=0; } void main(void) { while( 1 ) { keyread(); display(); } } |
Afan的单片机 发表于 2017-11-28 21:13 给楼主提个建议,将按键扫描和动态显示分别做一个模块, #include<reg51.h> #define uchar unsigned char sbit com1=P1^0; sbit com2=P1^1; sbit key=P3^0; sbit key2=P3^1; bit keyflag2; bit keyflag; char counter=0; uchar code seg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共阳极 //**********延时10ms*********// void delay() { uchar i,j=10; while(j--) { for(i=120;i>0;i--); } } //**********数码管动态扫描*********// void display(void) { P1=0xfd; P0=seg[counter/10]; delay(); P1=0xfe; P0=seg[counter%10]; delay(); } //***********按键扫描*********// void keyread(void) { if(!key) { if(keyflag==0) { delay(); if(!key) { keyflag=1; counter++; if(counter==100) counter=0; } } } else keyflag=0; } void main(void) { for( ; ; ) { keyread(); display(); } } } |
我运行了你的程序。 你的程序问题,在按键消抖上。 按键的抖动,时间至少10ms,你的消抖延时,只有0.15ms左右,不能确实消抖,所以按一次会加很多。 我这里有一个延时10ms的程序,你试试看。 void Delay10ms(uc c) { unsigned char a,b; for(c;c>0;c--) for(b=44;b>0;b--) for (a=112;a>0;a--); } |
请问是哪里出问题了呢? |