#include "EC11.h"
EC11_State_s ec11_state = {KEY_FREE,CODER_FREE}; //编码器状态结构体,具体含义见头文件
KEY_STATUS_e KeyA = KEY_FREE;
KEY_STATUS_e KeyB = KEY_FREE;
KEY_STATUS_e KeyC = KEY_FREE;
u8 h = 0;
//将其放入10ms的定时器中定时扫描,或在主循环扫描,
void EC11_Capture(void)
{
static unsigned char Aold = 0,Bold = 0;
static unsigned char RotatingFlag = 0;
static unsigned int KeyDown_Counter = 0,KeyDown_Counter_Old = 0;
//如果同时为高电平,说明转了
if(EC11_A && EC11_B)
{
RotatingFlag = 1;
}
//如果转了之后
if(RotatingFlag)
{
//同时为低电平,判断上次的值,即可得出转的方向
if(!EC11_A && !EC11_B)
{
if(Aold)
{
RotatingFlag = 0;
if(!EC11_KEY)
ec11_state.Coder = CODER_DownADD; //按下右转
else
ec11_state.Coder = CODER_ADD; //右转
}
if(Bold)
{
RotatingFlag = 0;
if(!EC11_KEY)
ec11_state.Coder = CODER_DownSUB; //按下左转
else
ec11_state.Coder = CODER_SUB; //左转
}
}
}
//保存上次的值
Aold = EC11_A;
Bold = EC11_B;
//记录按键按下时间
if(!EC11_KEY)
{
KeyDown_Counter++;
if(KeyDown_Counter==KEYHOLD_TIME_CODER) //达到长按时间
{
}
}
else
{
KeyDown_Counter_Old = KeyDown_Counter; //清空按下计时器
KeyDown_Counter = 0;
}
//根据按下时间判断长按短按
if((KeyDown_Counter_Old < KEYHOLD_TIME_CODER) && (KeyDown_Counter_Old > KEYDOWN_TIME_CODER)) //短按
{
ec11_state.Key = KEY_DOWN;
}
else if(KeyDown_Counter_Old >= KEYHOLD_TIME_CODER) //长按
{
ec11_state.Key = KEY_HOLD;
KeyDown_Counter_Old = 0;
}
}
//void Key_Scan(void)
//{
// static unsigned char KeyADown_Counter = 0, KeyBDown_Counter = 0, KeyCDown_Counter = 0;
// static unsigned char KeyADown_Counter_Old = 0, KeyBDown_Counter_Old = 0, KeyCDown_Counter_Old = 0;
// //记录按键A按下时间
// if(!KEY_A)
// {
// _nop_();
// if(!KEY_A)
// {
// KeyADown_Counter++;
// }
// }
// else
// {
// KeyADown_Counter_Old = KeyADown_Counter;
// KeyADown_Counter = 0;
// }
// //记录按键B按下时间
// if(!KEY_B)
// {
// _nop_();
// if(!KEY_B)
// {
// KeyBDown_Counter++;
// }
// }
// else
// {
// KeyBDown_Counter_Old = KeyBDown_Counter;
// KeyBDown_Counter = 0;
// } //记录按键C按下时间
// if(!KEY_C)
// {
// _nop_();
// if(!KEY_C)
// {
// KeyCDown_Counter++;
// }
// }
// else
// {
// KeyCDown_Counter_Old = KeyCDown_Counter;
// KeyCDown_Counter = 0;
// }
// //A键短按
// if((KeyADown_Counter_Old < KEYHOLD_TIME) && (KeyADown_Counter_Old > KEYDOWN_TIME))
// {
// KeyA = KEY_DOWN;
// }
// //A键长按
// else if(KeyBDown_Counter_Old >= KEYHOLD_TIME)
// {
// KeyA = KEY_HOLD;
// }
// //B键短按
// if((KeyBDown_Counter_Old < KEYHOLD_TIME) && (KeyBDown_Counter_Old > KEYDOWN_TIME))
// {
// KeyB = KEY_DOWN;
// }
// //B键长按
// else if(KeyBDown_Counter_Old >= KEYHOLD_TIME)
// {
// KeyB = KEY_HOLD;
// }
// //C键短按
// if((KeyCDown_Counter_Old < KEYHOLD_TIME) && (KeyCDown_Counter_Old > KEYDOWN_TIME))
// {
// KeyC = KEY_DOWN;
// }
// //C键长按
// else if(KeyCDown_Counter_Old >= KEYHOLD_TIME)
// {
// KeyC = KEY_HOLD;
// }
//}
//void Touch_init(void)
//{
//
// P0M1 = 0X01; //配置P0为开漏输出
// P0M0 = 0X01; //配置P0为开漏输出
// P00 = 0; //拉低TOUCH口
// TMOD |= 0x02;//初始化定时器0为8位定时器,开始计数
//}
//void Touch_key(void)
//{
// uchar i=1;
//
// TH0=0; //初始化TH0为0
// TL0=0; //初始化TH0为0
// TR0=1; //启动定时器
// P00=1; //释放TOUCH口,此时TOUCH会慢慢升高电平
// while((!P00)&&i++);//等待电平升高到单片机所认为的高电平,i控制溢出
// TR0=0; //停止计数器
// if(TL0>0X14||TL0<0X13) //检查定时器计数时间,是否引脚电平上升时间发生变化,也相当于引脚所处分布电容发生变化
// P27 = 0; //拉低TOUCH口
// OLED_ShowNum(70,4,TL0,4,16);
//}
/*
示例
void main(void)
{
while(1)
{
EC11_Capture(); //或放入10ms定时器
if(ec11_state == CODER_ADD ) x++;
if(ec11_state == CODER_SUB ) x--;
}
}
*/