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

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

评分

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

查看全部评分

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

评分

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

查看全部评分

select326 回答时间:2019-5-17 09:02:22
哪里不执行了?你这样子没办法说明问题
ldptest 回答时间: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
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总线有异常。
以前不是能显 ...

我屏蔽掉后,一切正常,谢谢大神耐心回答
12下一页

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版