简介
CH9329是一款由WCH(Nanjing QinHeng Electronics Co. Ltd.)生产的USB转串口芯片,可以方便地将USB接口转换为串口接口,它在键盘设计这块可以实现作为MCU和电脑设备的“中间人”,把串口信号转换为按键。
引脚定义
来自官网页面:
串口转HID键盘鼠标芯片 CH9329 - 南京沁恒微电子股份有限公司
主要特性和规格
- 支持USB 2.0协议,全速传输,最大传输速率为12Mbps;
- 内置16字节FIFO缓存,可以缓存接收和发送的数据;
- 支持多种流控模式,包括软件流控、硬件流控和自动流控;
- 支持自动唤醒功能,可以在需要时自动唤醒系统;
- 支持多种波特率、数据位、停止位和校验位的配置;
- 支持外部中断和定时器中断等多种中断模式;
- 工作电压范围:3.3V~5V;
- 工作温度范围:-40℃~85℃;
- 封装形式:SSOP20。
在CH9329芯片上测试串口通信功能。
#include <ch9329.h>
#define UART_TX PA3 // 定义串口发送引脚
#define UART_RX PA2 // 定义串口接收引脚
void delay(unsigned int x)
{
unsigned int i;
while(x--)
{
i=200;
while(i--);
}
}
void main()
{
CH9329_Init(); // 初始化CH9329
while(1)
{
CH9329_WriteByte('H'); // 发送字符'H'
CH9329_WriteByte('i'); // 发送字符'i'
CH9329_WriteByte('!'); // 发送字符'!'
delay(50000); // 延时0.5秒
}
}
在CH9329芯片上测试按键的按下和抬起。
#include <ch9329.h>
#define KEY_PIN PA0 // 定义按键输入引脚
void main()
{
CH9329_Init(); // 初始化CH9329
while(1)
{
if(CH9329_ReadBit(KEY_PIN) == 0) // 检测按键是否按下
{
CH9329_WriteByte('P'); // 发送字符'P'表示按键按下
while(CH9329_ReadBit(KEY_PIN) == 0); // 等待按键抬起
CH9329_WriteByte('R'); // 发送字符'R'表示按键抬起
}
}
}
测试矩阵键盘
#include <ch9329.h>
#define ROWS 4 // 定义矩阵键盘的行数
#define COLS 4 // 定义矩阵键盘的列数
// 定义矩阵键盘的行列引脚
#define ROW1 PA0
#define ROW2 PA1
#define ROW3 PA2
#define ROW4 PA3
#define COL1 PA4
#define COL2 PA5
#define COL3 PA6
#define COL4 PA7
// 定义按键矩阵
char keyMap[ROWS][COLS] = {
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}
};
void main()
{
CH9329_Init(); // 初始化CH9329
// 配置行引脚为输出
CH9329_SetDirection(ROW1, OUTPUT);
CH9329_SetDirection(ROW2, OUTPUT);
CH9329_SetDirection(ROW3, OUTPUT);
CH9329_SetDirection(ROW4, OUTPUT);
// 配置列引脚为输入
CH9329_SetDirection(COL1, INPUT);
CH9329_SetDirection(COL2, INPUT);
CH9329_SetDirection(COL3, INPUT);
CH9329_SetDirection(COL4, INPUT);
while(1)
{
// 逐行扫描矩阵键盘
for(int i=0; i<ROWS; i++)
{
// 设置当前行为高电平,其他行为低电平
CH9329_WriteBit(ROW1, i==0 ? 1 : 0);
CH9329_WriteBit(ROW2, i==1 ? 1 : 0);
CH9329_WriteBit(ROW3, i==2 ? 1 : 0);
CH9329_WriteBit(ROW4, i==3 ? 1 : 0);
// 检测列引脚的状态,判断是否有按键按下
if(CH9329_ReadBit(COL1) == 0) // 列1有按键按下
{
CH9329_WriteByte(keyMap[i][0]); // 发送按键字符
while(CH9329_ReadBit(COL1) == 0); // 等待按键抬起
}
if(CH9329_ReadBit(COL2) == 0) // 列2有按键按下
{
CH9329_WriteByte(keyMap[i][1]); // 发送按键字符
while(CH9329_ReadBit(COL2) == 0); // 等待按键抬起
}
if(CH9329_ReadBit(COL3) == 0) // 列3有按键按下
{
CH9329_WriteByte(keyMap[i][2]); // 发送按键字符
while(CH9329_ReadBit(COL3) == 0); // 等待按键抬起
}
if(CH9329_ReadBit(COL== 0) // 列4有按键按下
{
CH9329_WriteByte(keyMap[i][3]); // 发送按键字符
while(CH9329_ReadBit(COL4) == 0); // 等待按键抬起
}
}
}
}