此程序可用在任何单片机上
不占用硬件中断口
/************************编码器变量*******************************/
bit Encoder_A_Old,Encoder_B_Old,BMQ_R_AH,BMQ_R_BH,BMQ_R_AL,BMQ_R_BL,BMQ_L_AH;
bit BMQ_L_BH,BMQ_L_AL,BMQ_L_BL,Encoder_Add,Encoder_Rec,Encoder_A_Now,Encoder_B_Now;
bit BMQ_IO_A_SATTE,BMQ_IO_B_SATTE;
unsigned char Twice_Effective,Twice_Effective1;
/************************编码器变量*******************************/
/***********************以下程序放定时中断***********************************/
if(FLAG_BMQ_1MS) //1MS扫描一次
{
FLAG_BMQ_1MS=0;
/******************************编码器检测驱动************************************/
Encoder_A_Now=BMQ_A_IO; //IO端口
Encoder_B_Now=BMQ_B_IO; //IO端口
if (Encoder_A_Old==0&&Encoder_A_Now==1)
{
if (Encoder_B_Now==1)
{
BMQ_L_AH=1;
} else
{
BMQ_R_AH=1;
}
}
if (Encoder_B_Old==0&&Encoder_B_Now==1)
{
if (Encoder_A_Now==1)
{
BMQ_R_BH=1;
} else
{
BMQ_L_BH=1;
}
}
if (Encoder_A_Old==1&&Encoder_A_Now==0)
{
if (Encoder_B_Now==1)
{
BMQ_R_AL=1;
} else
{
BMQ_L_AL=1;
}
}
if (Encoder_B_Old==1&&Encoder_B_Now==0)
{
if (Encoder_A_Now==1)
{
BMQ_L_BL=1;
} else
{
BMQ_R_BL=1;
}
}
Encoder_Add=Encoder_Rec=0;
if (BMQ_R_AH==1&&BMQ_R_BH==1) {
Encoder_Add=1;
}
if (BMQ_R_AL==1&&BMQ_R_BL==1) {
Encoder_Add=1;
}
if (BMQ_L_AH==1&&BMQ_L_BH==1) {
Encoder_Rec=1;
}
if (BMQ_L_AL==1&&BMQ_L_BL==1) {
Encoder_Rec=1;
}
if (Encoder_Add)
{
BMQ_R_AH=0;
BMQ_R_BH=0;
BMQ_R_AL=0;
BMQ_R_BL=0;
BMQ_L_AH=0;
BMQ_L_BH=0;
BMQ_L_AL=0;
BMQ_L_BL=0;
Twice_Effective++;
Twice_Effective1=0;
if(Twice_Effective>=2)
{
Twice_Effective=0;
// //向右转
//自己加上自己的程序
}
}
if (Encoder_Rec)
{
BMQ_R_AH=0;
BMQ_R_BH=0;
BMQ_R_AL=0;
BMQ_R_BL=0;
BMQ_L_AH=0;
BMQ_L_BH=0;
BMQ_L_AL=0;
BMQ_L_BL=0;
Twice_Effective1++;
Twice_Effective=0;
if(Twice_Effective1>=2)
{
Twice_Effective1=0; //向左转
//自己加上自己的程序
}
}
Encoder_A_Old=BMQ_A_IO; //IO端口
Encoder_B_Old=BMQ_B_IO; //IO端口
/******************************编码器驱动END************************************/
}
编码器程序(定时扫描版本) - 啊和的博客
基于定时中断方式扫描编码器驱动程序
基于STM8的TIM定时器操作
AD采集滤波程序
16位数据拆分成8位数据和两个8位数据和成16位数据
OLED画点函数心得--一图搞定(分享给有需要的同学)
彩屏仿数码管字体
HT单片机HT66F017普通咖啡机程序