久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5131|回復: 2
打印 上一主題 下一主題
收起左側

STM32鍵盤線序測試儀 筆記本鍵盤改USB Arduino源程序

[復制鏈接]
跳轉到指定樓層
樓主


簡介
如果你希望把舊筆記本鍵盤改造為usb的形式,或者你希望對已有的鍵盤進行深層次的改造。那么你可能需要了解所需要改造的鍵盤上按鍵排布的方式以及排線定義!過去這個過程是艱難且漫長的,你需要使用一些簡易的自制工具對每個引腳進行檢測,這往往需要耗費大量的時間。


本工具可以為你做的事情
  • 免除大量對飛線焊接
  • 實時掃描按鍵,并輸出對應的引腳映射
  • 串口輸出按下的按鍵(如果存在按鍵映射表)
  • 全自動生成按鍵映射表(未實現)
  • 實現usb按鍵(未實現)


材料
  • Stm32F103 最小系統板子 (可用國產HK32F103替代)
  • FPC轉接板 (可以前往立創eda社區,下載開源的PCB文件,并且5元打板制造)
  • FPC轉接底座 (通常使用1.0間距 建議先量一量鍵盤排線的長度)
  • 一些杜邦線


步驟
  • 安裝FPC轉接板
  • 把鍵盤插到FPC轉接板上
  • 通過杜邦線從FPC轉接板上再次轉接到Stm32F103最小系統板子上
  • 使用Arduino IDE編譯固件上傳 (需要手動設置gpio :按照上一步接線的情況進行設置)


  • 打開串口監視器,并嘗試按下鍵盤(插在FPC轉接板上的)上的任意鍵,觀察串口監視器是否有相應輸出





串口輸出數據格式
  • 探針:指的是作為探針的引腳,該引腳會在掃描時輸出高電平
  • 接收:當前除探針外剩下的引腳進入輸入模式,試圖接收來自探針引腳的信號
  • 探針[KBPinMap下標]:探針Pin
  • 接收[KBPinMap下標]:接收Pin


試試看


解析:數組KBPinMap第11項與開發板對應的33號(PC14)引腳 輸出高電平 并且被 數組KBPinMap第6項與開發板對應的1號(PA3)引腳 接收到,這意味著這時鍵盤上對應的這兩個引腳是對應關系

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 按照鍵盤排線接入開發板的順序填寫引腳設定
  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.     @函數 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.     @函數 ScanPin
  67.     @作用 使能某個引腳作用為探針,并對接收腳進行掃描
  68.     @傳入
  69.         int KBPinMapNum 探針引腳
  70.     @傳出 -
  71. */
  72. void ScanPin(int KBPinMapNum) {
  73.   //設置所有引腳為輸入模式
  74.   AllPinIN();
  75.   //設置探針引腳輸出
  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; //跳過探針引腳
  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.     @函數 ClearKBScan
  91.     @作用 清除接收引腳狀態表
  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.     @函數 AllPinOut
  104.     @作用 全部引腳IO設置為輸出模式
  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.     @函數 AllPinIN
  116.     @作用 全部引腳IO設置為輸入模式
  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.     @函數 SerialPrintAllKBScan
  126.     @作用 串口輸出 引腳狀態表
  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. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼


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


評分

參與人數 1黑幣 +100 收起 理由
admin + 100 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

沙發
ID:138956 發表于 2021-3-15 13:50 | 只看該作者
沒看懂呀!
回復

使用道具 舉報

板凳
ID:543424 發表于 2022-2-16 18:02 | 只看該作者
請問這個測試程序線路怎么連接?有原理圖嗎
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产精品黄| 欧美激情精品久久久久 | 国产日韩精品视频 | 精品国产伦一区二区三区观看说明 | 丝袜 亚洲 欧美 日韩 综合 | 国产91在线 | 亚洲 | www一级片 | 在线免费观看黄色av | 亚洲在线一区 | 久久国产精品-国产精品 | 欧美色视频免费 | 国产精品国产精品国产专区不片 | 欧美一级一区 | 成人免费黄视频 | 欧美色综合一区二区三区 | 国产免费看 | 中文字幕一区二区三区精彩视频 | 在线一级片| 亚洲精品一区二区三区 | 午夜视频免费在线观看 | 午夜在线观看视频 | 日日操夜夜操天天操 | 美日韩视频| 久久精品视频在线免费观看 | 天天操天天操 | 成人精品国产一区二区4080 | 成人午夜高清 | 久久久久一区二区三区 | 欧美精品一区二区在线观看 | 99在线免费视频 | www.狠狠操 | 日韩三极| 91久久精品国产91久久性色tv | 国产免费一区二区 | 欧美午夜精品 | 精品国产乱码久久久久久闺蜜 | 中文字幕不卡在线观看 | 日韩一区不卡 | 国产日韩欧美 | 国产婷婷色一区二区三区 | 国产精品美女www爽爽爽视频 |