01.jpg (2.01 MB, 下載次數(shù): 85)
下載附件
2021-3-14 10:26 上傳
簡(jiǎn)介如果你希望把舊筆記本鍵盤(pán)改造為usb的形式,或者你希望對(duì)已有的鍵盤(pán)進(jìn)行深層次的改造。那么你可能需要了解所需要改造的鍵盤(pán)上按鍵排布的方式以及排線定義!過(guò)去這個(gè)過(guò)程是艱難且漫長(zhǎng)的,你需要使用一些簡(jiǎn)易的自制工具對(duì)每個(gè)引腳進(jìn)行檢測(cè),這往往需要耗費(fèi)大量的時(shí)間。
本工具可以為你做的事情- 免除大量對(duì)飛線焊接
- 實(shí)時(shí)掃描按鍵,并輸出對(duì)應(yīng)的引腳映射
- 串口輸出按下的按鍵(如果存在按鍵映射表)
- 全自動(dòng)生成按鍵映射表(未實(shí)現(xiàn))
- 實(shí)現(xiàn)usb按鍵(未實(shí)現(xiàn))
材料- Stm32F103 最小系統(tǒng)板子 (可用國(guó)產(chǎn)HK32F103替代)
- FPC轉(zhuǎn)接板 (可以前往立創(chuàng)eda社區(qū),下載開(kāi)源的PCB文件,并且5元打板制造)
- FPC轉(zhuǎn)接底座 (通常使用1.0間距 建議先量一量鍵盤(pán)排線的長(zhǎng)度)
- 一些杜邦線
步驟- 安裝FPC轉(zhuǎn)接板
- 把鍵盤(pán)插到FPC轉(zhuǎn)接板上
- 通過(guò)杜邦線從FPC轉(zhuǎn)接板上再次轉(zhuǎn)接到Stm32F103最小系統(tǒng)板子上
- 使用Arduino IDE編譯固件上傳 (需要手動(dòng)設(shè)置gpio :按照上一步接線的情況進(jìn)行設(shè)置)
03.png (40.77 KB, 下載次數(shù): 90)
下載附件
2021-3-14 10:26 上傳
- 打開(kāi)串口監(jiān)視器,并嘗試按下鍵盤(pán)(插在FPC轉(zhuǎn)接板上的)上的任意鍵,觀察串口監(jiān)視器是否有相應(yīng)輸出
02.png (144.66 KB, 下載次數(shù): 90)
下載附件
2021-3-14 10:26 上傳
串口輸出數(shù)據(jù)格式- 探針:指的是作為探針的引腳,該引腳會(huì)在掃描時(shí)輸出高電平
- 接收:當(dāng)前除探針外剩下的引腳進(jìn)入輸入模式,試圖接收來(lái)自探針引腳的信號(hào)
- 探針[KBPinMap下標(biāo)]:探針Pin
- 接收[KBPinMap下標(biāo)]:接收Pin
試試看
04.png (6.21 KB, 下載次數(shù): 95)
下載附件
2021-3-14 10:26 上傳
解析:數(shù)組KBPinMap第11項(xiàng)與開(kāi)發(fā)板對(duì)應(yīng)的33號(hào)(PC14)引腳 輸出高電平 并且被 數(shù)組KBPinMap第6項(xiàng)與開(kāi)發(fā)板對(duì)應(yīng)的1號(hào)(PA3)引腳 接收到,這意味著這時(shí)鍵盤(pán)上對(duì)應(yīng)的這兩個(gè)引腳是對(duì)應(yīng)關(guān)系
Arduino源程序:
- #define SWAP(x, y) \
- (y) = (x) + (y); \
- (x) = (y) - (x); \
- (y) = (y) - (x);
- //按鍵映射表,按需修改
- //{探針id,接收id,ASCII}
- byte KeyMap[][3]={
- {5,19,'1'},
- {5,18,'2'},
- {6,19,'3'},
- {8,19,'6'},
- {8,18,'7'},
- {9,19,'8'},
- {5,17,'q'},
- {5,20,'w'},
- {6,18,'e'},
- {8,17,'y'},
- {9,17,'u'},
- {9,18,'i'},
- {10,20,'o'},
- {5,21,'a'},
- {6,20,'s'},
- {6,17,'d'},
- {8,20,'h'},
- {9,20,'j'},
- {9,21,'k'},
- {10,21,'l'},
- {5,22,'z'},
- {6,21,'x'},
- {6,22,'c'},
- {8,22,'b'},
- {8,21,'n'},
- {9,22,'m'},
- {10,22,'<'},
- {11,22,'>'},
- {11,21,'/'},
- };
- //KBPinMap 按照鍵盤(pán)排線接入開(kāi)發(fā)板的順序填寫(xiě)引腳設(shè)定
- // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
- int KBPinMap[] = {PB12, PB13, PB14, PB15, PC13, PA4, PA3, PA2, PA1, PA0, PC15, PC14, PB5, PB6, PB7, PB8, PB9, PB11, PB10, PB0, PB1, PA7, PA6, PA5};
- int KBScan[] = {0};
- /*
- @函數(shù) ScanKeyMap
- @作用 搜索按鍵映射表并輸出按鍵映射
- @傳入
- byte a 探針id
- byte b 接收id
- @傳出
- char
- */
- char ScanKeyMap(byte a,byte b){
- if (a>b) {
- byte c=a;
- a=b;
- b=c;
- }
- for (int i=0;i<sizeof(KeyMap)/sizeof(KeyMap[0]);i++) {
- if (KeyMap[i][0]==a&&KeyMap[i][1]==b) return KeyMap[i][2];
- }
- char printBuffer[50];
- sprintf(printBuffer, "--- error a:%d b:%d ---",a,b);
- Serial1.print(printBuffer);
- return 0;
- }
- /*
- @函數(shù) ScanPin
- @作用 使能某個(gè)引腳作用為探針,并對(duì)接收腳進(jìn)行掃描
- @傳入
- int KBPinMapNum 探針引腳
- @傳出 -
- */
- void ScanPin(int KBPinMapNum) {
- //設(shè)置所有引腳為輸入模式
- AllPinIN();
- //設(shè)置探針引腳輸出
- pinMode(KBPinMap[KBPinMapNum], OUTPUT);
- digitalWrite(KBPinMap[KBPinMapNum], HIGH);
- //輪詢引腳,是否有輸出電平
- char printBuffer[50];
- for (int i = 0; i < sizeof(KBPinMap) / sizeof(KBPinMap[0]); i++) {
- if (i == KBPinMapNum) continue; //跳過(guò)探針引腳
- if (analogRead(KBPinMap[i])>2000) {
- KBScan[i] = 1;
- sprintf(printBuffer, "%c # 探針[%d]:%d -> 接收[%d]:%d",ScanKeyMap(KBPinMapNum,i), KBPinMapNum, KBPinMap[KBPinMapNum], i, KBScan[i]);
- Serial1.println(printBuffer);
- }
- }
- }
- /*
- @函數(shù) ClearKBScan
- @作用 清除接收引腳狀態(tài)表
- @傳入 -
- @傳出 -
- */
- void ClearKBScan() {
- memset(KBScan,0,sizeof(KBScan) / sizeof(KBScan[0]));
- /*
- for (int i = 0; i < sizeof(KBScan) / sizeof(KBScan[0]); i++)
- KBScan[i] = 0;
- */
- }
- /*
- @函數(shù) AllPinOut
- @作用 全部引腳IO設(shè)置為輸出模式
- @傳入 -
- @傳出 -
- */
- void AllPinOut() {
- for (int i = 0; i < sizeof(KBPinMap) / sizeof(KBPinMap[0]); i++) {
- pinMode(KBPinMap[i], OUTPUT);
- digitalWrite(KBPinMap[i], HIGH);
- }
- }
- /*
- @函數(shù) AllPinIN
- @作用 全部引腳IO設(shè)置為輸入模式
- @傳入 -
- @傳出 -
- */
- void AllPinIN() {
- for (int i = 0; i < sizeof(KBPinMap) / sizeof(KBPinMap[0]); i++)
- pinMode(KBPinMap[i], INPUT_PULLDOWN);
- }
- /*
- @函數(shù) SerialPrintAllKBScan
- @作用 串口輸出 引腳狀態(tài)表
- @傳入 -
- @傳出 -
- */
- void SerialPrintAllKBScan() {
- char printBuffer[50];
- for (int i = 0; i < sizeof(KBPinMap) / sizeof(KBPinMap[0]); i++) {
- sprintf(printBuffer, "[%d]-%d ", i, KBScan[i]);
- Serial1.print(printBuffer);
- }
- Serial1.print("\n\r");
- }
- void setup() {
- Serial1.begin(115200);
- Serial1.println(" *]]*");
- Serial1.println(" *]]OOO@@@@| ");
- Serial1.println(" ,]]|OOO@@@@@@@@@@| ");
-
- ……………………
- …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼
51hei.png (4.04 KB, 下載次數(shù): 99)
下載附件
2021-3-14 15:04 上傳
項(xiàng)目文件
|