[活动专区] 【AT-START-L021测评】+I2C_OLED屏显示驱动

[复制链接]
 楼主| jinglixixi 发表于 2024-11-28 19:17 | 显示全部楼层 |阅读模式
在AT-START-L021开发板上配有ArduinoTM Uno R3扩展接口,合理地所用它可起到事半功倍的效果。这里以一款I2C接口的OLED屏显示驱动为例来进行介绍,为了借用图1所示的扩展接口从而免去接线的问题,故OLED屏与开发板的连接关系为:
SCL---PA5
SDA---PA6

43313674850cba6359.png
1  所用接口
使这2个引脚输出高低电平的语句定义为:
#define OLED_SCLK_Clr()  gpio_bits_write(GPIOA,GPIO_PINS_5,FALSE)
#define OLED_SCLK_Set()  gpio_bits_write(GPIOA,GPIO_PINS_5,TRUE)
#define OLED_SDIN_Clr()  gpio_bits_write(GPIOA,GPIO_PINS_6,FALSE)
#define OLED_SDIN_Set()  gpio_bits_write(GPIOA,GPIO_PINS_6,TRUE)
配置这2个引脚为输出功能的函数为:
  1. void oled_CONFIG(void)
  2. {
  3.   gpio_init_type gpio_init_struct;
  4.   crm_periph_clock_enable(CRM_GPIOA_PERIPH_CLOCK, TRUE);
  5.   gpio_default_para_init(&gpio_init_struct);
  6.   gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
  7.   gpio_init_struct.gpio_out_type  = GPIO_OUTPUT_PUSH_PULL;
  8.   gpio_init_struct.gpio_mode = GPIO_MODE_OUTPUT;
  9.   gpio_init_struct.gpio_pins = GPIO_PINS_5|GPIO_PINS_6;
  10.   gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
  11.   gpio_init(GPIOA, &gpio_init_struct);
  12. }

该显示屏的初始化函数为:
  1. void OLED_Init(void)
  2. {
  3.     Write_IIC_Command(0xAE);
  4.     Write_IIC_Command(0x20);
  5.     Write_IIC_Command(0x10);
  6.     Write_IIC_Command(0xb0);
  7.     Write_IIC_Command(0xc8);
  8.     Write_IIC_Command(0x00);
  9.     Write_IIC_Command(0x10);
  10.     Write_IIC_Command(0x40);
  11.     Write_IIC_Command(0x81);
  12.     Write_IIC_Command(0xdf);
  13.     Write_IIC_Command(0xa1);
  14.     Write_IIC_Command(0xa6);
  15. Write_IIC_Command(0xa8);
  16. Write_IIC_Command(0x3F);
  17. Write_IIC_Command(0xa4);
  18. Write_IIC_Command(0xd3);
  19.     Write_IIC_Command(0x00);
  20.     Write_IIC_Command(0xd5);
  21.     Write_IIC_Command(0xf0);
  22.     Write_IIC_Command(0xd9);
  23.     Write_IIC_Command(0x22);
  24.     Write_IIC_Command(0xda);
  25.     Write_IIC_Command(0x12);
  26.     Write_IIC_Command(0xdb);
  27.     Write_IIC_Command(0x20);
  28.     Write_IIC_Command(0x8d);
  29.     Write_IIC_Command(0x14);
  30.     Write_IIC_Command(0xaf);
  31. }

实现清屏处理的函数为:
  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_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.         {       
  6. OLED_ShowChar(x,y,chr[j],Char_Size);
  7.                 x+=8;
  8.                 if(x>120) {x=0;y+=2;}
  9.                 j++;
  10.         }
  11. }

显示显示功能测试的主程序为:
  1. int main(void)
  2. {
  3.   system_clock_config();
  4.   at32_board_init();
  5.   oled_CONFIG();
  6. OLED_Init();
  7. OLED_Clear();
  8. OLED_ShowString(0,0,"AT32L021 TEST",16);
  9. OLED_ShowString(0,2,"OLED DISPLAY",16);
  10. OLED_ShowString(0,4,"jinglixixi",16);
  11. OLED_ShowString(0,6,"2024.11.28",16);
  12.   while(1)
  13.   {
  14.     at32_led_toggle(LED2);
  15.     delay_ms(200);
  16.     at32_led_toggle(LED3);
  17.     delay_ms(200);
  18.     at32_led_toggle(LED4);
  19.     delay_ms(200);
  20.   }
  21. }

经程序的编译与下载,其显示效果如图2所示。
3570467485154a38d3.png
2  显示效果


71639674850a6da7ed.png
您需要登录后才可以回帖 登录 | 注册

本版积分规则

518

主题

2933

帖子

39

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

518

主题

2933

帖子

39

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