|
|||||||||||
| 技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測(cè)控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng) 驅(qū)動(dòng)編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機(jī) | DSP技術(shù) | MCU技術(shù) | IC 設(shè)計(jì) | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe |
單片機(jī)驅(qū)動(dòng)標(biāo)準(zhǔn)pc機(jī)鍵盤的C51程序 |
| 作者:turmary 欄目:單片機(jī) |
單片機(jī)驅(qū)動(dòng)標(biāo)準(zhǔn)pc機(jī)鍵盤的C51程序 網(wǎng)上流行的這個(gè)程充很垃圾, 在我的單片機(jī)上無論如何都調(diào)試不成功. 正確的程序見http://home.hn8868.com/tary/download.html 該程序由AVR程序移植過來... C語(yǔ)言寫的,風(fēng)格棒極了. 在P1口顯示ASCII嗎,也有使用LCD1602顯示的,需要的請(qǐng)連系我. 以下是主要的代碼KB.C #include <ATMEL\AT89X52.h> #include "Pindefs.h" #include "kb.h" #include "gpr.h" #include "Disp1602.h" #include "Scancodes.h" #define BUFF_SIZE 32 unsigned CHAR edge, bitcount; // 0 = neg. 1 = pos. unsigned CHAR kb_buffer[BUFF_SIZE]; unsigned CHAR *inpt, *outpt; unsigned CHAR buffcnt; void init_kb(void) { inpt = kb_buffer; // Initialize buffer outpt = kb_buffer; buffcnt = 0; // INT0 interrupt on falling edge edge = 0; // 0 = falling edge 1 = rising edge bitcount = 11; } void INT0_interrupt(void) interrupt 0 using 2 { static unsigned CHAR cdata; // Holds the received scan code EA = 0; if (!edge) // Routine entered at falling edge { if(bitcount < 11 && bitcount > 2) // Bit 3 to 10 is data. Parity bit, { // start and stop bits are ignored. cdata = (cdata >> 1); if(PIND) cdata = cdata | 0x80; // Store a '1' } /*MCUCR = 3; */ // Set interrupt on rising edge edge = 1; } if (edge) { // Routine entered at rising edge /*MCUCR = 2; */ // Set interrupt on falling edge edge = 0; if(--bitcount == 0) // All bits received { decode(cdata); bitcount = 11; } } EA = 1; } void decode(unsigned CHAR sc) { //extern void clr(void); static unsigned CHAR is_up = 0, shift = 0, mode = 0; unsigned CHAR i; if (!is_up) // Last data received was the up-key identifier { SWITCH (sc) { case 0xF0 : // The up-key identifier is_up = 1; break; case 0x12 : // Left SHIFT shift = 1; break; case 0x59 : // Right SHIFT shift = 1; break; case 0x05 : // F1 if(mode == 0) mode = 1; // Enter scan code mode if(mode == 2) mode = 3; // Leave scan code mode break; default: if(mode == 0 || mode == 3) // If ASCII mode { if(!shift) // If shift not pressed, { // do a table look-up for(i = 0; unshifted[i][0]!=sc && unshifted[i][0]; i++); if (unshifted[i][0] == sc) { put_kbbuff(unshifted[i][1]); } } else { // If shift pressed for(i = 0; shifted[i][0]!=sc && shifted[i][0]; i++); if (shifted[i][0] == sc) { put_kbbuff(shifted[i][1]); } } } else{ // Scan code mode print_hexbyte(sc); &n |
| 2樓: | >>參與討論 |
| 作者: viewtech 于 2007/3/7 9:59:00 發(fā)布:
硬件如何連接.... 以下所說內(nèi)容在哪里? 按照網(wǎng)上的文章中說明的接法即可, |
|
| 3樓: | >>參與討論 |
| 作者: fish1983 于 2007/3/7 10:03:00 發(fā)布:
支持 支持 |
|
| 4樓: | >>參與討論 |
| 作者: turmary 于 2007/3/7 11:44:00 發(fā)布:
硬件接法 數(shù)據(jù)線接P2.3 時(shí)鐘線接P3.2(INT0) 鍵盤的電源當(dāng)然接5V與GND. P1口接八個(gè)上拉發(fā)光二極管 |
|
| 5樓: | >>參與討論 |
| 作者: turmary 于 2007/3/7 18:57:00 發(fā)布:
圖片 * - 本貼最后修改時(shí)間:2007-3-7 19:00:07 修改者:turmary |
|
| 6樓: | >>參與討論 |
| 作者: binbinwb 于 2007/3/7 20:53:00 發(fā)布:
有意思 |
|
|
|
| 免費(fèi)注冊(cè)為維庫(kù)電子開發(fā)網(wǎng)會(huì)員,參與電子工程師社區(qū)討論,點(diǎn)此進(jìn)入 |
Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號(hào) |