熱門: 51單片機(jī) | 24小時(shí)必答區(qū) | 單片機(jī)教程 | 單片機(jī)DIY制作 | STM32 | Cortex M3 | 模數(shù)電子 | 電子DIY制作 | 音響/功放 | 拆機(jī)樂園 | Arduino | 嵌入式OS | 程序設(shè)計(jì)
|
發(fā)布時(shí)間: 2018-5-8 14:59
正文摘要:本人菜鳥工程師,最近公司業(yè)務(wù)給我一個(gè)單片機(jī)板子。要抄板。 主控室一顆8腳的mcu,絲印被磨掉了。其中一個(gè)引腳控制了兩個(gè)按鍵。對(duì)應(yīng)原理圖如下。 但程序最終還是無法很好的實(shí)現(xiàn)功能。 給各位一下參 ... |
| 圖上不是一個(gè)引腳控制兩個(gè)按鍵,是兩個(gè)按鍵控制一個(gè)引腳,按上面輸入高電平,按下面輸入低電平。又看到回復(fù)S1是一直按下去的,那就一直是高電平了啊,就沒有按鍵的意義了,如果P2.6為低電平按S3沒有作用的,如果P2.6為高電平時(shí),S1常通又按S3相當(dāng)于經(jīng)R7取得一個(gè)中間值,這個(gè)值對(duì)單片機(jī)無用。 |
| 你這樣還不如直接放AD口,兩個(gè)電阻不一樣的話AD值就不一樣了,就可以判斷了 |
| 識(shí)別高低電平就可以了吧 |
baobao125 發(fā)表于 2021-11-9 17:55 用ADC判斷就沒必要這樣接了,這樣接明顯是沒有ADC的IO,不過這個(gè)接法有缺陷,雖然IO = 1 可以被接地的按鈕拉低, 但是IO = 0, 不是所有的單片機(jī)都可以被接VCC的按鈕拉高,所以要有通用性的話,還是需要利用電容充放電來確認(rèn)接VCC的按鍵有沒有按下。 |
188610329 發(fā)表于 2021-11-9 16:06 就上面的電路,用ADC去判斷應(yīng)該可以吧 |
|
這東西8年前還是多少年前,STC剛出15系列的時(shí)候,倒是研究過。 這個(gè)電路,需要加個(gè)電容,和下拉電阻, 先用強(qiáng)推挽給電容充電,然后轉(zhuǎn)高阻,讀取按鍵, 如果依然是高,說明接地的按鍵沒有按下,不然電容被放電了。 然后,等待一定時(shí)間,(取決于電容和下拉電阻),變低了,說明接VCC的按鍵也沒有按下,反之,接VCC按鍵按下了。 |
本帖最后由 baobao125 于 2021-11-9 14:59 編輯 wulin 發(fā)表于 2018-5-8 21:02 這樣不行,實(shí)際電路這樣按鍵S1是一直被按下的狀態(tài),P26一下置1一下置0,檢測(cè)P26才1.5V左右跳動(dòng),為何就成了高電平? |
|
//使用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延時(shí) { uint i,j; for(i=k;i>0;i--) for(j=114;j>0;j--); } void key_scan()//按鍵掃描程序 { P2M1|=0x40; //P2.6設(shè)置高阻 key=0; //P2.6置0 if(key==1) //判斷是否為1,S1按下 { delay(10);//延時(shí) if(key==1)//再次判斷是否為1,S1按下 { LED1=0;//LED輸出狀態(tài) LED2=1; } } P2M1&=0xBF; //P2.6設(shè)置準(zhǔn)雙向 key=1; //P2.6置1 if(key==0) //判斷是否為0,S3按下 { delay(10);//延時(shí) if(key==0)//再次判斷是否為0,S3按下 { LED1=1;//LED輸出狀態(tài) LED2=0; } } } void main() { P3M0=0x00; //初始化P3口準(zhǔn)雙向 P3M1=0x00; //初始化P3口準(zhǔn)雙向 LED1=1; //初始化LED1熄滅 LED2=1; //初始化LED2熄滅 while(1) { key_scan();//按鍵掃描 } } |
Powered by 單片機(jī)教程網(wǎng)