【开源项目学习】多功能小键盘(基于HK32F030M)
并不是真正意义上的键盘!!!需谨慎看!!
并不是真正意义上的键盘!!!需谨慎看!!
并不是真正意义上的键盘!!!需谨慎看!!
并不是真正意义上的键盘!!!需谨慎看!!
项目原地址:【航顺训练营】多功能小键盘 - 立创EDA开源硬件平台
说明:如果看到了这篇文章,请了解此项目非本人制作。只是用开源项目来学习。
项目渲染图:

目录
简介
代码分析
main.c
main.h
key.c
key.h
中断服务函数:
ec11.c
ec11.h
其它函数不重要了,不分析了。
蓝牙模块
硬件部分
EC11部分
按键部分
type-C接口
USB-TTL
电池充电电路
MCU
简介
项目采用航顺芯片设计制造的HK32F030MF4P6。
MF4P6有一个ADC、16个外部中断、16个GPIO端口、封装形式为TSSOP20。
HK32F030不支持USB协议数据端口,本项目采用USB-TTL芯片。
HK32F030数据手册、用户手册:HK32F030M_技术支持_深圳市航顺芯片技术研发有限公司
代码分析
按照程序文件分析代码。具体文件有:


main.c、usart.c、tim.c、mcu.c、ec11.c、key.c。
咋这么像是正点原子的风格啊。
main.c
/********************************************************************************* @file : main.c* @brief : Main program body******************************************************************************* @attention**//* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "hk32f030m.h"
#include "hk32f030m_gpio.h"
#include "usart.h"
#include "string.h"#include "key.h"
#include "EC11.h"#include "tim.h"int main(void)
/* Infinite loop */
{for(int i=0;i<10;i++) // 延时 保证正常下载程序softWareDelay();KEY_Configurature(); // 按键初始化EC11_Configurature(); // EC11初始化USART_Configurature(); // 串口初始化softWareDelay(); // 软件延时等待系统稳定TIM6_Config(); // 3S定时器初始化while (1){KEY_Scan();switch(EC11_Read_T()){case 0x01:printf("Z\r\n");break; // 旋钮1左转case 0x02:printf("C\r\n");break; // 旋钮1右转case 0x03:printf("X\r\n");break; // 旋钮1按下case 0x11:printf("Q\r\n");break; // 旋钮1按下左转case 0x12:printf("W\r\n");break; // 旋钮1按下右转}switch(EC11_Read_D()){case 0x01:printf("N\r\n");break; // 旋钮2右转case 0x02:printf("V\r\n");break; // 旋钮2左转case 0x03:printf("B\r\n");break; // 旋钮2按下case 0x11:printf("H\r\n");break; // 旋钮2按下右转case 0x12:printf("G\r\n");break; // 旋钮2按下左转}}
}
/*时钟配置*/
void RCC_Configuration(void)
{RCC_AHBPeriphClockCmd( RCC_AHBPeriph_GPIOA, ENABLE);RCC_AHBPeriphClockCmd( RCC_AHBPeriph_GPIOB, ENABLE);RCC_AHBPeriphClockCmd( RCC_AHBPeriph_GPIOC, ENABLE);RCC_AHBPeriphClockCmd( RCC_AHBPeriph_GPIOD, ENABLE);RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6, ENABLE);
}
/*软件延时*/
void softWareDelay(void)
{uint16_t i;uint16_t j;for(i=0;i<500;i++){for(j=0;j<1000;j++){__NOP();}}
}#ifdef USE_FULL_ASSERT
/*** @brief Reports the name of the source file and the source line number* where the assert_param error has occurred.* @param file: pointer to the source file name* @param line: assert_param error line source number* @retval None*/
void assert_failed(uint8_t* file, uint32_t line)
{/* User can add his own implementation to report the file name and line number,tex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
}
#endif /* USE_FULL_ASSERT */
main.h
/* USER CODE BEGIN Header */
/********************************************************************************* @file : main.h* @brief : Header for main.c file.* This file contains the common defines of the application.*******************************************************************************/
/* USER CODE END Header *//* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __MAIN_H
#define __MAIN_H#ifdef __cplusplus
extern "C" {
#endif//#define DEBUG // 调试标志位 如果开启 则下载引脚不使用void RCC_Configuration(void); // 时钟初始化
void softWareDelay(void); // 软件延时#ifdef __cplusplus
}
#endif#endif /* __MAIN_H */
key.c
由于主函数调用的KEY_Scan()函数,所以从key.c开始看起。
#include "key.h"
/**
* @brief 键盘引脚初始化
* @param
* @ref
* @return
* -
* @details
* @see
*/
void KEY_Configurature(void)
{GPIO_InitTypeDef GPIO_InitStructure;EXTI_InitTypeDef EXTI_InitStructure;RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOD|RCC_AHBPeriph_GPIOC|RCC_AHBPeriph_GPIOA,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);// 初始化GPIOAGPIO_InitStructure.GPIO_Pin = MKEY1 | MKEY2;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;GPIO_Init(KEYPortGrou1, &GPIO_InitStructure);//机械按键1中断初始化EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;EXTI_InitStructure.EXTI_Line = MKEY1_Line; //EXTI_Line2EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;EXTI_InitStructure.EXTI_LineCmd = ENABLE;EXTI_Init(&EXTI_InitStructure);SYSCFG_EXTILineConfig(KEYPortGrou1_EXTI,MKEY1_Source);EXTI_ClearITPendingBit(MKEY1_Line);//机械按键2中断初始化EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;EXTI_InitStructure.EXTI_Line = MKEY2_Line; //EXTI_Line1EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;EXTI_InitStructure.EXTI_LineCmd = ENABLE;EXTI_Init(&EXTI_InitStructure);SYSCFG_EXTILineConfig(KEYPortGrou1_EXTI,MKEY2_Source);EXTI_ClearITPendingBit(MKEY2_Line);// 初始化GPIOCGPIO_InitStructure.GPIO_Pin = KEYUP;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;GPIO_Init(KEYPortGroup2, &GPIO_InitStructure);// 初始化GPIODGPIO_InitStructure.GPIO_Pin = KEYDOWN | KEYLEFT | KEYRIGHT | KEYSIDE | MKEY3 | MKEY4;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;GPIO_Init(KEYPortGroup3, &GPIO_InitStructure);//机械按键3中断初始化EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;EXTI_InitStructure.EXTI_Line = MKEY3_Line ; //EXTI_Line5EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;EXTI_InitStructure.EXTI_LineCmd = ENABLE;EXTI_Init(&EXTI_InitStructure);SYSCFG_EXTILineConfig(KEYPortGrou3_EXTI,MKEY3_Source);EXTI_ClearITPendingBit(MKEY3_Line);//机械按键4中断初始化EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;EXTI_InitStructure.EXTI_Line = MKEY4_Line; //EXTI_Line4EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;EXTI_InitStructure.EXTI_LineCmd = ENABLE;EXTI_Init(&EXTI_InitStructure);SYSCFG_EXTILineConfig(KEYPortGrou3_EXTI,MKEY4_Source);EXTI_ClearITPendingBit(MKEY4_Line);//侧边按键中断初始化EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;EXTI_InitStructure.EXTI_Line = KEYSIDE_Line; //EXTI_Line7EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;EXTI_InitStructure.EXTI_LineCmd = ENABLE;EXTI_Init(&EXTI_InitStructure);SYSCFG_EXTILineConfig(KEYPortGrou3_EXTI,KEYSIDE_Source);EXTI_ClearITPendingBit(KEYSIDE_Line);NVIC_Configurature();
}
/**
* @brief 键盘引脚NVIC配置初始化
* @param
* @ref
* @return
* -
* @details
* @see
*/
void NVIC_Configurature(void)
{NVIC_InitTypeDef NVIC_InitStructure;// 初始化中断函数NVIC_InitStructure.NVIC_IRQChannel =EXTI1_IRQn;NVIC_InitStructure.NVIC_IRQChannelPriority = 0;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);// 初始化中断函数NVIC_InitStructure.NVIC_IRQChannel =EXTI2_IRQn;NVIC_InitStructure.NVIC_IRQChannelPriority = 0;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);// 初始化中断函数NVIC_InitStructure.NVIC_IRQChannel =EXTI4_IRQn;NVIC_InitStructure.NVIC_IRQChannelPriority = 0;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);// 初始化中断函数NVIC_InitStructure.NVIC_IRQChannel =EXTI5_IRQn;NVIC_InitStructure.NVIC_IRQChannelPriority = 0;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);// 初始化中断函数NVIC_InitStructure.NVIC_IRQChannel =EXTI7_IRQn;NVIC_InitStructure.NVIC_IRQChannelPriority = 0;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);
}
/**
* @brief 静音按键扫描函数
* @param
* @ref
* @return
* -
* @details
* @see
*/
//方向键。这一部分低电平有效
void KEY_Scan(void)
{if(!GPIO_ReadInputDataBit(KEYPortGroup2,KEYUP)){printf("U\r\n");while(!GPIO_ReadInputDataBit(KEYPortGroup2,KEYUP));}if(!GPIO_ReadInputDataBit(KEYPortGroup3,KEYDOWN)){printf("D\r\n");while(!GPIO_ReadInputDataBit(KEYPortGroup3,KEYDOWN));}if(!GPIO_ReadInputDataBit(KEYPortGroup3,KEYLEFT)){printf("L\r\n");while(!GPIO_ReadInputDataBit(KEYPortGroup3,KEYLEFT));}if(!GPIO_ReadInputDataBit(KEYPortGroup3,KEYRIGHT)){printf("R\r\n");while(!GPIO_ReadInputDataBit(KEYPortGroup3,KEYRIGHT));}}
// 按键测试函数
void KEY_Test(void)
{GPIO_InitTypeDef GPIO_InitStructure;EXTI_InitTypeDef EXTI_InitStructure;NVIC_InitTypeDef NVIC_InitStructure;RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOD|RCC_AHBPeriph_GPIOC|RCC_AHBPeriph_GPIOB|RCC_AHBPeriph_GPIOA,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);GPIO_InitStructure.GPIO_Pin = MKEY2; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;GPIO_Init(KEYPortGrou1, &GPIO_InitStructure);EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;EXTI_InitStructure.EXTI_Line = MKEY2_Line;EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;EXTI_InitStructure.EXTI_LineCmd = ENABLE;EXTI_Init(&EXTI_InitStructure);SYSCFG_EXTILineConfig(KEYPortGrou1_EXTI,MKEY2_Source);EXTI_ClearITPendingBit(MKEY2_Line);NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn;NVIC_InitStructure.NVIC_IRQChannelPriority = 0;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);
}
key.h
#ifndef _key_h
#define _key_h#ifdef __cplusplus
extern "C" {
#endif
#include "hk32f030m.h"
#include "hk32f030m_gpio.h"
#include "main.h"// GPIOA引脚**********************************
#define KEYPortGrou1 GPIOA
#define KEYPortGrou1_EXTI EXTI_PortSourceGPIOA
// 机械按键1
#define MKEY1 GPIO_Pin_2
#define MKEY1_Line EXTI_Line2
#define MKEY1_Source EXTI_PinSource2
// 机械按键2
#define MKEY2 GPIO_Pin_1
#define MKEY2_Line EXTI_Line1
#define MKEY2_Source EXTI_PinSource1// GPIOC引脚**********************************
#define KEYPortGroup2 GPIOC
#define KEYPortGrou2_EXTI EXTI_PortSourceGPIOC
// 静音按键
#define KEYUP GPIO_Pin_7// GPIOD引脚**********************************
#define KEYPortGroup3 GPIOD
#define KEYPortGrou3_EXTI EXTI_PortSourceGPIOD
// 静音按键
#define KEYRIGHT GPIO_Pin_3
#define KEYDOWN GPIO_Pin_2
#define KEYLEFT GPIO_Pin_1
// 侧边按键
#define KEYSIDE GPIO_Pin_7
#define KEYSIDE_Line EXTI_Line7
#define KEYSIDE_Source EXTI_PinSource7
//机械按键3 注意此引脚为下载引脚
#ifdef DEBUG
#define MKEY3 GPIO_Pin_7
#define MKEY3_Line EXTI_Line7
#define MKEY3_Source EXTI_PinSource7
#else
#define MKEY3 GPIO_Pin_5
#define MKEY3_Line EXTI_Line5
#define MKEY3_Source EXTI_PinSource5
#endif
//机械按键4
#define MKEY4 GPIO_Pin_4
#define MKEY4_Line EXTI_Line4
#define MKEY4_Source EXTI_PinSource4void KEY_Configurature(void); // 按键引脚初始化
void EXIT_Configurature(void); // 按键EXIT初始化
void NVIC_Configurature(void); // 按键NVIC初始化
void KEY_Scan(void); // 静音按键扫描函数
void KEY_Test(void); // 按键测试函数
#ifdef __cplusplus
}
#endif /* __cplusplus */#endif /*KEY.H*/
中断服务函数:
在文件hk32f030m_it.c中。
/******************************************************************************/
/* hk32f0301m Peripheral Interrupt Handlers */
/* Add here the Interrupt Handlers for the used peripherals. */
/* For the available peripheral interrupt handler names, */
/* please refer to the startup file (startup_hk32f0301m.s). */
/******************************************************************************//* USER CODE BEGIN 1 */
/*** @brief This function handles machine key 2 global interrupt request.* @param None* @retval None*/
void EXTI1_IRQHandler(void) //按键2
{if (EXTI_GetFlagStatus(EXTI_Line1) != RESET){printf("2\r\n");EXTI_ClearITPendingBit(EXTI_Line1);}
}
/*** @brief This function handles machine key 1 global interrupt request.* @param None* @retval None*/
void EXTI2_IRQHandler(void) //按键1
{if (EXTI_GetFlagStatus(EXTI_Line2) != RESET){printf("1\r\n");EXTI_ClearITPendingBit(EXTI_Line2);}
}
/*** @brief This function handles machine key 4 global interrupt request.* @param None* @retval None*/
void EXTI4_IRQHandler(void) //按键4
{if (EXTI_GetFlagStatus(EXTI_Line4) != RESET){printf("4\r\n");EXTI_ClearITPendingBit(EXTI_Line4);}
}
/*** @brief This function handles machine key 3 global interrupt request.* @param None* @retval None*/
void EXTI5_IRQHandler(void) //按键3
{if (EXTI_GetFlagStatus(EXTI_Line5) != RESET){printf("3\r\n");EXTI_ClearITPendingBit(EXTI_Line5);}
}
/*** @brief This function handles side key global interrupt request.* @param None* @retval None*/
void EXTI7_IRQHandler(void) //侧边按键
{if (EXTI_GetFlagStatus(EXTI_Line7) != RESET){printf("S\r\n");EXTI_ClearITPendingBit(EXTI_Line7);}
}
/*** @brief This function handles TIM1 global interrupt request.* @param None* @retval None*/
void TIM1_UP_TRG_COM_IRQnHandler()
{}
void TIM1_IRQHandler(void)
{if(TIM_GetITStatus(TIM1, TIM_IT_Update) != RESET){TIM_ClearITPendingBit(TIM1, TIM_IT_Update);printf("toggle\r\n");}
}
/*** @brief This function handles TIM2 global interrupt request.* @param None* @retval None*/
void TIM2_IRQHandler(void)
{
if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET){TIM_ClearITPendingBit(TIM2, TIM_IT_Update);printf("toggle\r\n");}
}
/*** @brief This function handles TIM6 global interrupt request.* @param None* @retval None*/
void TIM6_IRQHandler(void)
{TIM_ClearITPendingBit(TIM6, TIM_IT_Update);//printf("time\r\n");//低功耗计数器
}/* USER CODE END 1 */
/************************ (C) COPYRIGHT HKMicroChip *****END OF FILE****/
就这个代码,太清晰了。没啥好分析的都! 哈哈哈哈
ec11.c
ec11相关知识!!!:
左转:逆时针。右转:顺时针
AB之间的电平状态关系
| 逆时针(左转) | 11、01、00、10 |
| 顺时针(右转) | 11、10、00、01 |
判断方法:
A信号位于下降沿时,B是高电平,表示顺时针。B是低电平,表示逆时针。
同理:
B信号位于下降沿时,A是高电平,表示顺时针。A是低电平,表示逆时针。
#include "ec11.h"uint8_t Encoder[2]={0, 0}; // 存放按键的值
uint8_t flag[2]={0, 0}; // 按下旋钮标志位
/**
* @brief EC11旋转编码器初始化
* @param
* @ref none
* @return none
* @details
* @see
*/
void EC11_Configurature(void)
{RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB,ENABLE);GPIO_InitTypeDef GPIO_InitStructure;//旋转编码器1GPIO_InitStructure.GPIO_Pin = TBUT_R | TBUT_D;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; // 输入模式GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; // 上拉输入GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;GPIO_Init(EC11_1_Port,&GPIO_InitStructure);// 旋转编码器2GPIO_InitStructure.GPIO_Pin = TBUT_L | BBUT_L | BBUT_R | BBUT_D;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; // 输入模式GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; // 上拉输入GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;GPIO_Init(EC11_2_Port,&GPIO_InitStructure);
}
/**
* @brief 读取EC11旋转状态 第一个EC11 上方
* @param
* @ref
* @return
* -
* @details
* @see
*/
//首先,应该是低电平有效
//TBUT_L接的B、TBUT_R接的A
uint8_t EC11_Read_T()
{static uint16_t cou0; // 锁死计时器static uint8_t KUP0; // 锁死标志位uint8_t kt; // 状态记录标志位Encoder[0] = 0;if(GPIO_ReadInputDataBit(EC11_2_Port,TBUT_L)) KUP0=0; //判断旋钮是否解除锁死if(!GPIO_ReadInputDataBit(EC11_2_Port,TBUT_L)&&KUP0==0)//判断是否旋转旋钮,同时判断是否有旋钮锁死//这里B是下降沿了,判断A的电平。{ // softWareDelay(); // 延时kt=GPIO_ReadInputDataBit(EC11_1_Port,TBUT_R); //把旋钮另一端电平状态记录// softWareDelay(); //延时if(!GPIO_ReadInputDataBit(EC11_2_Port,TBUT_L))//去抖 { if(kt==0)//用另一端判断左或右旋转//A是低电平,逆时针{ Encoder[0] = 1; // 右转 //作者写错了,这里应该是左转}else//A是高电平,顺时针{Encoder[0] = 2; // 左转 //作者写错了,这里应该是右转}cou0=0; //初始锁死判断计数器while(!GPIO_ReadInputDataBit(EC11_2_Port,TBUT_L)&&cou0<1200){ //等待放开旋钮,同时累加判断锁死cou0++;KUP0=1;softWareDelay(); //}}}if(GPIO_ReadInputDataBit(EC11_1_Port,TBUT_D)) flag[0]=0;if(flag[0]!=1){if(!GPIO_ReadInputDataBit(EC11_1_Port,TBUT_D)&&KUP0==0){ // 判断旋钮是否按下 //softWareDelay(); if(!GPIO_ReadInputDataBit(EC11_1_Port,TBUT_D)){ // 去抖动softWareDelay();if(GPIO_ReadInputDataBit(EC11_1_Port,TBUT_D)){ // 判断是否放开Encoder[0] = 3; // 按下flag[0]=0;}else{Encoder[0] |= 0x10;flag[0]=1;}}}}else{Encoder[0] |= 0x10;}if(Encoder[0] == 0x10)Encoder[0]=0;return Encoder[0];
}
/**
* @brief 读取EC11旋转状态 第二个EC11 下方
* @param
* @ref
* @return
* -
* @details
* @see
*/
uint8_t EC11_Read_D()
{static uint16_t cou; // 锁死计时器static uint8_t KUP; // 锁死标志位uint8_t kt; // 状态记录标志位Encoder[1] = 0;if(GPIO_ReadInputDataBit(EC11_2_Port,BBUT_L))KUP=0; //判断旋钮是否解除锁死if(!GPIO_ReadInputDataBit(EC11_2_Port,BBUT_L)&&KUP==0){ //判断是否旋转旋钮,同时判断是否有旋钮锁死// softWareDelay(); // 延时kt=GPIO_ReadInputDataBit(EC11_2_Port,BBUT_R); //把旋钮另一端电平状态记录// softWareDelay(); //延时if(!GPIO_ReadInputDataBit(EC11_2_Port,BBUT_L)){ //去抖if(kt==0){ //用另一端判断左或右旋转Encoder[1] = 1; // 右转}else{Encoder[1] = 2; // 左转}cou=0; //初始锁死判断计数器while(!GPIO_ReadInputDataBit(EC11_2_Port,BBUT_L)&&cou<1200){ //等待放开旋钮,同时累加判断锁死cou++;KUP=1;softWareDelay(); //}}}if(GPIO_ReadInputDataBit(EC11_2_Port,BBUT_D)) flag[1]=0;if(flag[1]!=1){if(!GPIO_ReadInputDataBit(EC11_2_Port,BBUT_D)&&KUP==0){ // 判断旋钮是否按下 //softWareDelay(); if(!GPIO_ReadInputDataBit(EC11_2_Port,BBUT_D)){ // 去抖动softWareDelay();if(GPIO_ReadInputDataBit(EC11_2_Port,BBUT_D)){ // 判断是否放开Encoder[1] = 3; // 按下flag[1]=0;}else{Encoder[1] |= 0x10;flag[1]=1;}}}}else{Encoder[1] |= 0x10;}if(Encoder[1] == 0x10)Encoder[1]=0;return Encoder[1];
}
ec11.h
#ifndef _ec11_h
#define _ec11_h#ifdef __cplusplus
extern "C" {
#endif
#include "hk32f030m.h"
#include "hk32f030m_gpio.h"
#include "usart.h"
#include "main.h"#define EC11_1_Port GPIOB // 按下和右转在B引脚
#define TBUT_R GPIO_Pin_4 // 1右转
// 注意 此引脚为下载引脚
#ifdef DEBUG
#define TBUT_D GPIO_Pin_7 // 1按下
#else
#define TBUT_D GPIO_Pin_5 // 1按下
#endif#define EC11_2_Port GPIOC // EC11 2 和EC11 1的左转
#define TBUT_L GPIO_Pin_3 // 1左转
#define BBUT_L GPIO_Pin_4 // 2左转
#define BBUT_R GPIO_Pin_5 // 2右转
#define BBUT_D GPIO_Pin_6 // 2按下void EC11_Configurature(void); // EC11初始化
uint8_t EC11_Read_T(); // EC11 TOP读取
uint8_t EC11_Read_D(); // EC11 DOWN读取
#ifdef __cplusplus
}
#endif /* __cplusplus */#endif /*EC11.H*/
其它函数不重要了,不分析了。
蓝牙模块
HC-05即可。

没啥代码要求,比较简单的。
项目使用的jdy-33
硬件部分

EC11部分

按键部分
机械按键

方向键

侧边键

type-C接口

USB-TTL

电池充电电路

MCU

啊~还有上位机,作者没分享,假如有了再更新吧~~
OK,算是比较简单的项目~
学习啦~
学习了EC11的使用方法~ 有所收获!不错

本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
