你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

oled初始化问题

[复制链接]
midfieldmaestro 提问时间:2019-5-16 22:41 /
本帖最后由 midfieldmaestro 于 2019-5-17 15:11 编辑

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

  3.         delay_ms(500);                                 
  4.         OLED_WR_Byte(0xAE,OLED_CMD);//--turn off oled panel
  5.         OLED_WR_Byte(0x00,OLED_CMD);//---set low column address
  6.         OLED_WR_Byte(0x10,OLED_CMD);//---set high column address
  7.         
  8.         OLED_WR_Byte(0x40,OLED_CMD);//--set start line address  Set Mapping RAM Display Start Line (0x00~0x3F)
  9.         
  10.         OLED_WR_Byte(0x81,OLED_CMD);//--set contrast control register
  11.         OLED_WR_Byte(0xCF,OLED_CMD); // Set SEG Output Current Brightness
  12.         
  13.         OLED_WR_Byte(0xA1,OLED_CMD);//--Set SEG/Column Mapping     0xa0左右反置 0xa1正常
  14.         OLED_WR_Byte(0xC8,OLED_CMD);//Set COM/Row Scan Direction   0xc0上下反置 0xc8正常
  15.         
  16.         OLED_WR_Byte(0xA6,OLED_CMD);//--set normal display
  17.         
  18.         OLED_WR_Byte(0xA8,OLED_CMD);//--set multiplex ratio(1 to 64)
  19.         OLED_WR_Byte(0x3f,OLED_CMD);//--1/64 duty
  20.         
  21.         OLED_WR_Byte(0xD3,OLED_CMD);//-set display offset        Shift Mapping RAM Counter (0x00~0x3F)
  22.         OLED_WR_Byte(0x00,OLED_CMD);//-not offset
  23.         
  24.         OLED_WR_Byte(0xd5,OLED_CMD);//--set display clock divide ratio/oscillator frequency
  25.         OLED_WR_Byte(0x80,OLED_CMD);//--set divide ratio, Set Clock as 100 Frames/Sec
  26.         
  27.         OLED_WR_Byte(0xD9,OLED_CMD);//--set pre-charge period
  28.         OLED_WR_Byte(0xF1,OLED_CMD);//Set Pre-Charge as 15 Clocks & Discharge as 1 Clock
  29.         
  30.         OLED_WR_Byte(0xDA,OLED_CMD);//--set com pins hardware configuration
  31.         OLED_WR_Byte(0x12,OLED_CMD);
  32.         
  33.         OLED_WR_Byte(0xDB,OLED_CMD);//--set vcomh
  34.         OLED_WR_Byte(0x40,OLED_CMD);//Set VCOM Deselect Level
  35.         OLED_WR_Byte(0x20,OLED_CMD);//-Set Page Addressing Mode (0x00/0x01/0x02)
  36.         OLED_WR_Byte(0x02,OLED_CMD);//
  37.         
  38.         OLED_WR_Byte(0x8D,OLED_CMD);//--set Charge Pump enable/disable
  39.         OLED_WR_Byte(0x14,OLED_CMD);//--set(0x10) disable
  40.         
  41.         OLED_WR_Byte(0xA4,OLED_CMD);// Disable Entire Display On (0xa4/0xa5)
  42.         OLED_WR_Byte(0xA6,OLED_CMD);// Disable Inverse Display On (0xa6/a7)
  43.         
  44.         OLED_WR_Byte(0xAF,OLED_CMD);//--turn on oled panel

  45.         OLED_Clear();
  46.         OLED_Set_Pos(0,0);         

  47. }  
复制代码



收藏 评论10 发布时间:2019-5-16 22:41

举报

10个回答
七哥 最优答案 回答时间:2019-5-17 09:15:19
你贴的这点代码对解决问题有用吗?
调试一下,看是程序死在哪了?还是程序还能跑,只是执行的不对?
如果程序还能跑的话,那么OLED的管脚可能与其它有冲突。如果进入硬件错误中断,那么这种情况比较复杂,得调试排查。

评分

参与人数 1蝴蝶豆 +3 收起 理由
STMCU + 3

查看全部评分

MrJiu 最优答案 回答时间:2019-5-17 09:56:34
你这贴的代码无意义,其次你可以使用在线调试。。。看具体卡死到哪个地方?

评分

参与人数 1蝴蝶豆 +2 收起 理由
STMCU + 2

查看全部评分

CC4 回答时间:2019-5-17 09:02:22
哪里不执行了?你这样子没办法说明问题
网络孤客 回答时间:2019-5-17 10:41:03
你要把OLED_WR_Byte里面的内容、引脚的初始化等提供出来才行。

评分

参与人数 1蝴蝶豆 +2 收起 理由
STMCU + 2

查看全部评分

midfieldmaestro 回答时间:2019-5-17 12:17:48
新手编程,比较乱,就是oled初始化后,tim14的pwm就无法调节占空比了
midfieldmaestro 回答时间:2019-5-17 12:18:43
  1. int main(void)
  2. {
  3.          u16 led0pwmval=0,led0pwmval1=0;  
  4.    u16 Autoreload=500-1;
  5.    float temp;       
  6.          u8 dir=1;
  7.          u8 key;          //保存键值
  8.    u8 i=0;
  9.         u16 adcx;
  10.         float adcpower;

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


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

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

  22.    while(1)
  23.         {
  24.                  delay_ms(10);         
  25.      key=KEY_Scan(0);                //得到键值
  26. //            OLED_GN();
  27.                         if(key)
  28.                  {       

  29.                         do{ key=KEY_Scan(0);               
  30.             switch(key)
  31.                                     {               
  32.                    case KEY0_PRES:  i=1;break;
  33.                    case KEY2_PRES:  i=2;break;
  34.                                            case WKUP_PRES:  dir=!dir;break;
  35.                                            case KEY1_PRES:       
  36.                                              {        if(dir)
  37.                                                {
  38.                                                              led0pwmval=led0pwmval+20;
  39.                                                        if(led0pwmval<Autoreload)TIM_SetCompare1(TIM11,led0pwmval); //占空比增加
  40.                                                       }
  41.                                                                                          else if(!dir)
  42.                                                        {
  43.                                                                                                          led0pwmval=led0pwmval-20;
  44.                            if(led0pwmval>0)TIM_SetCompare1(TIM11,led0pwmval); //占空比减小                                               
  45.                                                            }
  46.                                          break;
  47.                                               }
  48.                                      }
  49.                                         }while(i==0);
  50.                                                         
  51.                               do{key=KEY_Scan(0);       
  52.                                                                          switch(key)
  53.                                     {               
  54.                      case KEY0_PRES:  i=0; break;
  55.                                                                                  case KEY2_PRES:  i=2;break;
  56.                                              case WKUP_PRES:dir=!dir;break;
  57.                                              case KEY1_PRES:       
  58.                                              {if(dir)
  59.                                                {
  60.                                                              led0pwmval1=led0pwmval1+20;
  61.                                                        if(led0pwmval1<Autoreload)TIM_SetCompare1(TIM14,led0pwmval1);        //修改比较值,修改占空比
  62. /////////////////////////////////////////////////////////////////////////////////////////////
  63.                 adcx=Get_Adc_Average(ADC_Channel_5,20);//获取通道5的转换值,20次取平均
  64.                  adcpower=(float)adcx*(30/4096);
  65. //                        OLED_FloatNum(53,0, adcpower);
  66.                 temp=(float)led0pwmval1*100/Autoreload;  //占空比
  67. //                OLED_FloatNum(60,19, temp);                                                                                                       
  68.                 temp=(float)1000/Autoreload;  //频率计算
  69. //                OLED_FloatNum(45,21, temp);
  70.                                                                                                                 }
  71.                                                        else if(!dir)
  72.                                                        {       
  73.                                                                 led0pwmval1=led0pwmval1-20;
  74.                                  if(led0pwmval1>0)TIM_SetCompare1(TIM14,led0pwmval);        //修改比较值,修改占空比       
  75. /////////////////////////////////////////////////////////////////////////////////////////////                                                                                                                                 
  76.     adcx=Get_Adc_Average(ADC_Channel_5,20);//获取通道5的转换值,20次取平均
  77.                 adcpower=(float)adcx*(30/4096);
  78. //                 OLED_FloatNum(53,0, adcpower);
  79.                 temp=(float)led0pwmval1*100/Autoreload;  //占空比
  80. //                OLED_FloatNum(60,19, temp);                                                                                                       
  81.                 temp=(float)1000/Autoreload;  //频率计算
  82. //                OLED_FloatNum(45,21, temp);
  83.                                                                                                         }
  84.                                            break;
  85.                                               }
  86.                                        
  87.                                      }
  88.              } while(i==1);                                                         
  89. //////////////////////////////////////////////////////////////////////////////////////////                                               
  90.                                                  do{       key=KEY_Scan(0);       
  91.                                                                          switch(key)
  92.                                     {               
  93.                     case KEY0_PRES:  i=0;break;
  94.                                                                                 case KEY2_PRES:  i=1;break;
  95.                                                                                 case WKUP_PRES:        dir=!dir;break;
  96.                                             case KEY1_PRES:       
  97.                                              if(dir)
  98.                                                                                  {Autoreload=Autoreload+100;
  99.                                                        if(Autoreload<=1000)TIM_SetAutoreload(TIM14,  Autoreload);        //修改重装载值,改变频率
  100. /////////////////////////////////////////////////////////////////////////                                                                         
  101.     adcx=Get_Adc_Average(ADC_Channel_5,20);//获取通道5的转换值,20次取平均
  102.                 adcpower=(float)adcx*(30/4096);
  103. //                 OLED_FloatNum(53,0, adcpower);
  104.                 temp=(float)led0pwmval1*100/Autoreload;  //占空比
  105. //                OLED_FloatNum(60,19, temp);                                                                                                       
  106.                 temp=(float)1000/Autoreload;  //频率计算
  107. //                OLED_FloatNum(45,21, temp);     
  108.                                                                                  }
  109.                                                                                  else if(!dir)
  110.                                                        {Autoreload=Autoreload-10;
  111.                           if(Autoreload>0)TIM_SetAutoreload(TIM14,  Autoreload);        //修改重装载值,修改频率       
  112. ////////////////////////////////////////////////////////////////////////////////////                                                                                 
  113.     adcx=Get_Adc_Average(ADC_Channel_5,20);//获取通道5的转换值,20次取平均
  114.                 adcpower=(float)adcx*(30/4096);
  115. //                 OLED_FloatNum(53,0, adcpower);
  116.                 temp=(float)led0pwmval1*100/Autoreload;  //占空比
  117. //                OLED_FloatNum(60,19, temp);                                                                                                       
  118.                 temp=(float)1000/Autoreload;  //频率计算
  119. //                OLED_FloatNum(45,21, temp);
  120. ////////////////////////////////////////////////////////////////////////                                                                                                         
  121.                                                            }
  122.                                            break;
  123.                                               }
  124.                                      
  125.                                        
  126.                                                 } while(i==2);                                                          
  127. }else delay_ms(10);
  128. }
  129. }       
复制代码

      
midfieldmaestro 回答时间:2019-5-17 12:39:46
在线调试后发现卡在这里了,大神麻烦解释下这句注释掉,对显示有没有影响?
360截图20190517123809666.jpg
七哥 回答时间: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总线有异常。
以前不是能显 ...

我屏蔽掉后,一切正常,谢谢大神耐心回答
midfieldmaestro 回答时间:2019-5-17 15:14:19
MrJiu 发表于 2019-5-17 09:56
你这贴的代码无意义,其次你可以使用在线调试。。。看具体卡死到哪个地方? ...

很棒,在线调试确实可以发现问题。

所属标签

相似问题

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版