用TM1637數(shù)碼管顯示EC11編碼器調(diào)整數(shù)字
/*========================================
引腳分別為a,b,c b接地;a,c分別接到P3.3和P3.2口并分別接兩個10K上拉
電阻,并且a,c需要分別對地接一個104的電容,否則
因為編碼開關的觸點抖動會引起輕微誤動作。本程序不
使用定時器,不占用中斷,不使用延時代碼,并對每個
細分步數(shù)進行判斷,避免一切誤動作,性能超級穩(wěn)定。
我使用的編碼器是APLS的EC11可以參照附件的時序圖 編碼器控制流水燈最能說明問
電路原理圖如下:
接線圖.jpg (73.85 KB, 下載次數(shù): 0)
下載附件
接線圖
2025-6-9 09:47 上傳
(單片機為STC89C52)=================*/
#include <STC89c52.H>
#include "TM1637.h"
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
#define NULL 0
uchar x,WheelOld;
uchar Led=0;//LED流水燈初始化
/*************************定義接口************************/
/*************************定義接口************************/
sbit PINA=P3^2; //定義編碼器連接的IO
sbit PINB=P3^3; //定義編碼器連接的IO
/*************************過程返回************************/
uchar WheelLeft()
{
Led++;
return(NULL);
}
/*************************右轉(zhuǎn)一步的操作************************/
uchar WheelRight()
{
Led--;
return(NULL);
}
/*************************編碼器過程************************/
uchar EncoderProcess()
{
uchar keytmp,keytmp1,keytmp2,WheelNow;
PINA=1; //PINA至高電平
PINB=1; //PINB至高電平
if(PINA==1) //如果PINA為高電平
{
keytmp1=0x01;
}
else keytmp1=0;
if(PINB==1) //如果PINB為高電平
{
keytmp2=0x02;
}
else keytmp2=0;
WheelNow=keytmp1+keytmp2; //根據(jù)兩個IO組合成16進制數(shù)為0x00|0x01|0x02|0x03
keytmp=WheelNow;
keytmp^=WheelOld; //判斷新數(shù)據(jù)同舊數(shù)據(jù)
if(keytmp==0) return(NULL); //如果新數(shù)據(jù)和原來的數(shù)據(jù)一樣 就直接退出
if(WheelOld==0 && WheelNow==0x01)
{
x=WheelNow;
}
if(WheelOld==0 && x==0x01 && WheelNow==0x03)
{
WheelOld=WheelNow;
x=0;
return(WheelLeft()); //左旋轉(zhuǎn)00 01 03
}
if(WheelOld==0x03 && WheelNow==0x02)
{
x=WheelNow;
}
if(WheelOld==0x03 && x==0x02 && WheelNow==0x00)
{
WheelOld=WheelNow;
x=0;
return(WheelLeft()); //左旋轉(zhuǎn)03 02 00
}
if(WheelOld==0 && WheelNow==0x02)
{
x=WheelNow;
}
if(WheelOld==0 && x==0x02 && WheelNow==0x03)
{
WheelOld=WheelNow;
x=0;
return(WheelRight()); //右旋轉(zhuǎn)00 02 03
}
if(WheelOld==0x03 && WheelNow==0x01)
{
x=WheelNow;
}
if(WheelOld==0x03 && x==0x01 && WheelNow==0x00)
{
WheelOld=WheelNow;
x=0;
return(WheelRight()); //右旋轉(zhuǎn)03 01 10
}
}
/*************************主函數(shù)************************/
void main()
{
while (1)
{
EncoderProcess();
Fnshu(Led);
}
}
完整程序:
EC11.7z
(26.47 KB, 下載次數(shù): 0)
2025-6-9 13:36 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|