简介如果你希望把旧笔记本键盘改造为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源程序:
- #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 按照键盘排线接入开发板的顺序填写引脚设定
- // 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};
- /*
- @函数 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;
- }
- /*
- @函数 ScanPin
- @作用 使能某个引脚作用为探针,并对接收脚进行扫描
- @传入
- int KBPinMapNum 探针引脚
- @传出 -
- */
- void ScanPin(int KBPinMapNum) {
- //设置所有引脚为输入模式
- AllPinIN();
- //设置探针引脚输出
- 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; //跳过探针引脚
- 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);
- }
- }
- }
- /*
- @函数 ClearKBScan
- @作用 清除接收引脚状态表
- @传入 -
- @传出 -
- */
- void ClearKBScan() {
- memset(KBScan,0,sizeof(KBScan) / sizeof(KBScan[0]));
- /*
- for (int i = 0; i < sizeof(KBScan) / sizeof(KBScan[0]); i++)
- KBScan[i] = 0;
- */
- }
- /*
- @函数 AllPinOut
- @作用 全部引脚IO设置为输出模式
- @传入 -
- @传出 -
- */
- void AllPinOut() {
- for (int i = 0; i < sizeof(KBPinMap) / sizeof(KBPinMap[0]); i++) {
- pinMode(KBPinMap[i], OUTPUT);
- digitalWrite(KBPinMap[i], HIGH);
- }
- }
- /*
- @函数 AllPinIN
- @作用 全部引脚IO设置为输入模式
- @传入 -
- @传出 -
- */
- void AllPinIN() {
- for (int i = 0; i < sizeof(KBPinMap) / sizeof(KBPinMap[0]); i++)
- pinMode(KBPinMap[i], INPUT_PULLDOWN);
- }
- /*
- @函数 SerialPrintAllKBScan
- @作用 串口输出 引脚状态表
- @传入 -
- @传出 -
- */
- 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@@@@@@@@@@| ");
-
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
项目文件 |