源代碼如下:
#include
#include
typedef unsigned char uchar;
typedef unsigned int uint;
uchar data table[10]={60,2,3,4,5,6,7,8,9,0}; //發送數組
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作為比特率發生器,方式2
TH1=0xfd;
TL1=0xfd; //裝入初值
TR1=1;//計時中斷允許
SM0=0;
SM1=1;//串行口工作于方式2
ES=1;//串行口中斷允許
REN=1;//接收允許
EA=1;// 總中斷允許
}
/********************* **************************
串行口傳送數據
傳送顯示數組各字符給計算機
*************************************************/
void send(uchar *dis)
{
while(*dis!=0)
{
SBUF=*dis;
dis++;
while(!TI);
TI=0; //軟件請發送中斷
}
}
/************************************************************************************************
函數名稱:Encoder
函數功能:編碼器旋轉的掃描及處理
入口參數:無
出口參數:char型 0-無旋轉 'R'-正轉(向右轉) 'L'-反轉(向左轉)
************************************************************************************************/
unsigned char Encoder(void)
{
static bit Enc0=0,Enc1=0;
static unsigned char EncOld,EncX=0;
unsigned char EncNow;
bit EncType=0; //設置編碼器類型: 0為一定位一脈沖,1為兩定位一脈沖
PINA=1; //PINA置高電平
PINB=1; //PINB置高電平
if(Enc0==0)EncOld=(PINA?0x02:0x00)+(PINB?0x01:0x00),Enc0=1; //記住初次調用時編碼器的狀態
EncNow=(PINA?0x02:0x00)+(PINB?0x01:0x00); //根據兩個IO當前狀態組合成16進制的0x00|0x01|0x02|0x03
if(EncNow==EncOld)return(0); //如果新數據和原來的數據一樣(沒有轉動)就直接返回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右轉
{
EncOld=EncNow,EncX=0;
if(EncType==1)return('R'); //兩定位一脈沖
else //一定位一脈沖
{
if(Enc1==0)Enc1=1;
else
{
//Delayms(60); //延時降低旋轉靈敏度(不能用在定時器中)
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左轉
{
EncOld=EncNow,EncX=0;
if(EncType==1)return('L'); //兩定位一脈沖
else //一定位一脈沖
{
if(Enc1==0)Enc1=1;
else
{
//Delayms(60); //延時降低旋轉靈敏度(不能用在定時器中)
Enc1=0;
return('L');
}
}
}
return(0); //不旋轉返回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; //關閉蜂鳴器
}
/////////24C02讀寫驅動程序////////////////////
void delay1(unsigned int m)
{ unsigned int n;
for(n=0;n