![]() |
發布時間: 2017-11-28 21:09
正文摘要:為什么程序不能運行1,按一下顯示加一呢?? #include<reg52.h> char tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; sbit y=P3^3; int num=0; int ge=0; int shi=0; void delay(){ ... |
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--); } |
請問是哪里出問題了呢? |