LED矩阵由两个集成电路(IC)驱动,一个驱动行,一个驱动列,驱动列的源IC是PCA9634 I2C LED驱动:
驱动行的为TPIC6C595:
让我们看下相关代码: - uint8_t LedStates[LED_MATRIX_ROWS_NUM];
-
- void LedMatrix_UpdateNextRow(bool IsKeyboardColEnabled)
- {
- TPIC6C595_Transmit(LedStates[ActiveLedMatrixRow]);
- PCA9634_Transmit(1 << ActiveLedMatrixRow);
-
- if (++ActiveLedMatrixRow == LED_MATRIX_ROWS_NUM) {
- ActiveLedMatrixRow = 0;
- }
- }
LedMatrix_UpdateNextRow()将以每毫秒的速度被调用,更新LED矩阵的一行,LedMatrix数组存储单个LED灯的状态,状态信息源于通过UART的按/释键事件。
整体情况 到这里我们已经逐步为自己的键盘建立了所有的必需组件。现在需要从全局出发,键盘的内部就像一个微型计算机网络:大量节点相互连接。所不同的是测量节点之间的距离不是米或公里,而是厘米,并且节点不是成熟的计算机,而是微型的集成电路。
但是到目前为止说的大多都是键盘装置方面的细节,关于UHK代理提的不多。UHK代理是配置器应用,通过键盘来满足用户的自定义需求。可以见于下段代码: - var enumerationModes = {
- 'keyboard' : 0,
- 'bootloader-right' : 1,
- 'bootloader-left' : 2
- };
-
- function sendReenumerateCommand(enumerationMode, callback)
- {
- var AGENT_COMMAND_REENUMERATE = 0;
- sendAgentCommand(AGENT_COMMAND_REENUMERATE, enumerationMode, callback);
- }
-
- function sendAgentCommand(command, arg, callback)
- {
- setReport(new Buffer([command, arg]), callback);
- }
-
- function setReport(message, callback)
- {
- device.controlTransfer(
- 0x21,
- 0x09,
- 0,
- interfaceNumber,
- message,
- callback
- );
- }
每一个命令都有一个8字节标识符和一组command-specific参数。目前,只有re-enumerate命令被实现,sendReenumerateCommand()使设备作为左/右引导装载程序重新装置,以此来升级固件或变为一个键盘设备。
创建原型 一切制造之前都需要有一个CAD设计:
3D打印的键盘会是这个样子:
|