[STM32C0] NUCLEO-C071RB开发板的OLED显示驱动

[复制链接]
 楼主| jinglixixi 发表于 2025-5-14 20:35 | 显示全部楼层 |阅读模式
#申请原创#

NUCLEO系列开发板较之DISCO系列开发板的最大区别在于外设资源的配置,同样对于NUCLEO-C071RB开发板也是一样。
为了便于直观地观察测试效果,就需要为它配置一个对应的显示器件。从简化测试的需要,这里为它配置一个I2C接口的OLED屏。
为了省去连线的烦扰,这里是利于图1所示的CN5接口。由于是所用AREF引脚来提供电源,为此需要将SB4焊盘加以短接。
9bb9bf30a1f66abdc7ed556d00cce3f7
图1 所用接口

相应的是由PA5来控制显示屏的SCK引脚,由PA6来控制显示屏的SDA引脚,对这2个引脚的配置函数为:
  1. void OLED_config(void)
  2. {
  3. GPIO_InitTypeDef gpio_init_structure;
  4. __HAL_RCC_GPIOA_CLK_ENABLE();
  5. gpio_init_structure.Pin = GPIO_PIN_5|GPIO_PIN_6;
  6. gpio_init_structure.Mode = GPIO_MODE_OUTPUT_PP;
  7. gpio_init_structure.Pull = GPIO_NOPULL;
  8. gpio_init_structure.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
  9. HAL_GPIO_Init(GPIOA, &gpio_init_structure);
  10. }


实现引脚输出高低电平的语句定义为:
#define OLED_SCLK_Clr()  HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET)   
#define OLED_SCLK_Set()  HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET)
#define OLED_SDIN_Clr()  HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6, GPIO_PIN_RESET)
#define OLED_SDIN_Set()  HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6, GPIO_PIN_SET)

对OLED屏的初始化函数为:
  1. void OLED_Init(void)
  2. {

  3. Write_IIC_Command(0xAE); //display off
  4. Write_IIC_Command(0x20); //Set Memory Addressing Mode
  5. Write_IIC_Command(0x10);
  6. Write_IIC_Command(0xb0);//Set Page Start Address for Page Addressing Mode,0-7
  7. Write_IIC_Command(0xc8);//Set COM Output Scan Direction
  8. Write_IIC_Command(0x00);//---set low column address
  9. Write_IIC_Command(0x10);//---set high column address
  10. Write_IIC_Command(0x40);//--set start line address
  11. Write_IIC_Command(0x81);//--set contrast control register
  12. Write_IIC_Command(0xdf);
  13. Write_IIC_Command(0xa1);//--set segment re-map 0 to 127
  14. Write_IIC_Command(0xa6);//--set normal display
  15. Write_IIC_Command(0xa8);//--set multiplex ratio(1 to 64)
  16. Write_IIC_Command(0x3F);
  17. Write_IIC_Command(0xa4);//0xa4,Output follows RAM content;0xa5,Output ignores RAM content
  18. Write_IIC_Command(0xd3);//-set display offset
  19. Write_IIC_Command(0x00);//-not offset
  20. Write_IIC_Command(0xd5);//--set display clock divide ratio/oscillator frequency
  21. Write_IIC_Command(0xf0);//--set divide ratio
  22. Write_IIC_Command(0xd9);//--set pre-charge period
  23. Write_IIC_Command(0x22);
  24. Write_IIC_Command(0xda);//--set com pins hardware configuration
  25. Write_IIC_Command(0x12);
  26. Write_IIC_Command(0xdb);//--set vcomh
  27. Write_IIC_Command(0x20);//0x20,0.77xVcc
  28. Write_IIC_Command(0x8d);//--set DC-DC enable
  29. Write_IIC_Command(0x14);
  30. Write_IIC_Command(0xaf);//--turn on oled panel
  31. }


模拟I2C进行字节数据发送的函数为:
  1. void Write_IIC_Byte(unsigned char IIC_Byte)
  2. {
  3. unsigned char i;
  4. unsigned char m,da;
  5. da=IIC_Byte;
  6. OLED_SCLK_Clr();
  7. for(i=0;i<8;i++)
  8. {
  9. m=da;
  10. m=m&0x80;
  11. if(m==0x80)
  12. {OLED_SDIN_Set();}
  13. else OLED_SDIN_Clr();
  14. da=da<<1;
  15. OLED_SCLK_Set();
  16. OLED_SCLK_Clr();
  17. }
  18. }


实现清屏处理的函数为:
  1. void OLED_Clear(void)
  2. {
  3. uint8_t i,n;
  4. for(i=0;i<8;i++)
  5. {
  6. OLED_WR_Byte (0xb0+i,OLED_CMD);
  7. OLED_WR_Byte (0x00,OLED_CMD);
  8. OLED_WR_Byte (0x10,OLED_CMD);
  9. for(n=0;n<128;n++)OLED_WR_Byte(0,OLED_DATA);
  10. }
  11. }


实现字符显示的函数为:
  1. void OLED_ShowChar(uint8_t x,uint8_t y,uint8_t chr,uint8_t Char_Size)
  2. {
  3. unsigned char c=0,i=0;
  4. c=chr-' ';
  5. if(x>Max_Column-1){x=0;y=y+2;}
  6. if(Char_Size ==16)
  7. {
  8. OLED_Set_Pos(x,y);
  9. for(i=0;i<8;i++)
  10. OLED_WR_Byte(F8X16[c*16+i],OLED_DATA);
  11. OLED_Set_Pos(x,y+1);
  12. for(i=0;i<8;i++)
  13. OLED_WR_Byte(F8X16[c*16+i+8],OLED_DATA);
  14. }
  15. else {
  16. OLED_Set_Pos(x,y);
  17. for(i=0;i<6;i++)
  18. OLED_WR_Byte(F6x8[c][i],OLED_DATA);
  19. }
  20. }


字符显示的字符串函数为:
  1. void OLED_ShowString(uint8_t x,uint8_t y,uint8_t *chr,uint8_t Char_Size)
  2. {
  3. unsigned char j=0;
  4. while (chr[j]!='\0')
  5. {OLED_ShowChar(x,y,chr[j],Char_Size);
  6. x+=8;
  7. if(x>120){x=0;y+=2;}
  8. j++;
  9. }
  10. }


实现显示驱动效果测试的主程序为:
  1. int main(void)
  2. {
  3. HAL_Init();
  4. SystemClock_Config();
  5. BSP_LED_Init(LED1);
  6. OLED_config();
  7. OLED_Init();
  8. OLED_Clear();
  9. OLED_ShowString(0,0,"STM32C071",16);
  10. OLED_ShowString(0,2,"OLED TEST",16);
  11. EXTI4_15_IRQHandler_Config();
  12. while (1);
  13. }


经程序的编译和下载,其测试效果如图2所示,说明驱动功能正常,符合设计要求。
09fbb8071155afbedf3e1d40cca1d445
图2 显示效果


AdaMaYun 发表于 2025-6-8 21:09 | 显示全部楼层
OLED显示驱动
您需要登录后才可以回帖 登录 | 注册

本版积分规则

518

主题

2933

帖子

39

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