基于T5L实现旋转编码开关控制屏幕的页面切换
1.1 技术路线
图1 设计流程展示
1.2 旋转编码器与T5L接线
图2 ENCODER_EC11
旋转编码器的两输出端AB分别接T5L的两普通IO口,将此IO口设置为上拉输入模式。将旋转编码器的两输出端口的初始电平均设置为高电平状态。
1.3 页面切换
图3 页面切换指令
根据迪文官方提供的系统变量接口说明中的页面切换指令,如图3所示,将切换页面id写入变量地址0x84中。
1.4 编码器动作识别及部分代码展示
旋转编码器的AB两端口输出脉冲,当A端输出脉冲超前于B端时,表示旋转编码器右旋;A端输出脉冲滞后于B端时,表示旋转编码器左旋。因此在判断旋转编码器状态时,将编码器两输出端口均设置为高电平状态,通过判断当前读取到的编码器两输出端口的电平状态与上一时刻读取到的电平状态值相比较,可以判断出旋转编码器的旋转方向。通过主函数按键扫描的方式读取编码器的左右旋状态。以下为扫描编码器信号的C语言代码:
u8 Scan_Encoder()
{
static u8 encoder_sign0;//旋转编码器标志0
static u8 encoder_sign1;//旋转编码器标志1
static u16 forced_out;//强制退出
if((ENCODER_A)&&(ENCODER_B))//AB口输出电平均为高电平时,encoder_sign0为1
encoder_sign0 = 1;
else if((!ENCODER_A)&&(!ENCODER_B))//AB口输出电平均为低电平时,encoder_sign0为0
encoder_sign0 = 0;
else return ENCODER_ERROR;//编码器旋转错误
forced_out=15;//强制退出,等待AB端电平变化(此时AB为11或00)
while(((ENCODER_A)&&(ENCODER_B))||((!ENCODER_A)&&(!ENCODER_B)))
{
--forced_out;
Encoder_Delay10ms();
if(!forced_out) return ENCODER_ERROR;//超时则强制退出
}
Encoder_Delay10ms();//消抖
if((!ENCODER_A)&&(ENCODER_B))//A为0,B为1时,encoder_sign1为0
encoder_sign1 = 0;
else if((ENCODER_A)&&(!ENCODER_B))//A为1,B为0,encoder_sign1为1
encoder_sign1 = 1;
else return ENCODER_ERROR;
forced_out=15;
while(((!ENCODER_A)&&(ENCODER_B))||((ENCODER_A)&&(!ENCODER_B)))//等待旋转编码器AB端电平变为01或10
{
--forced_out;
Encoder_Delay10ms();
if(!forced_out) return ENCODER_ERROR;
}
Encoder_Delay10ms();//消抖
//若encoder_sign0异或encoder_sign1为1则代表编码器右旋,否则为左旋
if((encoder_sign0)^(encoder_sign1)) return ENCODER_RIGHT;//右旋
else return ENCODER_LEFT;//左旋
}
视频链接: 智能屏+编码器:
|