[其他ST产品] 自己改的是stm32驱动oled代码,就是点不亮屏幕

[复制链接]
 楼主| 发GV第几啊 发表于 2023-11-30 23:52 | 显示全部楼层 |阅读模式
自己改的是stm32驱动oled代码,就是点不亮屏幕,怀疑是时序问题,有哪位帮我看看不,感激不尽oled.c
  1. #include "oled.h"
  2. #include "stdlib.h"
  3. #include "oledfont.h"      
  4. #include "delay.h"
  5. //OLED的显存
  6. //存放格式如下.
  7. //[0]0 1 2 3 ... 127   
  8. //[1]0 1 2 3 ... 127   
  9. //[2]0 1 2 3 ... 127   
  10. //[3]0 1 2 3 ... 127   
  11. //[4]0 1 2 3 ... 127   
  12. //[5]0 1 2 3 ... 127   
  13. //[6]0 1 2 3 ... 127   
  14. //[7]0 1 2 3 ... 127               
  15. /**********************************************
  16. //IIC Start
  17. **********************************************/
  18. /**********************************************
  19. //IIC Start
  20. **********************************************/
  21. void IIC_Start()
  22. {
  23.     OLED_SCLK_Set() ;
  24.     OLED_SDIN_Set();
  25.     OLED_SDIN_Clr();
  26.     OLED_SCLK_Clr();
  27. }

  28. /**********************************************
  29. //IIC Stop
  30. **********************************************/
  31. void IIC_Stop()
  32. {
  33.     OLED_SCLK_Set() ;
  34. //    OLED_SCLK_Clr();
  35.     OLED_SDIN_Clr();
  36.     OLED_SDIN_Set();
  37.    
  38. }

  39. void IIC_Wait_Ack()
  40. {
  41.     //GPIOB->CRH &= 0XFFF0FFFF;    //设置PB12为上拉输入模式
  42.     //GPIOB->CRH |= 0x00080000;
  43. //    OLED_SDA = 1;
  44. //    delay_us(1);
  45.     //OLED_SCL = 1;
  46.     //delay_us(50000);
  47. /*    while(1)
  48.     {
  49.         if(!OLED_SDA)                //判断是否接收到OLED 应答信号
  50.         {
  51.             //GPIOB->CRH &= 0XFFF0FFFF;    //设置PB12为通用推免输出模式
  52.             //GPIOB->CRH |= 0x00030000;
  53.             return;
  54.         }
  55.     }
  56. */
  57.     OLED_SCLK_Set() ;
  58.     OLED_SCLK_Clr();
  59. }
  60. /**********************************************
  61. // IIC Write byte
  62. **********************************************/

  63. void Write_IIC_Byte(unsigned char IIC_Byte)
  64. {
  65.     unsigned char i;
  66.     unsigned char m,da;
  67.     da=IIC_Byte;
  68. //    OLED_SCLK_Clr();
  69.     for(i=0;i<8;i++)        
  70.     {
  71.         m=da;
  72.         OLED_SCLK_Clr();
  73.         m=m&0x80;
  74.         if(m==0x80)
  75.         {OLED_SDIN_Set();}
  76.         else OLED_SDIN_Clr();
  77.         OLED_SCLK_Set();
  78.         OLED_SCLK_Clr();
  79.         da=da<<1;
  80.     }
  81. }
  82. /**********************************************
  83. // IIC Write Command
  84. **********************************************/
  85. void Write_IIC_Command(unsigned char IIC_Command)
  86. {
  87.     IIC_Start();
  88.     Write_IIC_Byte(0x78);            //Slave address,SA0=0
  89.     IIC_Wait_Ack();   
  90.     Write_IIC_Byte(0x00);            //write command
  91.     IIC_Wait_Ack();   
  92.     Write_IIC_Byte(IIC_Command);
  93.     IIC_Wait_Ack();   
  94.     IIC_Stop();
  95. }
  96. /**********************************************
  97. // IIC Write Data
  98. **********************************************/
  99. void Write_IIC_Data(unsigned char IIC_Data)
  100. {
  101.     IIC_Start();
  102.     Write_IIC_Byte(0x78);            //D/C#=0; R/W#=0
  103.     IIC_Wait_Ack();   
  104.     Write_IIC_Byte(0x40);            //write data
  105.     IIC_Wait_Ack();   
  106.     Write_IIC_Byte(IIC_Data);
  107.     IIC_Wait_Ack();   
  108.     IIC_Stop();
  109. }
  110. void OLED_WR_Byte(unsigned dat,unsigned cmd)
  111. {
  112.     if(cmd)
  113.     {
  114.         Write_IIC_Data(dat);
  115.     }
  116.     else
  117.     {
  118.         Write_IIC_Command(dat);
  119.     }
  120. }


  121. /********************************************
  122. // fill_Picture
  123. ********************************************/
  124. void fill_picture(unsigned char fill_Data)
  125. {
  126.     unsigned char m,n;
  127.     for(m=0;m<8;m++)
  128.     {
  129.         OLED_WR_Byte(0xb0+m,0);        //page0-page1
  130.         OLED_WR_Byte(0x00,0);        //low column start address
  131.         OLED_WR_Byte(0x10,0);        //high column start address
  132.         for(n=0;n<128;n++)
  133.         {
  134.             OLED_WR_Byte(fill_Data,1);
  135.         }
  136.     }
  137. }


  138. /***********************Delay****************************************/
  139. void Delay_50ms(unsigned int Del_50ms)
  140. {
  141.     unsigned int m;
  142.     for(;Del_50ms>0;Del_50ms--)
  143.         for(m=6245;m>0;m--);
  144. }

  145. void Delay_1ms(unsigned int Del_1ms)
  146. {
  147.     unsigned char j;
  148.     while(Del_1ms--)
  149.     {   
  150.         for(j=0;j<123;j++);
  151.     }
  152. }

  153. //坐标设置
  154. void OLED_Set_Pos(unsigned char x, unsigned char y)
  155. {     OLED_WR_Byte(0xb0+y,OLED_CMD);
  156.     OLED_WR_Byte(((x&0xf0)>>4)|0x10,OLED_CMD);
  157.     OLED_WR_Byte((x&0x0f),OLED_CMD);
  158. }         
  159. //开启OLED显示   
  160. void OLED_Display_On(void)
  161. {
  162.     OLED_WR_Byte(0X8D,OLED_CMD);  //SET DCDC命令
  163.     OLED_WR_Byte(0X14,OLED_CMD);  //DCDC ON
  164.     OLED_WR_Byte(0XAF,OLED_CMD);  //DISPLAY ON
  165. }
  166. //关闭OLED显示     
  167. void OLED_Display_Off(void)
  168. {
  169.     OLED_WR_Byte(0X8D,OLED_CMD);  //SET DCDC命令
  170.     OLED_WR_Byte(0X10,OLED_CMD);  //DCDC OFF
  171.     OLED_WR_Byte(0XAE,OLED_CMD);  //DISPLAY OFF
  172. }                        
  173. //清屏函数,清完屏,整个屏幕是黑色的!和没点亮一样!!!      


  174. //void OLED_Refresh(void)
  175. //{
  176. //    u8 i,n;
  177. //    for(i=0;i<8;i++)
  178. //    {
  179. //       OLED_WR_Byte(0xb0+i,OLED_CMD); //设置行起始地址
  180. //       OLED_WR_Byte(0x00,OLED_CMD);   //设置低列起始地址
  181. //       OLED_WR_Byte(0x10,OLED_CMD);   //设置高列起始地址
  182. //       for(n=0;n<128;n++)
  183. //         OLED_WR_Byte(OLED_GRAM[n][i],OLED_DATA);
  184. //  }
  185. //}

  186. void OLED_Clear(void)  
  187. {  
  188.     u8 i,n;            
  189.     for(i=0;i<8;i++)  
  190.     {  
  191.         OLED_WR_Byte (0xb0+i,OLED_CMD);    //设置页地址(0~7)
  192.         OLED_WR_Byte (0x00,OLED_CMD);      //设置显示位置—列低地址
  193.         OLED_WR_Byte (0x10,OLED_CMD);      //设置显示位置—列高地址   
  194.         for(n=0;n<128;n++)OLED_WR_Byte(0,OLED_DATA);
  195.     } //更新显示
  196. }
  197. void OLED_On(void)  
  198. {  
  199.     u8 i,n;            
  200.     for(i=0;i<8;i++)  
  201.     {  
  202.         OLED_WR_Byte (0xb0+i,OLED_CMD);    //设置页地址(0~7)
  203.         OLED_WR_Byte (0x00,OLED_CMD);      //设置显示位置—列低地址
  204.         OLED_WR_Byte (0x10,OLED_CMD);      //设置显示位置—列高地址   
  205.         for(n=0;n<128;n++)OLED_WR_Byte(1,OLED_DATA);
  206.     } //更新显示
  207. }
  208. //在指定位置显示一个字符,包括部分字符
  209. //x:0~127
  210. //y:0~63
  211. //mode:0,反白显示;1,正常显示                 
  212. //size:选择字体 16/12
  213. void OLED_ShowChar(u8 x,u8 y,u8 chr,u8 Char_Size)
  214. {         
  215.     unsigned char c=0,i=0;   
  216.     c=chr-' ';//得到偏移后的值            
  217.     if(x>Max_Column-1){x=0;y=y+2;}
  218.     if(Char_Size ==16)
  219.     {
  220.         OLED_Set_Pos(x,y);   
  221.         for(i=0;i<8;i++)
  222.         OLED_WR_Byte(F8X16[c*16+i],OLED_DATA);
  223.         OLED_Set_Pos(x,y+1);
  224.         for(i=0;i<8;i++)
  225.         OLED_WR_Byte(F8X16[c*16+i+8],OLED_DATA);
  226.     }
  227.     else
  228.     {   
  229.         OLED_Set_Pos(x,y);
  230.         for(i=0;i<6;i++)
  231.         OLED_WR_Byte(F6x8[c][i],OLED_DATA);   
  232.     }
  233. }
  234. //m^n函数
  235. u32 oled_pow(u8 m,u8 n)
  236. {
  237.     u32 result=1;     
  238.     while(n--)result*=m;   
  239.     return result;
  240. }                  
  241. //显示2个数字
  242. //x,y :起点坐标     
  243. //len :数字的位数
  244. //size:字体大小
  245. //mode:模式    0,填充模式;1,叠加模式
  246. //num:数值(0~4294967295);               
  247. void OLED_ShowNum(u8 x,u8 y,u32 num,u8 len,u8 size2)
  248. {            
  249.     u8 t,temp;
  250.     u8 enshow=0;                           
  251.     for(t=0;t<len;t++)
  252.     {
  253.         temp=(num/oled_pow(10,len-t-1))%10;
  254.         if(enshow==0&&t<(len-1))
  255.         {
  256.             if(temp==0)
  257.             {
  258.                 OLED_ShowChar(x+(size2/2)*t,y,' ',size2);
  259.                 continue;
  260.             }
  261.             else enshow=1;
  262.               
  263.         }
  264.          OLED_ShowChar(x+(size2/2)*t,y,temp+'0',size2);
  265.     }
  266. }
  267. //显示一个字符号串
  268. void OLED_ShowString(u8 x,u8 y,u8 *chr,u8 Char_Size)
  269. {
  270.     unsigned char j=0;
  271.     while (chr[j]!='\0')
  272.     {        
  273.         OLED_ShowChar(x,y,chr[j],Char_Size);
  274.         x+=8;
  275.         if(x>120){x=0;y+=2;}
  276.         j++;
  277.     }
  278. }
  279. //显示汉字
  280. void OLED_ShowCHinese(u8 x,u8 y,u8 no)
  281. {                     
  282.     u8 t,adder=0;
  283.     OLED_Set_Pos(x,y);   
  284.     for(t=0;t<16;t++)
  285.     {
  286.         OLED_WR_Byte(Hzk[2*no][t],OLED_DATA);
  287.         adder+=1;
  288.     }   
  289.     OLED_Set_Pos(x,y+1);   
  290.     for(t=0;t<16;t++)
  291.     {   
  292.         OLED_WR_Byte(Hzk[2*no+1][t],OLED_DATA);
  293.         adder+=1;
  294.     }                    
  295. }
  296. /***********功能描述:显示显示BMP图片128×64起始点坐标(x,y),x的范围0~127,y为页的范围0~7*****************/
  297. void OLED_DrawBMP(unsigned char x0, unsigned char y0,unsigned char x1, unsigned char y1,unsigned char BMP[])
  298. {     
  299.     unsigned int j=0;
  300.     unsigned char x,y;

  301.     if(y1%8==0) y=y1/8;      
  302.     else y=y1/8+1;
  303.     for(y=y0;y<y1;y++)
  304.     {
  305.         OLED_Set_Pos(x0,y);
  306.         for(x=x0;x<x1;x++)
  307.         {      
  308.             OLED_WR_Byte(BMP[j++],OLED_DATA);            
  309.         }
  310.     }
  311. }

  312. //初始化SSD1306                        
  313. void OLED_Init(void)
  314. {     
  315.     GPIO_InitTypeDef  GPIO_InitStructure;
  316.    
  317.      RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);     //使能A端口时钟
  318.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7|GPIO_Pin_6;     
  319.      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;          //推挽输出
  320.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//速度50MHz
  321.      GPIO_Init(GPIOC, &GPIO_InitStructure);      //初始化GPIOD3,6
  322.      GPIO_SetBits(GPIOC,GPIO_Pin_7|GPIO_Pin_6);   
  323.    

  324.    
  325.    
  326.     OLED_WR_Byte(0xAE,OLED_CMD);//--turn off oled panel
  327.     OLED_WR_Byte(0x00,OLED_CMD);//---set low column address
  328.     OLED_WR_Byte(0x10,OLED_CMD);//---set high column address
  329.     OLED_WR_Byte(0x40,OLED_CMD);//--set start line address  Set Mapping RAM Display Start Line (0x00~0x3F)
  330.     OLED_WR_Byte(0x81,OLED_CMD);//--set contrast control register
  331.     OLED_WR_Byte(0xCF,OLED_CMD);// Set SEG Output Current Brightness
  332.     OLED_WR_Byte(0xA1,OLED_CMD);//--Set SEG/Column Mapping     0xa0左右反置 0xa1正常
  333.     OLED_WR_Byte(0xC8,OLED_CMD);//Set COM/Row Scan Direction   0xc0上下反置 0xc8正常
  334.     OLED_WR_Byte(0xA6,OLED_CMD);//--set normal display
  335.     OLED_WR_Byte(0xA8,OLED_CMD);//--set multiplex ratio(1 to 64)
  336.     OLED_WR_Byte(0x3f,OLED_CMD);//--1/64 duty
  337.     OLED_WR_Byte(0xD3,OLED_CMD);//-set display offset    Shift Mapping RAM Counter (0x00~0x3F)
  338.     OLED_WR_Byte(0x00,OLED_CMD);//-not offset
  339.     OLED_WR_Byte(0xd5,OLED_CMD);//--set display clock divide ratio/oscillator frequency
  340.     OLED_WR_Byte(0x80,OLED_CMD);//--set divide ratio, Set Clock as 100 Frames/Sec
  341.     OLED_WR_Byte(0xD9,OLED_CMD);//--set pre-charge period
  342.     OLED_WR_Byte(0xF1,OLED_CMD);//Set Pre-Charge as 15 Clocks & Discharge as 1 Clock
  343.     OLED_WR_Byte(0xDA,OLED_CMD);//--set com pins hardware configuration
  344.     OLED_WR_Byte(0x12,OLED_CMD);
  345.     OLED_WR_Byte(0xDB,OLED_CMD);//--set vcomh
  346.     OLED_WR_Byte(0x40,OLED_CMD);//Set VCOM Deselect Level
  347.     OLED_WR_Byte(0x20,OLED_CMD);//-Set Page Addressing Mode (0x00/0x01/0x02)
  348.     OLED_WR_Byte(0x02,OLED_CMD);//
  349.     OLED_WR_Byte(0x8D,OLED_CMD);//--set Charge Pump enable/disable
  350.     OLED_WR_Byte(0x14,OLED_CMD);//--set(0x10) disable
  351.     OLED_WR_Byte(0xA4,OLED_CMD);// Disable Entire Display On (0xa4/0xa5)
  352.     OLED_WR_Byte(0xA6,OLED_CMD);// Disable Inverse Display On (0xa6/a7)
  353.     OLED_WR_Byte(0xAF,OLED_CMD);
  354.     OLED_Clear();
  355.    
  356.    
  357. }





maudlu 发表于 2023-12-5 10:54 | 显示全部楼层
所有的GPIO引脚都正确连接到OLED屏幕的控制引脚上,特别是电源引脚和数据引脚。
jackcat 发表于 2023-12-5 12:10 | 显示全部楼层
在程序开始时,对OLED模块进行了正确的初始化,包括设置通信协议、时钟速度、数据传输格式等。
abotomson 发表于 2023-12-5 15:27 | 显示全部楼层
是否存在硬件故障,如电源线路是否正常、屏幕是否烧毁等
nomomy 发表于 2023-12-5 15:50 | 显示全部楼层
需要检查的内容包括:SPI或I2C的配置是否正确、寄存器的设置是否正确、数据的发送是否正确等。
sdCAD 发表于 2023-12-5 16:13 | 显示全部楼层
过高的刷新频率可能会导致OLED屏幕无法显示
rosemoore 发表于 2023-12-5 16:42 | 显示全部楼层
OLED屏幕本身是否正常工作              
wwppd 发表于 2023-12-5 17:25 | 显示全部楼层
可以查看OLED屏幕的数据手册              
linfelix 发表于 2023-12-5 19:56 | 显示全部楼层
SCL和SDA引脚连接正确?              
pixhw 发表于 2023-12-5 20:33 | 显示全部楼层
STM32板子的时钟设置正确              
caigang13 发表于 2023-12-6 10:28 来自手机 | 显示全部楼层
看过OLED屏幕的驱动时序没
jackcat 发表于 2023-12-6 22:53 | 显示全部楼层
更换一个OLED屏幕来进行测试              
minzisc 发表于 2023-12-9 14:57 | 显示全部楼层
OLED屏幕需要3.3V的电源电压
updownq 发表于 2023-12-9 20:15 | 显示全部楼层
需要注意代码的逻辑是否正确              
jkl21 发表于 2023-12-9 21:14 | 显示全部楼层
指令控制是否正确、时钟配置是否正确
iyoum 发表于 2023-12-10 16:50 | 显示全部楼层
如果驱动程序不可用或版本不匹配,可能会导致OLED屏无法正常显示。
vivilyly 发表于 2023-12-12 14:47 | 显示全部楼层
可以参考官方的示例代码              
timfordlare 发表于 2023-12-12 16:04 | 显示全部楼层
请确保您的代码中包含了适当的延时函数, 给OLED显示屏足够的时间来处理数据。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

20

主题

323

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部

20

主题

323

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部