找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3975|回复: 2
收起左侧

STM32键盘线序测试仪 笔记本键盘改USB Arduino源程序

[复制链接]
ID:277903 发表于 2021-3-14 10:30 | 显示全部楼层 |阅读模式
01.jpg

简介
如果你希望把旧笔记本键盘改造为usb的形式,或者你希望对已有的键盘进行深层次的改造。那么你可能需要了解所需要改造的键盘上按键排布的方式以及排线定义!过去这个过程是艰难且漫长的,你需要使用一些简易的自制工具对每个引脚进行检测,这往往需要耗费大量的时间。


本工具可以为你做的事情
  • 免除大量对飞线焊接
  • 实时扫描按键,并输出对应的引脚映射
  • 串口输出按下的按键(如果存在按键映射表)
  • 全自动生成按键映射表(未实现)
  • 实现usb按键(未实现)


材料
  • Stm32F103 最小系统板子 (可用国产HK32F103替代)
  • FPC转接板 (可以前往立创eda社区,下载开源的PCB文件,并且5元打板制造)
  • FPC转接底座 (通常使用1.0间距 建议先量一量键盘排线的长度)
  • 一些杜邦线


步骤
  • 安装FPC转接板
  • 把键盘插到FPC转接板上
  • 通过杜邦线从FPC转接板上再次转接到Stm32F103最小系统板子上
  • 使用Arduino IDE编译固件上传 (需要手动设置gpio :按照上一步接线的情况进行设置)
03.png

  • 打开串口监视器,并尝试按下键盘(插在FPC转接板上的)上的任意键,观察串口监视器是否有相应输出


02.png


串口输出数据格式
  • 探针:指的是作为探针的引脚,该引脚会在扫描时输出高电平
  • 接收:当前除探针外剩下的引脚进入输入模式,试图接收来自探针引脚的信号
  • 探针[KBPinMap下标]:探针Pin
  • 接收[KBPinMap下标]:接收Pin


试试看
04.png

解析:数组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.png
项目文件
51hei论坛下载:       stm32-keyboard-scan-main.7z (2.21 MB, 下载次数: 13)

评分

参与人数 1黑币 +100 收起 理由
admin + 100 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:138956 发表于 2021-3-15 13:50 | 显示全部楼层
没看懂呀!
回复

使用道具 举报

ID:543424 发表于 2022-2-16 18:02 | 显示全部楼层
请问这个测试程序线路怎么连接?有原理图吗
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表