[其他ST产品] STM32外设系列—OLED

[复制链接]
 楼主| rzjvv 发表于 2023-7-30 00:53 | 显示全部楼层
显示一串字符串函数如下
  1. /*
  2. *==============================================================================
  3. *函数名称:Med_Oled_ShowString
  4. *函数功能:显示一串字符串
  5. *输入参数:x:横坐标;y:纵坐标;chr:要显示的字符串;Char_Size:大小(8/16)
  6. *返回值:无
  7. *备  注:无
  8. *==============================================================================
  9. */
  10. void Med_Oled_ShowString(u8 x,u8 y,u8 *chr,u8 Char_Size)
  11. {
  12.         while (*chr!='\0')
  13.         {
  14.                 Med_Oled_ShowChar(x,y,*chr,Char_Size);
  15.                 x+=8;
  16.                 if(x>120)
  17.                 {
  18.                         x=0;
  19.                         y+=2;
  20.                 }
  21.                 chr++;
  22.         }
  23. }
 楼主| rzjvv 发表于 2023-7-30 00:53 | 显示全部楼层
需要显示一串字符串时,添加下面程序
  1. Med_Oled_ShowString(2,6,"ertu-20230621",8);   // 在OLED上显示字符串
 楼主| rzjvv 发表于 2023-7-30 00:53 | 显示全部楼层
4.2.3 OLED显示图片
下面提供了显示图片的函数
  1. /*
  2. *==============================================================================
  3. *函数名称:Med_Oled_DrawBMP
  4. *函数功能:显示一张BMP图片
  5. *输入参数:x0:起始横坐标;y:起始纵坐标;x1:终止横坐标;y1:终止纵坐标;
  6.             BMP[]:要显示的图片
  7. *返回值:无
  8. *备  注:无
  9. *==============================================================================
  10. */
  11. void Med_Oled_DrawBMP(u8 x0, u8 y0, u8 x1, u8 y1,u8 BMP[])
  12. {        
  13. u32 j=0;
  14. u8 x,y;
  15.   
  16.   if (y1%8==0)
  17.         {
  18.                 y = y1 / 8;   
  19.         }   
  20.   else
  21.         {
  22.                 y = y1 / 8 + 1;
  23.         }
  24.         for (y = y0;y < y1;y ++)
  25.         {
  26.                 Med_Oled_Set_Pos(x0,y);
  27.     for(x = x0;x < x1;x ++)
  28.             {      
  29.                     OLED_WR_Byte(BMP[j++],OLED_DATA);                   
  30.             }
  31.         }
  32. }
 楼主| rzjvv 发表于 2023-7-30 00:54 | 显示全部楼层
下面是图片取模后的存储文件,其中标注了取模软件,以及取模时的配置
  1. #ifndef __BMP_H
  2. #define __BMP_H

  3. // 图片取模时,首先将图片另存为.bmp格式
  4. // 用Image2Lcd软件取模
  5. // 扫描模式设置为数据水平,字节垂直
  6. // 输出灰度为单色
  7. // 40*40
  8. // 只勾选字节内像素数据反序
  9. unsigned char BMP1[] =
  10. { /* 0X22,0X01,0X28,0X00,0X28,0X00, */
  11. 0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X80,
  12. 0XC0,0X60,0X30,0X10,0X10,0X30,0X20,0X20,0X20,0X00,0X40,0X40,0X40,0X40,0X00,0X00,
  13. 0X80,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
  14. 0XC0,0X60,0X30,0X18,0X0C,0X06,0X03,0X01,0X08,0X04,0X02,0X12,0X02,0X04,0X24,0X24,
  15. 0X24,0X20,0X08,0X08,0X28,0X10,0X00,0X00,0X80,0X40,0X71,0X09,0XC7,0X00,0X00,0X00,
  16. 0X00,0X00,0X00,0XE0,0X18,0X04,0X82,0X40,0X00,0X80,0X80,0X80,0X80,0X00,0X00,0X00,
  17. 0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0XC0,0X60,0X30,0X18,0X8C,0X44,0X11,
  18. 0X08,0X87,0X60,0X30,0X0F,0X00,0X00,0X00,0X00,0X00,0X00,0X0F,0X20,0X43,0X44,0X00,
  19. 0X90,0X90,0X90,0X20,0X20,0X20,0X41,0X41,0X03,0X82,0X82,0X80,0X84,0X04,0X04,0X42,
  20. 0X21,0X10,0X84,0X06,0X23,0X10,0X08,0X02,0X01,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
  21. 0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X01,0X00,0X02,0X02,
  22. 0X02,0X02,0X00,0X04,0X04,0X0C,0X08,0X0C,0X06,0X03,0X01,0X00,0X00,0X00,0X00,0X00,
  23. 0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,};

  24. #endif
 楼主| rzjvv 发表于 2023-7-30 00:54 | 显示全部楼层
主程序中添加如下程序,最终显示结果如下
  1. Med_Oled_DrawBMP(10,1,50,6,BMP1);   // 显示图片
 楼主| rzjvv 发表于 2023-7-30 00:54 | 显示全部楼层
 楼主| rzjvv 发表于 2023-7-30 00:54 | 显示全部楼层
五、OLED画点/画线
使用OLED时,也常用到画点或者画线,这里给出画点和画线的函数。
  1. /*
  2. *==============================================================================
  3. *函数名称:Med_Oled_Refresh_Gram
  4. *函数功能:更新缓存显示内容
  5. *输入参数:无
  6. *返回值:无
  7. *备  注:无
  8. *==============================================================================
  9. */
  10. u8 OLED_GRAM[128][8];
  11. void Med_Oled_Refresh_Gram(void)
  12. {
  13.    u8 i,n;
  14.    for(i=0;i<8;i++)
  15.    {
  16.      OLED_WR_Byte (0xb0+i,OLED_CMD);
  17.      OLED_WR_Byte (0x00,OLED_CMD);
  18.      OLED_WR_Byte (0x10,OLED_CMD);
  19.                  for(n=0;n<128;n++)
  20.                  OLED_WR_Byte(OLED_GRAM[n][i],OLED_DATA);
  21.   }
  22. }
  23. /*
  24. *==============================================================================
  25. *函数名称:Med_Oled_DrawPoint
  26. *函数功能:画点
  27. *输入参数:x:横坐标;y:纵坐标;t:清除(0)/填充(1)
  28. *返回值:无
  29. *备  注:无
  30. *==============================================================================
  31. */
  32. void Med_Oled_DrawPoint(u8 x,u8 y,u8 t)
  33. {
  34.         u8 pos,bx,temp=0;

  35.         if(x>127||y>63) return;
  36.         pos=(y)/8;
  37.         bx=y%8;
  38.         temp=1<<(bx);
  39.         if(t)
  40.                 OLED_GRAM[x][pos]|=temp;                //第bx位,置1,其他位值不变
  41.         else
  42.                 OLED_GRAM[x][pos]&=~temp;                //第bx位,置0,其他位值不变
  43.         
  44.         // 更新缓存
  45.         Med_Oled_Refresh_Gram();       
  46. }
  47. /*
  48. *==============================================================================
  49. *函数名称:Med_Oled_DrawLine
  50. *函数功能:画线
  51. *输入参数:x1:起始点横坐标;y1:起始点纵坐标;x2:结束点横坐标;
  52.             y2:结束点纵坐标;x:0~128;y:0~64
  53. *返回值:无
  54. *备  注:无
  55. *==============================================================================
  56. */
  57. void Med_Oled_DrawLine(u8 x1, u8 y1, u8 x2,u8 y2)
  58. {
  59.         unsigned int t;
  60.         int xerr=0,yerr=0,delta_x,delta_y,distance;
  61.         int incx,incy,uRow,uCol;
  62.         delta_x=x2-x1; //计算坐标增量
  63.         delta_y=y2-y1;
  64.         uRow=x1;
  65.         uCol=y1;
  66.         if(delta_x>0)incx=1; //设置单步方向
  67.         else if(delta_x==0)incx=0;//垂直线
  68.         else {incx=-1;delta_x=-delta_x;}
  69.         if(delta_y>0)incy=1;
  70.         else if(delta_y==0)incy=0;//水平线
  71.         else{incy=-1;delta_y=-delta_y;}
  72.         if( delta_x>delta_y)distance=delta_x; //选取基本增量坐标轴
  73.         else distance=delta_y;
  74.         for(t=0;t<=distance+1;t++ )//画线输出
  75.         {  
  76.                 Med_Oled_DrawPoint(uRow,uCol,1);//画点
  77.                 xerr+=delta_x ;
  78.                 yerr+=delta_y ;
  79.                 if(xerr>distance)
  80.                 {
  81.                         xerr-=distance;
  82.                         uRow+=incx;
  83.                 }
  84.                 if(yerr>distance)
  85.                 {
  86.                         yerr-=distance;
  87.                         uCol+=incy;
  88.                 }
  89.         }
  90. }
 楼主| rzjvv 发表于 2023-7-30 00:54 | 显示全部楼层
main函数添加如下代码
  1. Med_Oled_DrawPoint(10,20,1);   // 画点
  2. Med_Oled_DrawLine(0,30,100,30);   // 画线
 楼主| rzjvv 发表于 2023-7-30 00:54 | 显示全部楼层
显示内容如下
2939464c5446257daa.png
maqianqu 发表于 2023-9-9 17:25 | 显示全部楼层
怎么用stm32cubemx配置oled显示的参数
earlmax 发表于 2023-9-9 20:10 | 显示全部楼层
OLED在观看舒适度上的巨大优势。刷新频率60Hz就足够了。
cashrwood 发表于 2023-9-9 20:23 | 显示全部楼层
OLED模块不与5.0V接口兼容,所以请在使用的时候一定要小心,不要直接接到5V电源上,否则可能烧坏模块。
loutin 发表于 2023-9-9 20:56 | 显示全部楼层
根据OLED显示器的接口类型选择适当的STM32引脚作为通信接口。常见的OLED接口有SPI和I2C。确保将STM32的引脚和OLED的引脚正确连接,并在软件中配置正确的接口类型。
yorkbarney 发表于 2023-9-9 21:31 | 显示全部楼层
stm32驱动oled 不管是SPI还是IIC为啥都是模拟的
beacherblack 发表于 2023-9-9 21:43 | 显示全部楼层
在选择STM32型号时,应考虑其RAM、Flash和处理能力是否足够满足 需求。
Henryko 发表于 2023-9-11 22:19 | 显示全部楼层
第一次用时候直接搞不懂位置应该放在哪
plsbackup 发表于 2023-9-12 16:40 | 显示全部楼层
oled屏幕突然开始闪烁              
wangdezhi 发表于 2023-9-12 16:48 | 显示全部楼层
怎样控制oled 循环显示              
1988020566 发表于 2023-9-12 18:33 | 显示全部楼层
OLED一般采用SPI或者I2C接口进行通信
jimmhu 发表于 2023-9-12 20:12 | 显示全部楼层
stm32f407与四针oled怎么连接
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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