判断方法:
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;
//旋转编码器1
GPIO_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);
// 旋转编码器2
GPIO_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];
}
|
你好,请问HK32F030这个芯片的系统时钟怎么看,系统配置是RCC->CFGR &= (uint32_t)0xF8FFB81C; 算出来HCLK = 6 ,PCLK = 1,配置的TIM时钟应该是 48/6 = 8M,但实际不是这个,大约是24M