| 
  |||||||||||
| 技術交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術 | 電源技術 | 測控之家 | EMC技術 | ARM技術 | EDA技術 | PCB技術 | 嵌入式系統(tǒng) 驅(qū)動編程 | 集成電路 | 器件替換 | 模擬技術 | 新手園地 | 單 片 機 | DSP技術 | MCU技術 | IC 設計 | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe  | 
  
ATmega 鍵盤問題請教 | 
  
| 作者:hldd 欄目:單片機 | 
請教,我們的鍵盤工作不正常,請哪位高手幫忙看一下,電路設計有問題嗎? 現(xiàn)在的問題是,當按下某一個鍵時,在電容(比如 C152)和鍵盤連接的一邊,電壓可以被拉下來,可是通過電阻連接到單片機上的一邊沒有任何反應。 謝謝。 
  | 
  
| 2樓: | >>參與討論 | 
| 作者: hldd 于 2005/2/16 15:58:00 發(fā)布:
         請高手幫幫忙啊.  | 
  |
| 3樓: | >>參與討論 | 
| 作者: zhang..yb 于 2005/2/16 17:22:00 發(fā)布:
         電容去掉。 電容去掉!  | 
  |
| 4樓: | >>參與討論 | 
| 作者: NE5532 于 2005/2/16 18:39:00 發(fā)布:
         老大,你接電容干什么? 信號都過不來了。  | 
  |
| 5樓: | >>參與討論 | 
| 作者: hotpower 于 2005/2/16 19:08:00 發(fā)布:
         小電容對地還說得過去,電容隔直應該復習 搞個微分電路還行,但一端必須能捕捉到... 將電容短路應該不太麻煩,但換成二極管可能更"專業(yè)"...  | 
  |
| 6樓: | >>參與討論 | 
| 作者: zsmbj 于 2005/2/16 20:18:00 發(fā)布:
         將電容短路即可!  | 
  |
| 7樓: | >>參與討論 | 
| 作者: hotpower 于 2005/2/16 22:48:00 發(fā)布:
         歪打正著,命大造化大--講述"二極管專業(yè)"之理由 這種電路我以前遇到過(將樓主的電容全直接短路)... 當時有人請我"會診"瞧他的鍵盤為何老犯病,...我當即開了個用二極管的"藥方"... 何也??? 如果我沒眼花的話,樓主的鍵盤電路應該是"8出3入"的24鍵. 在鍵掃描期間,肯定要遇到"1低7高"的掃描次序,即PA0=0,PA1~PA7=1 (先不說快速全掃描) 在PC0~PC2收鍵碼,當然樓主用74HC11(沒用過,猜測是3與門之類)引發(fā)INT2中斷.(AVR菜鳥我未用過M128的INT2中斷--當然也用不起...) 且看: 當PA0=0,PA1~PA7=1時有SW2和SW5鍵同時壓下時,R78,R84,R88都是看客,R99只不過再"限流"或"提高輸入阻抗"而成為"花架子". 而真正"工作"的是R83和R85這2個"小電阻"!!!(產(chǎn)生單鍵可以雙鍵不行的"怪現(xiàn)象") 由于PA0=0V,PA1=5V,所以PC2或74HC11-C1的電壓為R83和R85電阻的分壓即2.5V!!! 同理可知,當不同多鍵壓下時,PA0~PA7的分壓比有不同的變化... 這時INT2能引發(fā)鍵盤中斷嗎???肯定在做夢!!! 要想避免"分壓現(xiàn)象",應該在PA0~PA7加二極管,這樣就阻斷了高電平輸出端的輸出,避免了"同側(cè)分壓"而與鍵盤PC0~PC2上的分壓... 由此可知行輸出側(cè)的上拉電阻應該可以不需要的!!!實際也是無用的... (當然雙向鍵掃描除外) 當然,如果不需要多鍵壓下,本帖就無任何意義!!! 所以,在"行掃描"側(cè)千萬要注意這種"同行電阻分壓現(xiàn)象",以免整日"百思不解"等郁悶... 如果不想郁悶的話,就加二極管來"解夢"... 注意雙向IO和準雙向IO的不同之處!!! 由于AVR與MCS51不同,所以加二極管還需加限流電阻(當然也可設置成為輸入以省去限流電阻) 故雙向IO若不加限流電阻相當與在輸出高電平與輸出低電平之間跨接了一個二極管,這樣做灌電流和拉電流都會很大... 以上主要講述了一般加二極管的正確性. 但針對AVR這樣的IO靈活控制的MCU,不加二極管也是可行的(也是應該的)---即輸出0時設置該IO管腳為輸出方式,輸出1時設置該IO管腳為輸入方式(高阻). 即: PORTA = 0x00;//不管三七二十一全為0(輸出0,輸入不上拉) DDRA = 0b00000001;//掃描時進行DDRA的移位操作(1出7入) 這就是為什么鍵盤電路多有二極管的郁悶之處 但愿此帖對多鍵同時壓下設計有用... 這里的"專業(yè)"即通用MCU之意. 結(jié)論: AVR可以短路電容,但編程時不能按常規(guī)的IO輸出操作,否則需加二極管.  * - 本貼最后修改時間:2005-2-17 0:30:08 修改者:hotpower  | 
  |
| 8樓: | >>參與討論 | 
| 作者: hldd 于 2005/2/17 10:16:00 發(fā)布:
         謝謝各位!早上起來看見這么多回復,真感動,祝大家新春快樂! 等我試一試,再來和大家匯報。  | 
  |
| 9樓: | >>參與討論 | 
| 作者: hldd 于 2005/2/17 23:19:00 發(fā)布:
         各位老大,電容去掉了,可是按鍵后電壓還是下不來, 請各位老大再幫忙看看,是否電阻值不對? 我的程序中是PA口設置為低,并且是輸出。PC口設置為高,也為輸出。 然后希望,當鍵盤按下時,連接PC口的3根線中的一根被拉低,通過74HC11(3與門)觸發(fā)中斷INT2。 謝謝。 
  | 
  |
| 10樓: | >>參與討論 | 
| 作者: cma 于 2005/2/18 2:23:00 發(fā)布:
         try 圖中的R99-R101去掉,PC口應設置為輸入。  | 
  |
| 11樓: | >>參與討論 | 
| 作者: zsmbj 于 2005/2/18 9:01:00 發(fā)布:
         暈,PC既然設置為輸出高了,如何能為低呢? 先把上邊的hotpower的帖子仔細讀3遍再開始編程!  | 
  |
| 12樓: | >>參與討論 | 
| 作者: hldd 于 2005/2/18 15:14:00 發(fā)布:
         繼續(xù)請教各位?梢詸z測到行了,但列還不行,請各位再幫幫。 當按下SW2鍵后,可以進入中斷程序了。但如何檢測列呢? main 程序如下: // Porta, KEYBOARD row PORTA = 0x00; DDRA = 0xff; // Portc, KEYBOARD column DDRC = 0x00; 中斷程序如下,value_c的值是對的,可以知道是哪行按鍵了。但value_a值總是讀為0x00.沒有辦法區(qū)別是哪一列被按鍵了。 SIGNAL(SIG_INTERRUPT2) { int value_a, value_c; value_c = PINC; PORTC = 0x00; DDRC = 0xff; DDRA = 0x00; value_a = PINA; } 謝謝!  | 
  |
| 13樓: | >>參與討論 | 
| 作者: hotpower 于 2005/2/18 18:56:00 發(fā)布:
         哈哈,看來樓主真不明白什么是“鍵掃描” 我在21IC關于“鍵盤”及“鍵掃描”的帖子太多了,自己在21ICBBS的主頁搜索“鍵掃描”,肯定會找到答案及思路...  | 
  |
| 14樓: | >>參與討論 | 
| 作者: hldd 于 2005/2/19 22:59:00 發(fā)布:
         謝謝各位老大的幫助,鍵盤基本工作正常了。 在準備I2C的調(diào)試,還要繼續(xù)請教各位。謝謝。  | 
  |
| 15樓: | >>參與討論 | 
| 作者: hotpower 于 2005/2/21 23:50:00 發(fā)布:
         搞出來了也不來個工作總結(jié)??? 看來TWI/USI是幫不上忙了...  | 
  |
| 16樓: | >>參與討論 | 
| 作者: zsmbj 于 2005/2/22 8:18:00 發(fā)布:
         最簡單的就是先用IO模擬的辦法,網(wǎng)上有很多帖子!拿來主義。  | 
  |
| 17樓: | >>參與討論 | 
| 作者: hotpower 于 2005/2/22 11:35:00 發(fā)布:
         我有實戰(zhàn)例程,但要見到工作總結(jié)報告  | 
  |
| 18樓: | >>參與討論 | 
| 作者: hldd 于 2005/2/22 18:06:00 發(fā)布:
         hotpower大蝦,沒有總結(jié)是因為 好像覺得大家都覺得鍵盤太簡單,寫出來怕大家笑話,既然大家不嫌棄,稍后就寫個總結(jié)出來。  | 
  |
| 19樓: | >>參與討論 | 
| 作者: hldd 于 2005/2/23 14:50:00 發(fā)布:
         ATMEGA128 鍵盤的工作總結(jié) 鍵盤這個東西不會的時候挺難,懂了,就不是很難了。呵呵。 鍵盤的工作總結(jié):這個原理圖是可以基本工作的鍵盤原理圖。鍵盤掃描中斷響應控制程序如下,希望對大家有幫助。也希望得到大家的幫助。 SIGNAL(SIG_INTERRUPT2) { int value_a, value_c; //define value_a and value_c are int value_c = PINC; // got row NUMBER value_c = value_c & 0x07; DDRC = 0xff; // send row NUMBER PORTC = value_c; DDRA = 0x00; value_a = 0x00; value_a = PINA; // get column NUMBER PORTE = value_a; // for testing PORTB = value_c; // for testing if (value_c == 3) // KEYBOARD : SW2 LINE { SWITCH(value_a) { case 254: KEYBOARD_power();break; // SW2 case 253: KEYBOARD_search();break; // SW5 case 251: KEYBOARD_aspect();break; // SW8 case 247: KEYBOARD_auto();break; // SW11 case 239: KEYBOARD_blank();break; // SW14 case 223: KEYBOARD_magnify_on();break; // SW17 case 191: KEYBOARD_magnify_off();break; // SW20 case 127: KEYBOARD_volume();break; // SW23 default:break; } } else if (value_c == 5) // KEYBOARD : SW3 LINE { SWITCH(value_a) { case 254:KEYBOARD_mute();break; // SW3 case 253:KEYBOARD_freeze();break; // SW6 case 251:KEYBOARD_position();break; // SW9 case 247:KEYBOARD_menu();break; // SW12 case 239:KEYBOARD_esc();break; // SW15 case 223:KEYBOARD_reset();break; // SW18 case 191:KEYBOARD_up();break; // SW21 case 127:KEYBOARD_down();break; // SW24 default:break; } } else if (value_c == 6) // KEYBOARD : SW4 LINE { SWITCH(value_a) { case 254:KEYBOARD_left();break; // SW4 case 253:KEYBOARD_right();break; // SW7 case 251:KEYBOARD_enter();break; // SW10 case 247:KEYBOARD_keystone();break; // SW13 case 239:KEYBOARD_sw16();break; // SW16 case 223:KEYBOARD_sw19();break; // SW19 case 191:KEYBOARD_sw22();break; // SW22 case 127:KEYBOARD_sw25();break; // SW25 default:break; } } // restore for next KEYBOARD interrupt // Porta, KEYBOARD row PORTA = 0x00; DDRA = 0xff; // Portc, KEYBOARD column DDRC = 0x00; } 
  | 
  |
| 20樓: | >>參與討論 | 
| 作者: hotpower 于 2005/2/23 20:39:00 發(fā)布:
         累!好端端的行列矩陣讓你糟蹋了  | 
  |
| 21樓: | >>參與討論 | 
| 作者: hldd 于 2005/2/23 23:08:00 發(fā)布:
         hotpower大蝦,不知道您是什么意思?可以指教一下?提醒也行。謝  | 
  |
| 22樓: | >>參與討論 | 
| 作者: hotpower 于 2005/2/24 13:06:00 發(fā)布:
         switch-case太累  | 
  |
| 23樓: | >>參與討論 | 
| 作者: shenshi 于 2005/2/24 20:06:00 發(fā)布:
         如果是我設計的話,我不會這樣做 24個鍵盤,可以用3個245來做,接到數(shù)據(jù)總線上,用3個選通信號分別選通245,然后用掃描的方法讀鍵盤值  | 
  |
| 24樓: | >>參與討論 | 
| 作者: hotpower 于 2005/2/25 0:33:00 發(fā)布:
         245又什么好處???樓主的電路肯定比245強!!!  | 
  |
| 25樓: | >>參與討論 | 
| 作者: busy 于 2005/3/3 12:23:00 發(fā)布:
         簡單回復,過程如下 根本沒有用A/D原理檢測鍵盤。 軟件部分: PA0---PA7,掃描脈沖輸出,任何時候只有一個腳是低電位(也就是輸出掃描字),74HC11三輸入與門檢測鍵盤按下,通過Y1送到MEGA128的INT2(也就是中斷檢測鍵盤),PC0---PC2是接收的鍵盤碼,和掃描字合在一起就可以區(qū)分鍵值。 硬件部分: 去掉100R,500PF立即可正常工作。 個人見解,不妥請見諒。  * - 本貼最后修改時間:2005-3-3 12:26:16 修改者:busy  | 
  |
| 26樓: | >>參與討論 | 
| 作者: hotpower 于 2005/3/3 12:45:00 發(fā)布:
         74HC11其實也沒必要,加3個二極管線與后接中斷即可. 要膽大的話電阻電容全部不要. 只要遵循: 輸出低電平寫'0',輸入上拉電阻寫'1'的原則即可簡化硬件電路. 74HC11其實也沒必要,加3個二極管線與后接INT2中斷即可. 如果74HC11還有別用那就無所謂了,如果專門用于三線中斷那就不如接加3個二極管線與方便實用了.  | 
  |
| 27樓: | >>參與討論 | 
| 作者: tiannong 于 2005/3/4 15:09:00 發(fā)布:
         再請教!  | 
  |
| 28樓: | >>參與討論 | 
| 作者: zhang_2000 于 2005/3/6 20:22:00 發(fā)布:
         100K  | 
  |
| 29樓: | >>參與討論 | 
| 作者: liangq 于 2005/3/16 14:40:00 發(fā)布:
         真是暈倒。 按鍵兩端都上拉?這么好一個矩陣電路真的被你糟蹋了。  | 
  |
| 30樓: | >>參與討論 | 
| 作者: ycc1415926 于 2005/3/16 20:07:00 發(fā)布:
         你的鍵盤真的能用嗎?(我說的能用是能夠完成它應該完成的功能)  | 
  |
| 31樓: | >>參與討論 | 
| 作者: zyy 于 2005/3/18 15:30:00 發(fā)布:
         簡單的東西總是人氣旺。。。  | 
  |
  | 
    
 
  | 
  
| 免費注冊為維庫電子開發(fā)網(wǎng)會員,參與電子工程師社區(qū)討論,點此進入 | 
Copyright © 1998-2006 www.udpf.com.cn 浙ICP證030469號  |