midfieldmaestro 发表于 2019-5-16 22:41:26

oled初始化问题

本帖最后由 midfieldmaestro 于 2019-5-17 15:11 编辑

为什么oled初始化,程序就不正常了,原本执行的程序就不执行了void OLED_Init(void)
{         

      delay_ms(500);                                 
      OLED_WR_Byte(0xAE,OLED_CMD);//--turn off oled panel
      OLED_WR_Byte(0x00,OLED_CMD);//---set low column address
      OLED_WR_Byte(0x10,OLED_CMD);//---set high column address
      
      OLED_WR_Byte(0x40,OLED_CMD);//--set start line addressSet Mapping RAM Display Start Line (0x00~0x3F)
      
      OLED_WR_Byte(0x81,OLED_CMD);//--set contrast control register
      OLED_WR_Byte(0xCF,OLED_CMD); // Set SEG Output Current Brightness
      
      OLED_WR_Byte(0xA1,OLED_CMD);//--Set SEG/Column Mapping   0xa0左右反置 0xa1正常
      OLED_WR_Byte(0xC8,OLED_CMD);//Set COM/Row Scan Direction   0xc0上下反置 0xc8正常
      
      OLED_WR_Byte(0xA6,OLED_CMD);//--set normal display
      
      OLED_WR_Byte(0xA8,OLED_CMD);//--set multiplex ratio(1 to 64)
      OLED_WR_Byte(0x3f,OLED_CMD);//--1/64 duty
      
      OLED_WR_Byte(0xD3,OLED_CMD);//-set display offset      Shift Mapping RAM Counter (0x00~0x3F)
      OLED_WR_Byte(0x00,OLED_CMD);//-not offset
      
      OLED_WR_Byte(0xd5,OLED_CMD);//--set display clock divide ratio/oscillator frequency
      OLED_WR_Byte(0x80,OLED_CMD);//--set divide ratio, Set Clock as 100 Frames/Sec
      
      OLED_WR_Byte(0xD9,OLED_CMD);//--set pre-charge period
      OLED_WR_Byte(0xF1,OLED_CMD);//Set Pre-Charge as 15 Clocks & Discharge as 1 Clock
      
      OLED_WR_Byte(0xDA,OLED_CMD);//--set com pins hardware configuration
      OLED_WR_Byte(0x12,OLED_CMD);
      
      OLED_WR_Byte(0xDB,OLED_CMD);//--set vcomh
      OLED_WR_Byte(0x40,OLED_CMD);//Set VCOM Deselect Level
      OLED_WR_Byte(0x20,OLED_CMD);//-Set Page Addressing Mode (0x00/0x01/0x02)
      OLED_WR_Byte(0x02,OLED_CMD);//
      
      OLED_WR_Byte(0x8D,OLED_CMD);//--set Charge Pump enable/disable
      OLED_WR_Byte(0x14,OLED_CMD);//--set(0x10) disable
      
      OLED_WR_Byte(0xA4,OLED_CMD);// Disable Entire Display On (0xa4/0xa5)
      OLED_WR_Byte(0xA6,OLED_CMD);// Disable Inverse Display On (0xa6/a7)
      
      OLED_WR_Byte(0xAF,OLED_CMD);//--turn on oled panel

      OLED_Clear();
      OLED_Set_Pos(0,0);         

}


toofree 发表于 2019-5-17 09:15:19

你贴的这点代码对解决问题有用吗?
调试一下,看是程序死在哪了?还是程序还能跑,只是执行的不对?
如果程序还能跑的话,那么OLED的管脚可能与其它有冲突。如果进入硬件错误中断,那么这种情况比较复杂,得调试排查。

MrJiu 发表于 2019-5-17 09:56:34

你这贴的代码无意义,其次你可以使用在线调试。。。看具体卡死到哪个地方?

select326 发表于 2019-5-17 09:02:22

哪里不执行了?你这样子没办法说明问题

ldptest 发表于 2019-5-17 10:41:03

你要把OLED_WR_Byte里面的内容、引脚的初始化等提供出来才行。

midfieldmaestro 发表于 2019-5-17 12:17:48

新手编程,比较乱,就是oled初始化后,tim14的pwm就无法调节占空比了

midfieldmaestro 发表于 2019-5-17 12:18:43

int main(void)
{
       u16 led0pwmval=0,led0pwmval1=0;
   u16 Autoreload=500-1;
   float temp;       
       u8 dir=1;
       u8 key;          //保存键值
   u8 i=0;
        u16 adcx;
        float adcpower;

        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2


        delay_init(168);//初始化延时函数
        LED_Init();                                //初始化LED端口
        KEY_Init();       //初始化与按键连接的硬件接口
        IIC_Init();       //IIC初始化
//OLED_Init();   //初始化OLED
        Adc_Init();      //初始化ADC

    TIM14_PWM_Init(500-1,42-1);        //84M/84=1Mhz的计数频率,重装载值500,所以PWM频率为 1M/500=2Khz.   
                TIM13_PWM_Init(500-1,42-1);
                TIM11_PWM_Init(500-1,84-1);
                TIM10_PWM_Init(500-1,84-1);

   while(1)
        {
               delay_ms(10);       
   key=KEY_Scan(0);                //得到键值
//          OLED_GN();
                        if(key)
               {       

                        do{ key=KEY_Scan(0);               
            switch(key)
                                    {               
                   case KEY0_PRES:i=1;break;
                   case KEY2_PRES:i=2;break;
                                           case WKUP_PRES:dir=!dir;break;
                                           case KEY1_PRES:       
                                           {        if(dir)
                                               {
                                                           led0pwmval=led0pwmval+20;
                                                       if(led0pwmval<Autoreload)TIM_SetCompare1(TIM11,led0pwmval); //占空比增加
                                                      }
                                                                                       else if(!dir)
                                                       {
                                                                                                       led0pwmval=led0pwmval-20;
                           if(led0pwmval>0)TIM_SetCompare1(TIM11,led0pwmval); //占空比减小                                               
                                                         }
                                         break;
                                              }
                                   }
                                        }while(i==0);
                                                      
                              do{key=KEY_Scan(0);       
                                                                       switch(key)
                                    {               
                     case KEY0_PRES:i=0; break;
                                                                               case KEY2_PRES:i=2;break;
                                           case WKUP_PRES:dir=!dir;break;
                                           case KEY1_PRES:       
                                           {if(dir)
                                               {
                                                           led0pwmval1=led0pwmval1+20;
                                                       if(led0pwmval1<Autoreload)TIM_SetCompare1(TIM14,led0pwmval1);        //修改比较值,修改占空比
/////////////////////////////////////////////////////////////////////////////////////////////
                adcx=Get_Adc_Average(ADC_Channel_5,20);//获取通道5的转换值,20次取平均
               adcpower=(float)adcx*(30/4096);
//                        OLED_FloatNum(53,0, adcpower);
                temp=(float)led0pwmval1*100/Autoreload;//占空比
//                OLED_FloatNum(60,19, temp);                                                                                                       
                temp=(float)1000/Autoreload;//频率计算
//                OLED_FloatNum(45,21, temp);
                                                                                                                }
                                                       else if(!dir)
                                                       {       
                                                                led0pwmval1=led0pwmval1-20;
                                 if(led0pwmval1>0)TIM_SetCompare1(TIM14,led0pwmval);        //修改比较值,修改占空比       
/////////////////////////////////////////////////////////////////////////////////////////////                                                                                                                               
    adcx=Get_Adc_Average(ADC_Channel_5,20);//获取通道5的转换值,20次取平均
                adcpower=(float)adcx*(30/4096);
//               OLED_FloatNum(53,0, adcpower);
                temp=(float)led0pwmval1*100/Autoreload;//占空比
//                OLED_FloatNum(60,19, temp);                                                                                                       
                temp=(float)1000/Autoreload;//频率计算
//                OLED_FloatNum(45,21, temp);
                                                                                                        }
                                         break;
                                              }
                                       
                                   }
             } while(i==1);                                                       
//////////////////////////////////////////////////////////////////////////////////////////                                               
                                               do{       key=KEY_Scan(0);       
                                                                       switch(key)
                                    {               
                  case KEY0_PRES:i=0;break;
                                                                                case KEY2_PRES:i=1;break;
                                                                                case WKUP_PRES:        dir=!dir;break;
                                            case KEY1_PRES:       
                                           if(dir)
                                                                               {Autoreload=Autoreload+100;
                                                       if(Autoreload<=1000)TIM_SetAutoreload(TIM14,Autoreload);        //修改重装载值,改变频率
/////////////////////////////////////////////////////////////////////////                                                                       
    adcx=Get_Adc_Average(ADC_Channel_5,20);//获取通道5的转换值,20次取平均
                adcpower=(float)adcx*(30/4096);
//               OLED_FloatNum(53,0, adcpower);
                temp=(float)led0pwmval1*100/Autoreload;//占空比
//                OLED_FloatNum(60,19, temp);                                                                                                       
                temp=(float)1000/Autoreload;//频率计算
//                OLED_FloatNum(45,21, temp);   
                                                                               }
                                                                               else if(!dir)
                                                       {Autoreload=Autoreload-10;
                        if(Autoreload>0)TIM_SetAutoreload(TIM14,Autoreload);        //修改重装载值,修改频率       
////////////////////////////////////////////////////////////////////////////////////                                                                               
    adcx=Get_Adc_Average(ADC_Channel_5,20);//获取通道5的转换值,20次取平均
                adcpower=(float)adcx*(30/4096);
//               OLED_FloatNum(53,0, adcpower);
                temp=(float)led0pwmval1*100/Autoreload;//占空比
//                OLED_FloatNum(60,19, temp);                                                                                                       
                temp=(float)1000/Autoreload;//频率计算
//                OLED_FloatNum(45,21, temp);
////////////////////////////////////////////////////////////////////////                                                                                                       
                                                         }
                                         break;
                                              }
                                   
                                       
                                                } while(i==2);                                                      
}else delay_ms(10);
}
}       
      

midfieldmaestro 发表于 2019-5-17 12:39:46

在线调试后发现卡在这里了,大神麻烦解释下这句注释掉,对显示有没有影响?

toofree 发表于 2019-5-17 12:56:31

midfieldmaestro 发表于 2019-5-17 12:39
在线调试后发现卡在这里了,大神麻烦解释下这句注释掉,对显示有没有影响?

...

这个是I2C选择从地址后必需的操作,等待设备应答,没应答表示没从设备,或I2C总线有异常。
以前不是能显示的吗?如果卡在这的话,屏都无法显示。

midfieldmaestro 发表于 2019-5-17 15:12:58

toofree 发表于 2019-5-17 12:56
这个是I2C选择从地址后必需的操作,等待设备应答,没应答表示没从设备,或I2C总线有异常。
以前不是能显 ...

我屏蔽掉后,一切正常,谢谢大神耐心回答
页: [1] 2
查看完整版本: oled初始化问题