[STM32C0] 【STM32C092RC 测评】+10使用硬件IIC驱动OLED屏幕

[复制链接]
 楼主| 聪聪哥哥 发表于 2025-5-26 15:56 | 显示全部楼层 |阅读模式
<
本帖最后由 聪聪哥哥 于 2025-5-26 16:44 编辑

一:OLED知识分享OLED,即有机发光二极管(Organic Light-Emitting Diode),又称为有机电激光显示(Organic Electroluminesence Display, OELD)。因为具备轻薄、省电等特性,因此从 2003 年开始,这种显示设备在 MP3 播放器上得到了广泛应用,而对于同属数码类产品的 DC 与手机,此前只是在一些展会上展示过采用 OLED 屏幕的工程样品。自 2007 年后,寿命得 到很大提高,具备了许多 LCD 不可比拟的优势。
GND:电源地 VCC:2.2V~5.5V SCL(D0):CLK 时钟 (高电平 2.2V~5.5V) SDA(D1):MOSI 数据(高电平 2.2V~5.5V) RST:复位(高电平 2.2V~5.5V) D/C:数据/命令(高电平 2.2V~5.5V) 兼容 3.3V 和 5V 控制芯片的 I/O 电平(无需任何设置,直接兼容)。

实物图片如下:
1.png
二:字符建立过程:
2.png
这里参考上图对字库进行配置就可以了
三:STM32 cube MX 的配置过程
3.png
这里我使用的引脚是 PB8,PB9,也是为STM32C092绘制了一个拓展版,方便对其进行测试,
直接好似用硬件的IIC即可。
注意使能硬件IIC
4.png
四:软件代码编写:
底层驱动的编写函数
  1. extern I2C_HandleTypeDef hi2c1;
  2. /***********************************************************************************************
  3.   * [url=home.php?mod=space&uid=247401]@brief[/url]   static unsigned char OLED_send_byteS(unsigned char *data, unsigned char length)
  4.   * @param    data:输入的数据  length:长度值,使用硬件IIC底层驱动函数
  5.   * @retval  无
  6.   * [url=home.php?mod=space&uid=187600]@author[/url]  聪聪哥哥
  7.   * @version V1.1.0
  8.   * [url=home.php?mod=space&uid=212281]@date[/url]     25-5-2025
  9. *************************************************************************************************/
  10. static unsigned char OLED_send_byteS(unsigned char *data, unsigned char length)
  11. {
  12.         if (HAL_I2C_Master_Transmit(&hi2c1, 0x78, data, length, 2) != HAL_OK)
  13.         {
  14.                 return 0;
  15.         }
  16.         return 1;
  17. }

  18. /***********************************************************************************************
  19.   * [url=home.php?mod=space&uid=247401]@brief[/url]   static void I2C_WriteByte(uint8_t addr, uint8_t value)
  20.   * @param    addr:IIC模块的地址,value :写入的数据
  21.   * @retval  无
  22.   * [url=home.php?mod=space&uid=187600]@author[/url]  聪聪哥哥
  23.   * @version V1.1.0
  24.   * [url=home.php?mod=space&uid=212281]@date[/url]     25-5-2025
  25. *************************************************************************************************/
  26. static void I2C_WriteByte(uint8_t addr, uint8_t value)
  27. {
  28.         unsigned char dta[2] = {0};
  29.         dta[0] = addr;
  30.         dta[1] = value;
  31.         OLED_send_byteS(dta, 2);
  32. }

  33. /***********************************************************************************************
  34.   * [url=home.php?mod=space&uid=247401]@brief[/url]   void WriteCmd(unsigned char I2C_Command)
  35.   * @param    I2C_Command : IIC的命令
  36.   * @retval  无
  37.   * [url=home.php?mod=space&uid=187600]@author[/url]  聪聪哥哥
  38.   * @version V1.1.0
  39.   * [url=home.php?mod=space&uid=212281]@date[/url]     25-5-2025
  40. *************************************************************************************************/
  41. void WriteCmd(unsigned char I2C_Command)
  42. {
  43.         I2C_WriteByte(0x00, I2C_Command);
  44. }

  45. /***********************************************************************************************
  46.   * @brief   void WriteDat(unsigned char I2C_Data)
  47.   * @param    I2C_Data : IIC的数据
  48.   * @retval  无
  49.   * @author  聪聪哥哥
  50.   * @version V1.1.0
  51.   * @date     25-5-2025
  52. *************************************************************************************************/
  53. void WriteDat(unsigned char I2C_Data)//写数据
  54. {
  55.         I2C_WriteByte(0x40, I2C_Data);
  56. }
显示部分函数如下所示:
  1. void OLED_ShowChinese(uint8_t x,uint8_t y,uint8_t num,uint8_t size1)
  2. {
  3.         uint8_t i,m,n=0,temp,chr1;
  4.         uint8_t x0=x,y0=y;
  5.         uint8_t size3=size1/8;
  6.         while(size3--)
  7.         {
  8.                 chr1=num*size1/8+n;
  9.                 n++;
  10.                         for(i=0;i<size1;i++)
  11.                         {
  12.                                 if(size1==16)
  13.                                                 {temp=Hzk1[chr1][i];}//调用16*16字体
  14.                                 else if(size1==24)
  15.                                                 {temp=Hzk2[chr1][i];}//调用24*24字体
  16.                                 else if(size1==32)      
  17.                                                 {temp=Hzk3[chr1][i];}//调用32*32字体
  18.                                 else if(size1==64)
  19.                                                 {temp=Hzk4[chr1][i];}//调用64*64字体
  20.                                 else return;
  21.                                                         
  22.                                                 for(m=0;m<8;m++)
  23.                                                         {
  24.                                                                 if(temp&0x01)
  25.                                                                 {OLED_DrawPoint(x,y);}
  26.                                                                 temp>>=1;
  27.                                                                 y++;
  28.                                                         }
  29.                                                         x++;
  30.                                                         if((x-x0)==size1)
  31.                                                         {x=x0;y0=y0+8;}
  32.                                                         y=y0;
  33.                          }
  34.         }
  35. }


  36. void OLED_Fill(unsigned char fill_Data)//全屏填充
  37. {
  38.         unsigned char m,n;
  39.         for(m=0;m<8;m++)
  40.         {
  41.                 WriteCmd(0xb0+m);                //page0-page1
  42.                 WriteCmd(0x02);                //low column start address
  43.                 WriteCmd(0x10);                //high column start address
  44.                 for(n=0;n<128;n++)
  45.                         {
  46.                                 WriteDat(fill_Data);
  47.                         }
  48.         }
  49. }
初始化屏幕的驱动代码:
  1. void OLED_Init(void)
  2. {
  3.         WriteCmd(0xAE); //display off
  4.         WriteCmd(0x20);        //Set Memory Addressing Mode        
  5.         WriteCmd(0x10);        //00,Horizontal Addressing Mode;01,Vertical Addressing Mode;10,Page Addressing Mode (RESET);11,Invalid
  6.         WriteCmd(0xb0);        //Set Page Start Address for Page Addressing Mode,0-7
  7.         WriteCmd(0xc8);        //Set COM Output Scan Direction
  8.         WriteCmd(0x00); //---set low column address
  9.         WriteCmd(0x10); //---set high column address
  10.         WriteCmd(0x40); //--set start line address
  11.         WriteCmd(0x81); //--set contrast control register
  12.         WriteCmd(0xff); //亮度调节 0x00~0xff
  13.         WriteCmd(0xa1); //--set segment re-map 0 to 127
  14.         WriteCmd(0xa6); //--set normal display
  15.         WriteCmd(0xa8); //--set multiplex ratio(1 to 64)
  16.         WriteCmd(0x3F); //
  17.         WriteCmd(0xa4); //0xa4,Output follows RAM content;0xa5,Output ignores RAM content
  18.         WriteCmd(0xd3); //-set display offset
  19.         WriteCmd(0x00); //-not offset
  20.         WriteCmd(0xd5); //--set display clock divide ratio/oscillator frequency
  21.         WriteCmd(0xf0); //--set divide ratio
  22.         WriteCmd(0xd9); //--set pre-charge period
  23.         WriteCmd(0x22); //
  24.         WriteCmd(0xda); //--set com pins hardware configuration
  25.         WriteCmd(0x12);
  26.         WriteCmd(0xdb); //--set vcomh
  27.         WriteCmd(0x20); //0x20,0.77xVcc
  28.         WriteCmd(0x8d); //--set DC-DC enable
  29.         WriteCmd(0x14); //
  30.         WriteCmd(0xaf); //--turn on oled panel
  31.         OLED_Fill(0xff);//全屏填充
  32.         OLED_ON();
  33. }
主函数部分如下所示:
  1.   OLED_Init();
  2.         OLED_ColorTurn(0);//0?????????1 ??????
  3.   OLED_DisplayTurn(0);//0??????? 1 ?????????
  4.         OLED_Refresh();
  5.         OLED_Clear();

  6.         OLED_ShowCN(16, 0, 0);
  7.         OLED_ShowCN(32, 0, 1);
  8.         OLED_ShowCN(48, 0, 2);
  9.         OLED_ShowCN(64, 0, 3);

  10.         OLED_ShowCN(16, 2, 4);
  11.         OLED_ShowCN(32, 2, 4);

  12.         OLED_ShowCN(48, 2, 5);
  13.         OLED_ShowCN(64, 2, 5);


  14.         OLED_ShowStr(40, 4, (uint8_t *)test_str, 2);
  15.         OLED_ShowStr(40, 6, (uint8_t *)test_str1, 2);
测试图片如下所示:
微信图片_20250526155633.jpg
  
daichaodai 发表于 2025-5-26 19:18 来自手机 | 显示全部楼层
硬件IIC稳定吗?还有bug没有?
 楼主| 聪聪哥哥 发表于 2025-5-26 19:43 | 显示全部楼层
daichaodai 发表于 2025-5-26 19:18
硬件IIC稳定吗?还有bug没有?

,只是显示个数据,我一般不使用软件模拟的,时序调不好,影响太大了,还只能是延时函数。
qintian0303 发表于 2025-5-27 14:01 | 显示全部楼层
这不是单色的看着效果更好了   
t60yz 发表于 2025-5-31 23:41 | 显示全部楼层
初始化时需正确发送指令序列,建议使用成熟驱动库(如 u8g2 / Adafruit_SSD1306 / HAL 驱动)
您需要登录后才可以回帖 登录 | 注册

本版积分规则

85

主题

222

帖子

1

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