【自制键盘01】CH9329代码两则,让任何单片机都能做键盘

news2024/9/9 4:39:13

简介

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/458908.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何实现电脑通过手机上网?1分钟搞定!

案例&#xff1a;电脑没网时&#xff0c;如何通过手机上网&#xff1f; 【想用电脑看电影&#xff0c;但是附近没有Wi-Fi。朋友说可以说电脑可以通过手机上网&#xff0c;但我们都不知道具体如何操作&#xff0c;有没有小伙伴可以教教我们。】 在没有Wi-Fi或有线网络接入时&a…

《Left ventricular hypertrophy detection using electrocardiographic signal》阅读笔记

论文的摘要 Left ventricular hypertrophy (LVH) indicates subclinical organ damage, associating with the incidence of cardiovascular diseases. From the medical perspective, electrocardiogram (ECG) is a low-cost, non-invasive, and easily reproducible tool th…

低代码平台-宜搭的核心概念

宜搭的核心概念 文章目录 全局变量基本的变量使用查看输出内容以及调试方式事件绑定页面生命周期条件渲染循环渲染自定义样式表单校验 全局变量 在左侧数据源中添加变量&#xff0c;添加变量的写法和js的写法一致。 基本的变量使用 给文本绑定数据源&#xff0c;点击左侧刚才定…

蒸发器前氟离子超标的解决方法

深度除氟工艺 1、活性氧化铝&#xff1a;需PH调整至酸性 2、碳基/羟基磷灰石&#xff1a;再生次数有限制 3、反渗透膜&#xff1a;造价成本高 4、特种除氟树脂&#xff1a;预处理需做好 氟化物选择吸附树脂 Tulsimer CH-87 是一款去除水溶液中氟离子的专用的凝胶型选择性…

LVS负载均衡之DR模式

DR调度服务器 192.168.255.128 Nginx节点服务器1 192.168.255.130 Nginx节点服务器2 192.168.255.131 统一虚拟ip&#xff08;vip&#xff09; 192.168.255.188 访问客户端 192.168.255.134 第一步首先关掉所有虚拟机的防火墙 systemctl stop firewalld.service setenfor…

Maya - 后缀为xgen文件导出到虚幻引擎

Xgen是集成在Maya中的工具&#xff0c;可以在指定模型表面生成和控制大量物体的集成和离散&#xff1b;经常用于复杂的毛发制作&#xff0c;可以方便的用笔刷等控制曲线&#xff08;curves&#xff09;和导引线&#xff08;guides&#xff09;等线条来控制毛发的走向&#xff1…

【MySQL】插入文件路径,反斜杠消失

系列文章 C#底层库–MySQL脚本自动构建类&#xff08;insert、update语句生成&#xff09; 本文链接&#xff1a;https://blog.csdn.net/youcheng_ge/article/details/129179216 C#底层库–MySQL数据库访问操作辅助类&#xff08;推荐阅读&#xff09; 本文链接&#xff1a;h…

克隆Linux系统(centos)

克隆前得保证你有一台Linux系统的虚拟机了。 如果没有&#xff0c;可以参考这篇文章&#xff1a; 安装VMware虚拟机、Linux系统&#xff08;CentOS7&#xff09;_何苏三月的博客-CSDN博客 按照示意图一步一步执行即可。 克隆前先关闭运行的虚拟机系统。 然后右键已安装的虚拟…

看完就懂的vue2与vue3响应式的区别

一、前言 数据响应式 所谓数据响应式就是建立响应式数据与依赖&#xff08;调用了响应式数据的操作&#xff09;之间的关系&#xff0c;当响应式数据发生变化时&#xff0c;可以通知那些使用了这些响应式数据的依赖操作进行相关更新操作&#xff0c;可以是DOM更新&#xff0c;也…

视频音频提取器推荐:快速提取视频中的音频!

视频中的音频可以用于很多用途&#xff0c;比如制作配乐、音频剪辑等。但是&#xff0c;许多人并不知道如何将视频中的音频提取出来。如果您也是这样的情况&#xff0c;那么本文为您介绍一个简单易用的视频音频提取器&#xff1a;。 它是一个免费的在线工具&#xff0c;可以帮…

【Android FrameWork(一)】- 启动程序 init

文章目录 背景源码分析&#xff08;第一个启动程序 init&#xff09;1.main.cpp2.init.cpp3.property_service.cpp4,LoadBootScripts 拓展知识Android的架构图I/O多路复用 总结 离职找工作间隙&#xff0c;停下脚步整理下自己的知识体系&#xff0c;把之前忙于开发未曾整理的知…

SOLIDWORKS Electrical无缝集成电气和机械设计

集成电气系统设计SOLIDWORKS⑧Electrical 解决方案借助专为工程专业设计的特定工具简化了电气铲品设计&#xff0c;并借助直观的用户界面更快地设计嵌入式电气系统。 与SOLIDWORKS 3DCAD的原生集成能提供更好的协作与生产效率&#xff0c;同时减少产品延迟、提高设计的一致性与…

微信小程序nodejs+python+php+springboot+vue 法律知识分享科普系统平台

要想实现法律知识分享平台的各项功能&#xff0c;需要后台数据库的大力支持。管理员验证注册信息&#xff0c;收集的信息&#xff0c;并由此分析得出的关联信息等大量的数据都由数据库管理。本文中数据库服务器端采用了Mysql作为后台数据库 紧密联系起来。在设计过程中&#xf…

从零开始,轻松入门React - 构建现代Web应用的利器!

文章目录 前言渲染 React 组件使用 JSX传递属性&#xff08;Props&#xff09;处理组件状态&#xff08;State&#xff09;处理用户输入&#xff08;事件处理&#xff09;组合和嵌套组件写在最后 前言 React 是一种由 Facebook 开发的流行的 JavaScript 库&#xff0c;用于构建…

通用人工智能+智能车舱,商汤绝影带来怎样一番景象?

本文来源&#xff1a;智车科技 / 导读 / 进入4月&#xff0c;中国科技圈迎来最卷的时刻&#xff0c;这可能中国AI史上一个重要节点。ChatGPT、GPT-4的出圈掀起了通用人工智能&#xff08;AGI&#xff09;的技术狂潮&#xff0c;引爆了一场以大模型为代表的生成式AI狂飙&#x…

【基础】Kafka -- 日志存储

Kafka -- 日志存储 日志文件目录日志索引偏移量索引时间戳索引 日志清理日志删除基于时间基于日志大小基于日志起始偏移量 日志压缩 日志文件目录 Kafka 中的消息以主题为单位进行基本归类&#xff0c;而每个主题又可以划分为一个或者多个分区。在不考虑多副本的情况下&#x…

Adobe Photoshop 软件下载

Adobe Photoshop&#xff0c;简称“PS”&#xff0c;是由Adobe Systems开发和发行的图像处理软件。Photoshop主要处理以像素所构成的数字图像。 时至今日&#xff0c;Adobe Photoshop 已经成为当今世界上最流行、应用最广泛的图像处理软件。不但设计专业的学生要系统的学习这个…

【算法】最容易懂得的红黑树

红黑树是一个平衡的二叉树&#xff0c;但不是一个完美的平衡二叉树。虽然我们希望一个所有查找都能在~lgN次比较内结束&#xff0c;但是这样在动态插入中保持树的完美平衡代价太高&#xff0c;所以&#xff0c;我们稍微放松逛一下限制&#xff0c;希望找到一个能在对数时间内完…

【iOS】AVPlayer 视频播放

视频播放器的类别 iOS开发中不可避免地会遇到音视频播放方面的需求。 常用的音频播放器有 AVAudioPlayer、AVPlayer 等。不同的是&#xff0c;AVAudioPlayer 只支持本地音频的播放&#xff0c;而 AVPlayer 既支持本地音频播放&#xff0c;也支持网络音频播放。 常用的视频播放…

python学习——【第八弹】

前言 上篇文章 python学习——【第七弹】学习了python中的可变序列集合&#xff0c;自此python中的序列的学习就完成啦&#xff0c;这篇文章开始学习python中的函数。 函数 在学习其他编程语言的时候我们就了解过函数&#xff1a;函数就是执行特定任何以完成特定功能的一段代…