找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 728|回复: 0
收起左侧

esp8266 OLED屏幕菜单加Ec11编码器控制

[复制链接]
ID:983290 发表于 2022-5-29 07:08 | 显示全部楼层 |阅读模式
#include <CN_SSD1306.h>
#include "codetab.c"   //codetab
#include "Ticker.h"
#define OLED_SDA 2
#define OLED_SCL 16
//库2
#define tti 0
#include <Adafruit_ssd1306syp.h>
#define SDA_PIN 2
#define SCL_PIN 16
Adafruit_ssd1306syp display(SDA_PIN,SCL_PIN);
int tt=0;


//库2
int ui,an;unsigned char u=0,uz,LE,LE1,alo;
Ticker flipper;
int Key=0;  
CN_SSD1306 lucky(OLED_SDA, OLED_SCL);//8 -- sda,9 -- scl


  unsigned char   EC11_A_Last;                       //EC11的A引脚上一次的状态
  unsigned char   EC11_B_Last;                       //EC11的B引脚上一次的状态


int encoder0PinA = 5;
int encoder0PinB = 4;

//volatile
unsigned int encoder0Pos = 0;
int jiuA = 0;
int jiuB = 0;








//ICACHE_RAM_ATTR void InterruptFunc(){ detachInterrupt(digitalPinToInterrupt(0));ui=digitalRead(0);
/* if(ui==0){if(an){an==0;u++;if(u==5)u=0;
  }
  }else{
an=1;
  }
    */
    //delay(20);ui=digitalRead(0);
  //  if(ui==0){u++;if(u==5)u=0;
  //} Serial.println (u, DEC);caidan();delay(200); attachInterrupt(digitalPinToInterrupt(0),InterruptFunc,FALLING);pinMode(0,INPUT);}

void xz1(){
   char ScanResult = 0;    //用于分析编码器动作的变量
if(!digitalRead(5) && !EC11_A_Last && !digitalRead(4) &&EC11_B_Last)   //A相当前状态和上次状态都为低电平时,抓B相上次状态为高当前状态为低的下降沿。
  {                    
    ScanResult = 1;     //正转
    encoder0Pos++;u++;
    if(encoder0Pos>3)encoder0Pos=0; if(u>3)u=0; Serial.println (encoder0Pos, DEC);caidan();
  }
  else if(!digitalRead(5) &&EC11_A_Last && !digitalRead(4) && !EC11_B_Last)  //B相当前状态和上次状态都为低电平时,抓A相上次状态为高当前状态为低的下降沿。
  {
    ScanResult = 2;     //反转
    encoder0Pos--;u--;
        if(encoder0Pos>3)encoder0Pos=3; if(u>3)u=3;Serial.println (encoder0Pos, DEC);caidan();
  }
   EC11_A_Last =digitalRead(5);   //更新编码器上一个状态暂存变量
   EC11_B_Last =digitalRead(4);   //更新编码器上一个状态暂存变量

}

void xz2(){

   char ScanResult = 0;    //用于分析编码器动作的变量
if(digitalRead(4) && EC11_B_Last && !digitalRead(5) &&EC11_A_Last)   //B相当前状态和上次状态都为低电平时,抓B相上次状态为高当前状态为低的下降沿。
  {                    
    ScanResult = 1;     //正转
    encoder0Pos++;u++;
    if(encoder0Pos>3)encoder0Pos=0; if(u>3)u=0; Serial.println (encoder0Pos, DEC);caidan();
  }
  else if(digitalRead(5) &&EC11_A_Last && !digitalRead(4) && EC11_B_Last)  //A相当前状态和上次状态都为gao电平时,抓A相上次状态为高当前状态为低的下降沿。
  {
    ScanResult = 2;     //反转
    encoder0Pos--;u--;
        if(encoder0Pos>3)encoder0Pos=3; if(u>3)u=3;Serial.println (encoder0Pos, DEC);caidan();
  }
   EC11_A_Last =digitalRead(5);   //更新编码器上一个状态暂存变量
   EC11_B_Last =digitalRead(4);   //更新编码器上一个状态暂存变量

}
void gengxing(){
/*if(alo){tt++;if(tt>100000)tt=0;if (tt==100000){display.clear();
  display.setTextSize(3);
  display.setTextColor(WHITE);
  display.setCursor(0,0);
  display.println(analogRead(A0));
   display.update();
Serial.println(analogRead(A0));}
}*/
switch(alo){
  case 0:break;
  case 1:tt++;if(tt>tti/*100000*/)tt=0;if (tt==tti/*100000*/){display.clear();
  display.setTextSize(3);
  display.setTextColor(WHITE);
  display.setCursor(0,0);
  display.println((analogRead(A0))/1.024);
   display.update();
Serial.println((analogRead(A0))/1.024);}break;
}


}
  ICACHE_RAM_ATTR void InterruptFunc(){ detachInterrupt(digitalPinToInterrupt(0));
  int ko=1;

  while(ko)
        {
                if(digitalRead(0)==0&&Key==0)                //判断按键是否被按下
                {
                       // delay(10);                //延时消抖
                        Key=1;                //把标志位置1,防止程序循环执行
                        if(digitalRead(0)==0)                //再次判断按键状态,排除干扰
                        {
                             LE++;if(LE==2)LE=0;
                             // u++;if(u==5)u=0;
                        }
                }
                else if(digitalRead(0)==1)
                {
                        Key=0;  ko=0;              //当按键没有被按下时,重置标志位
                }
        }

   Serial.println (u, DEC);caidan();delay(200); attachInterrupt(digitalPinToInterrupt(0),InterruptFunc,FALLING);pinMode(0,INPUT);}


void fanbaiCN(unsigned char x, unsigned char y, unsigned char N)
{
  unsigned char wm=0;
  unsigned int adder=32*N;
  lucky.IIC_SetPos(x , y);
lucky. Begin_IIC_Data();
  for(wm = 0;wm < 16;wm++)
  {
    lucky.Write_IIC_Byte(~CN16x16[adder]);
    adder += 1;
  }
  lucky.IIC_Stop();
  lucky.IIC_SetPos(x,y + 1);
  lucky.Begin_IIC_Data();
  for(wm = 0;wm < 16;wm++)
  {
    lucky.Write_IIC_Byte(~CN16x16[adder]);
    adder += 1;
  }
  lucky.IIC_Stop();
}
void pingbao(){unsigned char i,p,s,q;
     for(q=0;q<=6;q+=2){
     for(p=0;p<=7;p++){
      lucky.ShowCN(16*s,q,4);
      lucky.ShowCN(16*p,q,0);s=p;delay(500);
      if(s==7){
        lucky.ShowCN(16*s,q,4);
        }
    }
  }
  //lucky.Fill_Screen(0x00);
  }
void qingyin(){
     lucky.ShowCN(16*0,0,6+1);lucky.ShowCN(16*1,0,6+2);lucky.ShowCN(16*2,0,6+3);lucky.ShowCN(16*3,0,6+4);lucky.ShowCN(16*4,0,6+5);
  lucky.ShowCN(16*0,2,6+6);lucky.ShowCN(16*1,2,6+7);lucky.ShowCN(16*2,2,6+8);lucky.ShowCN(16*3,2,6+9);lucky.ShowCN(16*4,2,6+10);lucky.ShowCN(16*5,2,6+11);
  lucky.ShowCN(16*0,4,6+12);lucky.ShowCN(16*1,4,6+13);
  lucky.ShowCN(16*0,6,6+14);lucky.ShowCN(16*1,6,6+15);lucky.ShowCN(16*2,6,6+16);lucky.ShowCN(16*3,6,6+17);lucky.ShowCN(16*4,6,6+18);
}

  void caidan(){
   if (LE==0){
   switch(u){

      case 0:
       qingyin();
      fanbaiCN(16*0,0,6+1);fanbaiCN(16*1,0,6+2);fanbaiCN(16*2,0,6+3);fanbaiCN(16*3,0,6+4);fanbaiCN(16*4,0,6+5);
      uz=u;

   break;
    case 1:
    qingyin();
       lucky.ShowCN(16*0,0,6+1);lucky.ShowCN(16*1,0,6+2);lucky.ShowCN(16*2,0,6+3);lucky.ShowCN(16*3,0,6+4);lucky.ShowCN(16*4,0,6+5);
        fanbaiCN(16*0,2,6+6);fanbaiCN(16*1,2,6+7);fanbaiCN(16*2,2,6+8);fanbaiCN(16*3,2,6+9);fanbaiCN(16*4,2,6+10);fanbaiCN(16*5,2,6+11);
        uz=u;alo=0;
   break;
    case 2:
     qingyin();
      lucky.ShowCN(16*0,2,6+6);lucky.ShowCN(16*1,2,6+7);lucky.ShowCN(16*2,2,6+8);lucky.ShowCN(16*3,2,6+9);lucky.ShowCN(16*4,2,6+10);lucky.ShowCN(16*5,2,6+11);
        fanbaiCN(16*0,4,6+12);fanbaiCN(16*1,4,6+13);
        uz=u;
   break;
    case 3:
     qingyin();
      lucky.ShowCN(16*0,4,6+12);lucky.ShowCN(16*1,4,6+13);
      fanbaiCN(16*0,6,6+14);fanbaiCN(16*1,6,6+15);fanbaiCN(16*2,6,6+16);fanbaiCN(16*3,6,6+17);fanbaiCN(16*4,6,6+18);
      uz=u;
   break;
   case 4:
    qingyin();
      lucky.ShowCN(16*0,0,6+1);lucky.ShowCN(16*1,0,6+2);lucky.ShowCN(16*2,0,6+3);lucky.ShowCN(16*3,0,6+4);lucky.ShowCN(16*4,0,6+5);
  lucky.ShowCN(16*0,2,6+6);lucky.ShowCN(16*1,2,6+7);lucky.ShowCN(16*2,2,6+8);lucky.ShowCN(16*3,2,6+9);lucky.ShowCN(16*4,2,6+10);lucky.ShowCN(16*5,2,6+11);
  lucky.ShowCN(16*0,4,6+12);lucky.ShowCN(16*1,4,6+13);
  lucky.ShowCN(16*0,6,6+14);lucky.ShowCN(16*1,6,6+15);lucky.ShowCN(16*2,6,6+16);lucky.ShowCN(16*3,6,6+17);lucky.ShowCN(16*4,6,6+18);
  uz=u;
    break;
     }delay(500);}else if(LE){
switch(uz){
   case 0:
/*for(int i=0; i<7,i++;){
  for(int s=0;s<7,s++;){
lucky.ShowCN(s*0,i,4);delay(20);
  }
  }*/lucky.Fill_Screen(0x00);LE1=1;
display.initialize();
display.clear();
  display.setTextSize(3);
  display.setTextColor(WHITE);
  display.setCursor(0,0);
  //ESP.getVcc()
  display.println(ESP.getVcc()/1024);
// display.println("Hello, world!");
  display.update();
break;
case 1:
lucky.Fill_Screen(0x00);LE1=1;
display.initialize();
display.clear();
  display.setTextSize(3);
  display.setTextColor(WHITE);
  display.setCursor(0,0);
  display.println(analogRead(A0));
   display.update();
Serial.println(analogRead(A0));alo=1;
break;
case 2:
pingbao();LE1=1;
break;
case 3:
lucky.Fill_Screen(0x00);LE1=1;
display.initialize();
display.clear();
  display.setTextSize(2);
  display.setTextColor(WHITE);
  display.setCursor(3,2);
display.println("ver:1.0");
   display.update();
break;
case 4:
  lucky.Fill_Screen(0x00);LE1=1;
break;
}
}

  }
void setup()
{
  delay(500);
  lucky.Initial();//pingbao();// //  lucky.Write_IIC_Command(0xA6);//
  //lucky.ShowCN(16,2,3);fanbaiCN(16*2,4,3);
  lucky.Fill_Screen(0x00);
  lucky.ShowCN(16*0,0,6+1);lucky.ShowCN(16*1,0,6+2);lucky.ShowCN(16*2,0,6+3);lucky.ShowCN(16*3,0,6+4);lucky.ShowCN(16*4,0,6+5);
  lucky.ShowCN(16*0,2,6+6);lucky.ShowCN(16*1,2,6+7);lucky.ShowCN(16*2,2,6+8);lucky.ShowCN(16*3,2,6+9);lucky.ShowCN(16*4,2,6+10);lucky.ShowCN(16*5,2,6+11);
  lucky.ShowCN(16*0,4,6+12);lucky.ShowCN(16*1,4,6+13);
  lucky.ShowCN(16*0,6,6+14);lucky.ShowCN(16*1,6,6+15);lucky.ShowCN(16*2,6,6+16);lucky.ShowCN(16*3,6,6+17);lucky.ShowCN(16*4,6,6+18);
  delay(500);
  attachInterrupt(digitalPinToInterrupt(0),InterruptFunc,FALLING);pinMode(0,INPUT);
  //pinMode(0,INPUT);ui=digitalRead(0);flipper.attach_ms(10,flip);
pingbao();
pinMode(encoder0PinA, INPUT);
  digitalWrite(encoder0PinA, HIGH);       // 管脚配置
  pinMode(encoder0PinB, INPUT);
  digitalWrite(encoder0PinB, HIGH);       // 管脚配置


  Serial.begin (230400);
  Serial.println("start");                // 提示语言


}
void loop() {if(LE){}else{
  if(!digitalRead(5)&&!digitalRead(4))
xz1();
if(digitalRead(5)&&digitalRead(4))
xz2();
EC11_A_Last =digitalRead(5);   //更新编码器上一个状态暂存变量
   EC11_B_Last =digitalRead(4);   //更新编码器上一个状态暂存变量
}
gengxing();
}

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表