源代碼如下:
#include
#include
typedef unsigned char uchar;
typedef unsigned int uint;
uchar data table[10]={60,2,3,4,5,6,7,8,9,0}; //發(fā)送數(shù)組
uint ms_10;
uint i,j,k;
char a,b;
unsigned char enc,x=0,y=0;
sbit PINA=P3^2;
sbit PINB=P3^3;
sbit LED_R=P1^3;
sbit LED_G=P1^4;
sbit Cm_ok=P1^5;
sbit sda=P2^0; //IO口定義
sbit scl=P2^1;
sbit BEEP = P2^3; //蜂鳴器
sbit dula=P2^6;
sbit wela=P2^7;
sbit sw_12=P3^7;
sbit RS = P3^5;
sbit RW = P3^6;
sbit EN = P3^4;
/***********************************************
串行口初始化波特率9600,定時器1,工作方式2 *************************************************/
void serial_init(void)
{
TMOD=0x20;//計時器1作為比特率發(fā)生器,方式2
TH1=0xfd;
TL1=0xfd; //裝入初值
TR1=1;//計時中斷允許
SM0=0;
SM1=1;//串行口工作于方式2
ES=1;//串行口中斷允許
REN=1;//接收允許
EA=1;// 總中斷允許
}
/********************* **************************
串行口傳送數(shù)據(jù)
傳送顯示數(shù)組各字符給計算機
*************************************************/
void send(uchar *dis)
{
while(*dis!=0)
{
SBUF=*dis;
dis++;
while(!TI);
TI=0; //軟件請發(fā)送中斷
}
}
/************************************************************************************************
函數(shù)名稱:Encoder
函數(shù)功能:編碼器旋轉(zhuǎn)的掃描及處理
入口參數(shù):無
出口參數(shù):char型 0-無旋轉(zhuǎn) 'R'-正轉(zhuǎn)(向右轉(zhuǎn)) 'L'-反轉(zhuǎn)(向左轉(zhuǎn))
************************************************************************************************/
unsigned char Encoder(void)
{
static bit Enc0=0,Enc1=0;
static unsigned char EncOld,EncX=0;
unsigned char EncNow;
bit EncType=0; //設(shè)置編碼器類型: 0為一定位一脈沖,1為兩定位一脈沖
PINA=1; //PINA置高電平
PINB=1; //PINB置高電平
if(Enc0==0)EncOld=(PINA?0x02:0x00)+(PINB?0x01:0x00),Enc0=1; //記住初次調(diào)用時編碼器的狀態(tài)
EncNow=(PINA?0x02:0x00)+(PINB?0x01:0x00); //根據(jù)兩個IO當(dāng)前狀態(tài)組合成16進制的0x00|0x01|0x02|0x03
if(EncNow==EncOld)return(0); //如果新數(shù)據(jù)和原來的數(shù)據(jù)一樣(沒有轉(zhuǎn)動)就直接返回0
if(EncOld==0x00&&EncNow==0x02||EncOld==0x03&&EncNow==0x01)EncX=EncNow; //00-10|11-01
if(EncOld==0x00&&EncX==0x02&&EncNow==0x03||EncOld==0x03&&EncX==0x01&&EncNow==0x00)//00-10-11|11-01-00右轉(zhuǎn)
{
EncOld=EncNow,EncX=0;
if(EncType==1)return('R'); //兩定位一脈沖
else //一定位一脈沖
{
if(Enc1==0)Enc1=1;
else
{
//Delayms(60); //延時降低旋轉(zhuǎn)靈敏度(不能用在定時器中)
Enc1=0;
return('R');
}
}
}
if(EncOld==0x00&&EncNow==0x01||EncOld==0x03&&EncNow==0x02)EncX=EncNow; //00-01|11-10
if(EncOld==0x00&&EncX==0x01&&EncNow==0x03||EncOld==0x03&&EncX==0x02&&EncNow==0x00)//00-01-11|11-10-00左轉(zhuǎn)
{
EncOld=EncNow,EncX=0;
if(EncType==1)return('L'); //兩定位一脈沖
else //一定位一脈沖
{
if(Enc1==0)Enc1=1;
else
{
//Delayms(60); //延時降低旋轉(zhuǎn)靈敏度(不能用在定時器中)
Enc1=0;
return('L');
}
}
}
return(0); //不旋轉(zhuǎn)返回0
}
uchar display[6]={0};
uint num=0;
//延時
void delay(unsigned char i)
{
for(j=i;j>0;j--)
for(k=125;k>0;k--);
}
/*********************************************************
蜂鳴器響一聲
**********************************************************/
void beep()
{
unsigned char y;
for (y=0;y<180;y++)
{
BEEP=!BEEP; //BEEP取反
delay(70);
}
BEEP=1; //關(guān)閉蜂鳴器
}
/////////24C02讀寫驅(qū)動程序////////////////////
void delay1(unsigned int m)
{ unsigned int n;
for(n=0;n