使用CH9329代码制作自制键盘,让任何单片机都能实现键盘功能

简介

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); // 等待按键抬起
     }
     }
    }
    }
    

    物联沃分享整理
    物联沃-IOTWORD物联网 » 使用CH9329代码制作自制键盘,让任何单片机都能实现键盘功能

    发表评论