⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bianma.c

📁 通过编码开关(旋转编码器)控制数码管的加减一!程序详细的体现了编码器的编程和数码管的单片机的编程!本程序通过AT89C51和24脉冲编码器的测试
💻 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 + -