【开源项目学习】多功能小键盘(基于HK32F030M)

并不是真正意义上的键盘!!!需谨慎看!!

并不是真正意义上的键盘!!!需谨慎看!!

并不是真正意义上的键盘!!!需谨慎看!!

并不是真正意义上的键盘!!!需谨慎看!!

项目原地址:【航顺训练营】多功能小键盘 - 立创EDA开源硬件平台

说明:如果看到了这篇文章,请了解此项目非本人制作。只是用开源项目来学习。

项目渲染图:

7a04240ea662400b952d792cc2b19918.png

 


目录

简介

代码分析

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_技术支持_深圳市航顺芯片技术研发有限公司

代码分析

按照程序文件分析代码。具体文件有:

c5f9e2b072bc45dc85c7d516cba5020c.png

330cdcc1541146e4b859f11419ecafbc.png

 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即可。

b10ed5bbb4e64b48be3093718352ea9b.png

 没啥代码要求,比较简单的。

项目使用的jdy-33

硬件部分

1d1e305b09e844878b9eb17ab9133a01.png

EC11部分

17d876ff115e406b93fc440efa41f545.png

按键部分

机械按键

89b407ce68544094b61bb5b4a251ee20.png

方向键

86063801e5c04f2fa6ba01e72ff3e511.png

侧边键

9316fb18ace543e29bb8f59cd1e56aca.png

type-C接口

024dca8ce84649089fcf209e5b1f69bd.png

USB-TTL

66d755518499417f8812d457648e9fb5.png

电池充电电路

1b7e02fe268d4236bf66b91040ae70cf.png

MCU

d883278bf8fe4f8587e531d5c8eb4124.png

 

 

 

啊~还有上位机,作者没分享,假如有了再更新吧~~

OK,算是比较简单的项目~

学习啦~

学习了EC11的使用方法~ 有所收获!不错

 

 

f248813ad806489f945ad2d41aab4ceb.png

 

 

 


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

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部