www.pudn.com > bianma.rar > bianma.c


 
//========================================================================================     
//#include  
 
#pragma db code 
#include 
#define uchar unsigned char 
#define uint  unsigned int 
#define cycle       1           //定义动作周期,编码器旋转多少格有效 
#define NULL       0          //定义编码器不动作时的还回值 
#define E_RIGHT     0x0e        //定义右旋转还回值 
#define E_LEFT      0x0f        //定义左旋转还回值 
/*=====数码管位及按键定义=====*/  
sbit LED_0=P1^0; 
sbit LED_1=P1^1; 
sbit LED_2=P1^2; 
sbit LED_3=P1^3; 
 
 
sbit PINA   =   P2^0;  //定义IO 
sbit PINB   =   P2^1; 
 
 
uchar WheelNow,WheelOld,RightCount,LeftCount; 
/*=====0-9=====A-G=====*/ 
uchar a[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8, 
             0x80,0x90,0x88,0x83,0xc6,0x86,0x8e,0x82}; 
 
/*=====四个数码管显示数据存放处=====*/  
uchar one,two,three,four; 
uint wc=0; 
 
/*=====函数定义=====*/  
void delay(uint x); 
void display(void); 
void key(); 
void led_analyze(uint i); 
 
 
 
/*====延时函数=====*/  
void delay(uint x) 
{ 
  uint i; 
  for(i=0;i=cycle){ 
        RightCount=0; 
        return(E_RIGHT); 
    }  else return(NULL); 
} 
//======================================================================================== 
uchar WheelLeft() 
{ 
    RightCount=0; 
    LeftCount++; 
    if (LeftCount>=cycle){ 
        LeftCount=0; 
        return(E_LEFT); 
    } else return(NULL); 
} 
//======================================================================================== 
uchar EncoderProcess() 
{ 
    uchar keytmp; 
     
    PINA = 1; 
    PINB = 1; 
    WheelNow=WheelNow<<1; 
    if (PINA==1) WheelNow=WheelNow+1;  // 读 PINA  
    WheelNow=WheelNow<<1; 
    if (PINB==1) WheelNow=WheelNow+1;  // 读 PINB 
    WheelNow=WheelNow & 0x03;   // 将 WheelNow 的 2 - 7 位清零,保留 0 - 1 两个位的状态. 
    if (WheelNow==0x00) return(NULL); //当  PINA 和 PINB 都为低电平时退出,低电平区不做处理 
    keytmp=WheelNow; 
    keytmp ^=WheelOld; // 判断新读的数据同旧数据 
    if (keytmp==0) return(NULL); // 新读的数据同旧数据一样时退出. 
     
    if (WheelOld==0x01 && WheelNow==0x02){ // 是左旋转否 
            WheelOld=WheelNow;  
            return(WheelLeft()); //左旋转 
        } 
    else if (WheelOld==0x02 && WheelNow==0x01){ // 是右旋转否 
            WheelOld=WheelNow;  
            return(WheelRight()); //右旋转 
    } 
    WheelOld=WheelNow; // 保存当前值 
    return(NULL); // 当  PINA 和 PINB 都为高电平时表示编码器没有动作,退出 
} 
//======================================================================================== 
void inc() 
{    
   wc++; 
   if(wc>9999) wc=0;//如果WG大于9999则将它清零  
    led_analyze(wc); 
	//display(); 
} // 在此处设置断点看 num 加的变化 
//======================================================================================== 
void dec() 
{ 
    wc--; 
    if(wc>9999) wc=9999; 
     led_analyze(wc);//display(); 
} // 在此处设置断点看 num 减的变化 
//======================================================================================== 
void main() 
{ 
    while (1){ 
        switch(EncoderProcess()){ 
            case E_RIGHT:  inc(); break; 
            case E_LEFT:   dec(); break; 
        } 
display(); 
    } 
} 
//======================================================================================== 
 
/*====主函数===== 
void main() 
{ 
  while(1) 
  { 
 
   
  } 
}*/