![]() |
發布時間: 2018-5-8 14:59
正文摘要:本人菜鳥工程師,最近公司業務給我一個單片機板子。要抄板。 主控室一顆8腳的mcu,絲印被磨掉了。其中一個引腳控制了兩個按鍵。對應原理圖如下。 但程序最終還是無法很好的實現功能。 給各位一下參 ... |
圖上不是一個引腳控制兩個按鍵,是兩個按鍵控制一個引腳,按上面輸入高電平,按下面輸入低電平。又看到回復S1是一直按下去的,那就一直是高電平了啊,就沒有按鍵的意義了,如果P2.6為低電平按S3沒有作用的,如果P2.6為高電平時,S1常通又按S3相當于經R7取得一個中間值,這個值對單片機無用。 |
你這樣還不如直接放AD口,兩個電阻不一樣的話AD值就不一樣了,就可以判斷了 |
識別高低電平就可以了吧 |
baobao125 發表于 2021-11-9 17:55 用ADC判斷就沒必要這樣接了,這樣接明顯是沒有ADC的IO,不過這個接法有缺陷,雖然IO = 1 可以被接地的按鈕拉低, 但是IO = 0, 不是所有的單片機都可以被接VCC的按鈕拉高,所以要有通用性的話,還是需要利用電容充放電來確認接VCC的按鍵有沒有按下。 |
188610329 發表于 2021-11-9 16:06 就上面的電路,用ADC去判斷應該可以吧 |
這東西8年前還是多少年前,STC剛出15系列的時候,倒是研究過。 這個電路,需要加個電容,和下拉電阻, 先用強推挽給電容充電,然后轉高阻,讀取按鍵, 如果依然是高,說明接地的按鍵沒有按下,不然電容被放電了。 然后,等待一定時間,(取決于電容和下拉電阻),變低了,說明接VCC的按鍵也沒有按下,反之,接VCC按鍵按下了。 |
本帖最后由 baobao125 于 2021-11-9 14:59 編輯 wulin 發表于 2018-5-8 21:02 這樣不行,實際電路這樣按鍵S1是一直被按下的狀態,P26一下置1一下置0,檢測P26才1.5V左右跳動,為何就成了高電平? |
//使用STC15W104系列 #include <STC15F2K60S2.H> #define uint unsigned int #define uchar unsigned char sbit key = P3^2; sbit LED1= P3^3; sbit LED2= P3^4; void delay(uint k)//1ms延時 { uint i,j; for(i=k;i>0;i--) for(j=114;j>0;j--); } void key_scan()//按鍵掃描程序 { P2M1|=0x40; //P2.6設置高阻 key=0; //P2.6置0 if(key==1) //判斷是否為1,S1按下 { delay(10);//延時 if(key==1)//再次判斷是否為1,S1按下 { LED1=0;//LED輸出狀態 LED2=1; } } P2M1&=0xBF; //P2.6設置準雙向 key=1; //P2.6置1 if(key==0) //判斷是否為0,S3按下 { delay(10);//延時 if(key==0)//再次判斷是否為0,S3按下 { LED1=1;//LED輸出狀態 LED2=0; } } } void main() { P3M0=0x00; //初始化P3口準雙向 P3M1=0x00; //初始化P3口準雙向 LED1=1; //初始化LED1熄滅 LED2=1; //初始化LED2熄滅 while(1) { key_scan();//按鍵掃描 } } |