📄 bianma.c
字号:
//========================================================================================
//#include <reg51.h>
#pragma db code
#include<AT89X51.H>
#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<x;i++);
}
/*====显示函数=====*/
void display(void)
{
P0=a[one];//调用显示数据
LED_0=0; //显示开
delay(100); //调用键盘扫描
LED_0=1; //关显示
P0=a[two];
LED_1=0;
delay(100);
LED_1=1;
P0=a[three];
LED_2=0;
delay(100);
LED_2=1;
P0=a[four];
LED_3=0;
delay(100);
LED_3=1;
}
/*====分解显示数据=====*/
void led_analyze(uint i)
{
i=i%10000;
one=i/1000;
two=(i/100)%10;
three=(i%100)/10;
four=(i%100)%10;
}
/*====按键扫描=====
//========================================================================================
uchar WheelRight()
{
LeftCount=0;
RightCount++;
if (RightCount>=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)
{
}
}*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -