关于探索者F407使用OLED模拟SPI显示原子代码问题探讨

2019-07-20 17:54发布

  • 主要就是看到很多人说调用原子的代码 用模拟的SPI不显示问题,我也是,最后把问题找到了贴出来大家看下,程序当中我已经把MODE 定义为0
  •         //使用4线SPI 串口模式
  •   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7 ;
  •   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//普通输出模式
  •   GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
  •   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
  •   GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
  •   GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化
  •         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;
  •         GPIO_Init(GPIOC, &GPIO_InitStructure);//初始化
  •         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
  •         GPIO_Init(GPIOD, &GPIO_InitStructure);//初始化
  •         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;
  •         GPIO_Init(GPIOG, &GPIO_InitStructure);//初始化
  •         OLED_SDIN=1;
  •         OLED_SCLK=1;
  • #endif
  •         OLED_CS=1;
  •         OLED_RS=1;
  •         OLED_RST=0;
  •         delay_ms(100);
  •         OLED_RST=1;
  •         OLED_WR_Byte(0xAE,OLED_CMD); //关闭显示
  •         OLED_WR_Byte(0xD5,OLED_CMD); //设置时钟分频因子,震荡频率
  •         OLED_WR_Byte(80,OLED_CMD);   //[3:0],分频因子;[7:4],震荡频率
  •         OLED_WR_Byte(0xA8,OLED_CMD); //设置驱动路数
  •         OLED_WR_Byte(0X3F,OLED_CMD); //默认0X3F(1/64)
  •         OLED_WR_Byte(0xD3,OLED_CMD); //设置显示偏移
  •         OLED_WR_Byte(0X00,OLED_CMD); //默认为0
  •         OLED_WR_Byte(0x40,OLED_CMD); //设置显示开始行 [5:0],行数.
  •         OLED_WR_Byte(0x8D,OLED_CMD); //电荷泵设置
  •         OLED_WR_Byte(0x14,OLED_CMD); //bit2,开启/关闭
  •         OLED_WR_Byte(0x20,OLED_CMD); //设置内存地址模式
  •         OLED_WR_Byte(0x02,OLED_CMD); //[1:0],00,列地址模式;01,行地址模式;10,页地址模式;默认10;
  •         OLED_WR_Byte(0xA1,OLED_CMD); //段重定义设置,bit0:0,0->0;1,0->127;
  •         OLED_WR_Byte(0xC0,OLED_CMD); //设置COM扫描方向;bit3:0,普通模式;1,重定义模式 COM[N-1]->COM0;N:驱动路数
  •         OLED_WR_Byte(0xDA,OLED_CMD); //设置COM硬件引脚配置
  •         OLED_WR_Byte(0x12,OLED_CMD); //[5:4]配置
  •         OLED_WR_Byte(0x81,OLED_CMD); //对比度设置
  •         OLED_WR_Byte(0xEF,OLED_CMD); //1~255;默认0X7F (亮度设置,越大越亮)
  •         OLED_WR_Byte(0xD9,OLED_CMD); //设置预充电周期
  •         OLED_WR_Byte(0xf1,OLED_CMD); //[3:0],PHASE 1;[7:4],PHASE 2;
  •         OLED_WR_Byte(0xDB,OLED_CMD); //设置VCOMH 电压倍率
  •         OLED_WR_Byte(0x30,OLED_CMD); //[6:4] 000,0.65*vcc;001,0.77*vcc;011,0.83*vcc;
  •         OLED_WR_Byte(0xA4,OLED_CMD); //全局显示开启;bit0:1,开启;0,关闭;(白屏/黑屏)
  •         OLED_WR_Byte(0xA6,OLED_CMD); //设置显示方式;bit0:1,反相显示;0,正常显示
  •         //OLED_WR_Byte(0xAF,OLED_CMD); //开启显示
  •         OLED_WR_Byte(0X8D,OLED_CMD);  //SET DCDC命令
  •         OLED_WR_Byte(0X14,OLED_CMD);  //DCDC ON
  •         OLED_WR_Byte(0XAF,OLED_CMD);  //DISPLAY ON
  •         OLED_Clear();
  •     现在原子的程序是没有58-60行的,我写入探索者F4中后SPI模式的OLED不显示(多次确认,折腾两天了,还以为屏坏了);
  •    最后把代码从头看了一遍在MAIN主函数OLED_Init();        //初始化OLED 后面加了行代码调用了OLED_Display_On(void);代码如下:
  • OLED_Init();                                //初始化OLED
  • OLED_Display_On();
  • 再次烧写屏突然显示了,太高兴了折腾了两天终于显示了
  • //开启OLED显示
  • void OLED_Display_On(void)
  • {
  •         OLED_WR_Byte(0X8D,OLED_CMD);  //SET DCDC命令
  •         OLED_WR_Byte(0X14,OLED_CMD);  //DCDC ON
  •         OLED_WR_Byte(0XAF,OLED_CMD);  //DISPLAY ON
  • }
  • 但是看了代码中的内容我就郁闷啊,39,40,57行原子的代码不就是DISPLAY_ON中的相关命令嘛!可为什么必须要在主函数里面再次调用才能显示了。
  • 后来我把主函数中DISPLAY_ON()去除后把70-72行的代码补到了58-60后也是可以正常显示的,原子的原代码不加就是不显示。还请原子哥分析下。
  • 我确认100%用的原子探索者里面标准例程中的实验12验证后才发帖出来。不是来索取而是来探讨。

再就是为什么我的显示是反着的字体,不明白。如图!!!!

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。