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) { } }*/