找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 5176|回復(fù): 2
打印 上一主題 下一主題
收起左側(cè)

STM32鍵盤(pán)線序測(cè)試儀 筆記本鍵盤(pán)改USB Arduino源程序

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主


簡(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è)置)


  • 打開(kāi)串口監(jiān)視器,并嘗試按下鍵盤(pán)(插在FPC轉(zhuǎn)接板上的)上的任意鍵,觀察串口監(jiān)視器是否有相應(yīng)輸出





串口輸出數(shù)據(jù)格式
  • 探針:指的是作為探針的引腳,該引腳會(huì)在掃描時(shí)輸出高電平
  • 接收:當(dāng)前除探針外剩下的引腳進(jìn)入輸入模式,試圖接收來(lái)自探針引腳的信號(hào)
  • 探針[KBPinMap下標(biāo)]:探針Pin
  • 接收[KBPinMap下標(biāo)]:接收Pin


試試看


解析:數(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源程序:
  1. #define SWAP(x, y) \
  2.         (y) = (x) + (y); \
  3.         (x) = (y) - (x); \
  4.         (y) = (y) - (x);

  5. //按鍵映射表,按需修改
  6. //{探針id,接收id,ASCII}
  7. byte KeyMap[][3]={
  8.   {5,19,'1'},
  9.   {5,18,'2'},
  10.   {6,19,'3'},
  11.   {8,19,'6'},
  12.   {8,18,'7'},
  13.   {9,19,'8'},
  14.   {5,17,'q'},
  15.   {5,20,'w'},
  16.   {6,18,'e'},
  17.   {8,17,'y'},
  18.   {9,17,'u'},
  19.   {9,18,'i'},
  20.   {10,20,'o'},
  21.   {5,21,'a'},
  22.   {6,20,'s'},
  23.   {6,17,'d'},
  24.   {8,20,'h'},
  25.   {9,20,'j'},
  26.   {9,21,'k'},
  27.   {10,21,'l'},
  28.   {5,22,'z'},
  29.   {6,21,'x'},
  30.   {6,22,'c'},
  31.   {8,22,'b'},
  32.   {8,21,'n'},
  33.   {9,22,'m'},
  34.   {10,22,'<'},
  35.   {11,22,'>'},
  36.   {11,21,'/'},
  37. };

  38. //KBPinMap 按照鍵盤(pán)排線接入開(kāi)發(fā)板的順序填寫(xiě)引腳設(shè)定
  39. //                 0     1     2     3     4    5    6   7    8    9    10    11    12   13   14   15   16   17    18    19   20   21   22   23
  40. 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};
  41. int KBScan[] = {0};

  42. /*
  43.     @函數(shù) ScanKeyMap
  44.     @作用   搜索按鍵映射表并輸出按鍵映射
  45.     @傳入
  46.         byte a 探針id
  47.         byte b 接收id
  48.     @傳出
  49.         char
  50. */
  51. char ScanKeyMap(byte a,byte b){
  52.   if (a>b) {
  53.     byte c=a;
  54.     a=b;
  55.     b=c;
  56.   }
  57.   for (int i=0;i<sizeof(KeyMap)/sizeof(KeyMap[0]);i++) {
  58.     if (KeyMap[i][0]==a&&KeyMap[i][1]==b) return KeyMap[i][2];
  59.   }
  60.   char printBuffer[50];
  61.   sprintf(printBuffer, "--- error a:%d b:%d ---",a,b);
  62.   Serial1.print(printBuffer);
  63.   return 0;
  64. }

  65. /*
  66.     @函數(shù) ScanPin
  67.     @作用 使能某個(gè)引腳作用為探針,并對(duì)接收腳進(jìn)行掃描
  68.     @傳入
  69.         int KBPinMapNum 探針引腳
  70.     @傳出 -
  71. */
  72. void ScanPin(int KBPinMapNum) {
  73.   //設(shè)置所有引腳為輸入模式
  74.   AllPinIN();
  75.   //設(shè)置探針引腳輸出
  76.   pinMode(KBPinMap[KBPinMapNum], OUTPUT);
  77.   digitalWrite(KBPinMap[KBPinMapNum], HIGH);
  78.   //輪詢引腳,是否有輸出電平
  79.   char printBuffer[50];
  80.   for (int i = 0; i < sizeof(KBPinMap) / sizeof(KBPinMap[0]); i++) {
  81.     if (i == KBPinMapNum) continue; //跳過(guò)探針引腳
  82.     if (analogRead(KBPinMap[i])>2000) {
  83.       KBScan[i] = 1;  
  84.       sprintf(printBuffer, "%c # 探針[%d]:%d  ->  接收[%d]:%d",ScanKeyMap(KBPinMapNum,i), KBPinMapNum, KBPinMap[KBPinMapNum], i, KBScan[i]);
  85.       Serial1.println(printBuffer);
  86.     }
  87.   }
  88. }



  89. /*
  90.     @函數(shù) ClearKBScan
  91.     @作用 清除接收引腳狀態(tài)表
  92.     @傳入 -
  93.     @傳出 -
  94. */
  95. void ClearKBScan() {
  96.   memset(KBScan,0,sizeof(KBScan) / sizeof(KBScan[0]));
  97.   /*
  98.   for (int i = 0; i < sizeof(KBScan) / sizeof(KBScan[0]); i++)
  99.     KBScan[i] = 0;
  100.     */
  101. }

  102. /*
  103.     @函數(shù) AllPinOut
  104.     @作用 全部引腳IO設(shè)置為輸出模式
  105.     @傳入 -
  106.     @傳出 -
  107. */
  108. void AllPinOut() {
  109.   for (int i = 0; i < sizeof(KBPinMap) / sizeof(KBPinMap[0]); i++) {
  110.     pinMode(KBPinMap[i], OUTPUT);
  111.     digitalWrite(KBPinMap[i], HIGH);
  112.   }
  113. }
  114. /*
  115.     @函數(shù) AllPinIN
  116.     @作用 全部引腳IO設(shè)置為輸入模式
  117.     @傳入 -
  118.     @傳出 -
  119. */
  120. void AllPinIN() {
  121.   for (int i = 0; i < sizeof(KBPinMap) / sizeof(KBPinMap[0]); i++)
  122.     pinMode(KBPinMap[i], INPUT_PULLDOWN);
  123. }

  124. /*
  125.     @函數(shù) SerialPrintAllKBScan
  126.     @作用 串口輸出 引腳狀態(tài)表
  127.     @傳入 -
  128.     @傳出 -
  129. */
  130. void SerialPrintAllKBScan() {
  131.   char printBuffer[50];
  132.   for (int i = 0; i < sizeof(KBPinMap) / sizeof(KBPinMap[0]); i++) {
  133.     sprintf(printBuffer, "[%d]-%d ", i, KBScan[i]);
  134.     Serial1.print(printBuffer);
  135.   }
  136.   Serial1.print("\n\r");
  137. }

  138. void setup() {
  139.   Serial1.begin(115200);
  140.   Serial1.println("                                                                                                   *]]*");
  141.   Serial1.println("                                                                                           *]]OOO@@@@| ");
  142.   Serial1.println("                                                                                   ,]]|OOO@@@@@@@@@@|  ");
  143.   
  144. ……………………

  145. …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼


項(xiàng)目文件
51hei論壇下載:       stm32-keyboard-scan-main.7z (2.21 MB, 下載次數(shù): 13)


評(píng)分

參與人數(shù) 1黑幣 +100 收起 理由
admin + 100 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:138956 發(fā)表于 2021-3-15 13:50 | 只看該作者
沒(méi)看懂呀!
回復(fù)

使用道具 舉報(bào)

板凳
ID:543424 發(fā)表于 2022-2-16 18:02 | 只看該作者
請(qǐng)問(wèn)這個(gè)測(cè)試程序線路怎么連接?有原理圖嗎
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表