?? 51
字號:
#include <reg52.h>
sbit BMA = P1^4;//編碼開關A引腳
sbit BMB = P1^5;//編碼開關B引腳
sbit BMC = P1^6;//編碼開關 下按引腳
unsigned char display[3];
unsigned char code LEDData[ ] = {
0xC0,0xF9,0xA4,0xB0,0x99,0x92,
0x82,0xF8,0x80,0x90,0xff
};
unsigned char counter = 0; //編碼器脈沖計數
unsigned char n,shift;
/**********************************************************
ms延時子函數
**********************************************************/
void delayms(unsigned int ms)
{
unsigned char k;
while (ms--)
{
for (k = 0; k < 114; k++)
;
}
}
/**********************************************************
掃描編碼器子函數
在編碼器引腳A為低電平期間:
編碼器引腳B從0到1為正轉,編碼器引腳B從1到0為反轉。
**********************************************************/
void scan_encoder(void)
{
static bit Curr_b; //定義一個變量來儲存當前B信號
static bit Last_b; //定義一個變量來儲存上次B腳信號
static bit update= 0;
if( BMA && BMB) //編碼器無轉動退出
{
update = 0;
return;
}
Last_b = BMB; //記錄B信號
while(!BMA) //等待A由低變高
{
Curr_b = BMB; //記錄等待期間的B信號(指當前B信號)
update = 1;
if(!BMC) //當按下旋鈕時
{
counter = 0; //計數單元清零(歸位)
delayms(10);
}
}
if(update)
{
update = 0 ;
if( (Last_b == 0)&&(Curr_b== 1) ) //B從0到1為正轉
{
if(counter == 255)
return;
counter++; //正轉計數加
}
else if( (Last_b == 1)&&(Curr_b == 0) ) //B從1到0為反轉
{
if(counter == 0)
return;
counter--; //反轉計數減
}
}
}
/**********************************************************
主函數
**********************************************************/
void main(void)
{
P0 = 0xff;
P1 = 0xff;
P2 = 0xff;
T2CON = 0x00; //設置T2CON寄存器
TH2 = 0xfc; //1ms定時
TL2 = 0x66;
ET2 = 1; //啟用Timer2中斷
EA = 1; //總中斷允許
TR2 = 1; //啟動定時器2
counter = 0; //計數單元清零
while(1)
{
scan_encoder();
if(!BMC) //當按下旋鈕時
{
counter = 0; //計數單元清零(歸位)
delayms(10);
}
}
}
/*********************************************************
Timer2中斷函數
**********************************************************/
void timer2() interrupt 5
{
TR2 = 0;
TF2 = 0; //手工清中斷標志
TH2 = 0xfc; //1ms定時常數
TL2 = 0x66;
if(n >= 3) //3位數碼管顯示
{
n = 0;
shift = 0x7f; //送位碼初值
P2 = 0xff; //關閉顯示
}
else
{
display[0] = counter%10; //個位數據
display[1] = (counter%100)/10; //十位數據
display[2] = counter/100; //百位數據
if(display[2] == 0)
{
display[2] = 0x0a; //百位為0,不顯示
if(display[1] == 0)
display[1] =0x0a; //十位為0,不顯示
}
P0 = LEDData[display[n++]]; //送段碼
P2 = shift; //送位碼
shift = (shift>>1)|0x80; //調整位碼
}
TR2 = 1;
}
/*********************************************************/
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -