单片机教程网

电脑版
提示:原网页已由神马搜索转码, 内容由www.51hei.com提供.
查看:2923|回复:1
打印上一主题下一主题

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();
}

沙发
ID:872598发表于 2024-3-23 09:43|只看该作者
#include< CN_SSD1306.h>
#include "codetab.c"   //codetab
#include< Adafruit_ssd1306syp.h>
这几个文件没有,编译过不了。

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

Powered by 单片机教程网