找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 4474|回復(fù): 3
打印 上一主題 下一主題
收起左側(cè)

esp8266 OLED屏幕菜單加Ec11編碼器控制

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:983290 發(fā)表于 2022-5-29 07:08 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
#include <CN_SSD1306.h>
#include "codetab.c"   //codetab
#include "Ticker.h"
#define OLED_SDA 2
#define OLED_SCL 16
//庫(kù)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;


//庫(kù)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引腳上一次的狀態(tài)
  unsigned char   EC11_B_Last;                       //EC11的B引腳上一次的狀態(tài)


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;    //用于分析編碼器動(dòng)作的變量
if(!digitalRead(5) && !EC11_A_Last && !digitalRead(4) &&EC11_B_Last)   //A相當(dāng)前狀態(tài)和上次狀態(tài)都為低電平時(shí),抓B相上次狀態(tài)為高當(dāng)前狀態(tài)為低的下降沿。
  {                    
    ScanResult = 1;     //正轉(zhuǎn)
    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相當(dāng)前狀態(tài)和上次狀態(tài)都為低電平時(shí),抓A相上次狀態(tài)為高當(dāng)前狀態(tài)為低的下降沿。
  {
    ScanResult = 2;     //反轉(zhuǎn)
    encoder0Pos--;u--;
        if(encoder0Pos>3)encoder0Pos=3; if(u>3)u=3;Serial.println (encoder0Pos, DEC);caidan();
  }
   EC11_A_Last =digitalRead(5);   //更新編碼器上一個(gè)狀態(tài)暫存變量
   EC11_B_Last =digitalRead(4);   //更新編碼器上一個(gè)狀態(tài)暫存變量

}

void xz2(){

   char ScanResult = 0;    //用于分析編碼器動(dòng)作的變量
if(digitalRead(4) && EC11_B_Last && !digitalRead(5) &&EC11_A_Last)   //B相當(dāng)前狀態(tài)和上次狀態(tài)都為低電平時(shí),抓B相上次狀態(tài)為高當(dāng)前狀態(tài)為低的下降沿。
  {                    
    ScanResult = 1;     //正轉(zhuǎn)
    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相當(dāng)前狀態(tài)和上次狀態(tài)都為gao電平時(shí),抓A相上次狀態(tài)為高當(dāng)前狀態(tài)為低的下降沿。
  {
    ScanResult = 2;     //反轉(zhuǎn)
    encoder0Pos--;u--;
        if(encoder0Pos>3)encoder0Pos=3; if(u>3)u=3;Serial.println (encoder0Pos, DEC);caidan();
  }
   EC11_A_Last =digitalRead(5);   //更新編碼器上一個(gè)狀態(tài)暫存變量
   EC11_B_Last =digitalRead(4);   //更新編碼器上一個(gè)狀態(tài)暫存變量

}
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);                //延時(shí)消抖
                        Key=1;                //把標(biāo)志位置1,防止程序循環(huán)執(zhí)行
                        if(digitalRead(0)==0)                //再次判斷按鍵狀態(tài),排除干擾
                        {
                             LE++;if(LE==2)LE=0;
                             // u++;if(u==5)u=0;
                        }
                }
                else if(digitalRead(0)==1)
                {
                        Key=0;  ko=0;              //當(dāng)按鍵沒(méi)有被按下時(shí),重置標(biāo)志位
                }
        }

   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");                // 提示語(yǔ)言


}
void loop() {if(LE){}else{
  if(!digitalRead(5)&&!digitalRead(4))
xz1();
if(digitalRead(5)&&digitalRead(4))
xz2();
EC11_A_Last =digitalRead(5);   //更新編碼器上一個(gè)狀態(tài)暫存變量
   EC11_B_Last =digitalRead(4);   //更新編碼器上一個(gè)狀態(tài)暫存變量
}
gengxing();
}

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏5 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:872598 發(fā)表于 2024-3-23 09:43 | 只看該作者
#include <CN_SSD1306.h>
#include "codetab.c"   //codetab
#include <Adafruit_ssd1306syp.h>
這幾個(gè)文件沒(méi)有,編譯過(guò)不了。
回復(fù)

使用道具 舉報(bào)

板凳
ID:983290 發(fā)表于 2024-12-19 14:04 | 只看該作者
劉工程 發(fā)表于 2024-3-23 09:43
#include
#include "codetab.c"   //codetab
#include

這是用arduino的,主要是編碼器代碼
回復(fù)

使用道具 舉報(bào)

地板
ID:469589 發(fā)表于 2025-2-19 11:53 | 只看該作者
太復(fù)雜了,為了編碼器我寧愿不用!
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表