[活动专区] 【AT-START-F437测评】OLED显示

[复制链接]
1201|1
 楼主| aple0807 发表于 2022-12-29 21:16 | 显示全部楼层 |阅读模式
手上有个SPI接口OLED屏,尺寸128x64,正好给AT32F437评估板加个显示器。OLED没太多好讲的,主要就是代码实现:

连接如下:
OLED    MCU
D/C     PB10
CS      PA8
RST     PA10
CLK     PB3
DAT     PB5

底层主要是SPI接口调试,相对比较简单,实现初始化和写函数即可:

初始化:
  1. void ext_spi_init(void)
  2. {
  3.         spi_init_type cfg;
  4.         intx_alloc();

  5.         // 开启时钟
  6.         intx_disable();

  7.         crm_periph_clock_enable(CRM_SPI1_PERIPH_CLOCK, TRUE);
  8.         crm_periph_reset(CRM_SPI1_PERIPH_RESET, TRUE);
  9.         crm_periph_reset(CRM_SPI1_PERIPH_RESET, FALSE);

  10.         intx_enable();

  11.         // SPI 配置
  12.         cfg.transmission_mode = SPI_TRANSMIT_FULL_DUPLEX;
  13.         cfg.mclk_freq_division = SPI_MCLK_DIV_32;
  14.         cfg.master_slave_mode = SPI_MODE_MASTER;
  15.         cfg.frame_bit_num = SPI_FRAME_8BIT;
  16.         cfg.first_bit_transmission = SPI_FIRST_BIT_MSB;
  17.         cfg.cs_mode_selection = SPI_CS_SOFTWARE_MODE;
  18.         cfg.clock_polarity = SPI_CLOCK_POLARITY_HIGH;
  19.         cfg.clock_phase = SPI_CLOCK_PHASE_2EDGE;

  20.         spi_init(SPIn, &cfg);

  21.         SPIn->ctrl1_bit.spien = 1;
  22. }
写函数
  1. void ext_spi_wb(uint8_t dataW)
  2. {
  3.         volatile uint8_t rb;

  4.         spi_rx_reset();

  5.         //send data
  6.         spi_send(dataW);
  7.         spi_read_delay();

  8.         //wait for trans complete
  9.         while (is_spi_busy())
  10.                 ;

  11.         //read data
  12.         rb = spi_read();
  13. }
oled 数据/命令操作:
  1. void oled1_write_cmd(uu8 Data)
  2. {
  3.         oled_cs.dis();
  4.         oled_dc.dis();
  5.        
  6.         oled_spi_wb(Data);

  7.         oled_cs.en();
  8. }

  9. void oled1_write_data(uu8 Data)
  10. {
  11.         oled_cs.dis();
  12.         oled_dc.en();
  13.        
  14.         oled_spi_wb(Data);

  15.         oled_cs.en();
  16. }
oled模块初始化:
  1. void        ssd1306_m1_init(void)
  2. {
  3.         //internal setting
  4.         oled1_write_cmd(0xae);        //--turn off oled panel
  5.         oled1_write_cmd(0x00);        //--set low column address
  6.         oled1_write_cmd(0x10);        //--set high column address
  7.         oled1_write_cmd(0x40);        //--set start line address
  8.         oled1_write_cmd(0x81);        //--set contrast control register
  9.         oled1_write_cmd(0xf0);
  10.         oled1_write_cmd(0xa1);        //--ÁÐɨÃè˳Ðò£º´Ó×óµ½ÓÒa1        //×óÓÒ·­×ªa0
  11.         oled1_write_cmd(0xc8);        //--ÐÐɨÃè˳Ðò£º´ÓÉϵ½ÏÂc8        //ÉÏϵߵ¹c0
  12.         oled1_write_cmd(0xa6);        //--set normal display
  13.         oled1_write_cmd(0xa8);        //--set multiples ratio(1to64)
  14.         oled1_write_cmd(0x3f);        //--1/64 duty
  15.         oled1_write_cmd(0xd3);        //--set display offset
  16.         oled1_write_cmd(0x00);        //--not offset
  17.         oled1_write_cmd(0xd5);        //--set display clock divide ratio/oscillator frequency
  18.         oled1_write_cmd(0x80);        //--set divide ratio
  19.         oled1_write_cmd(0xd9);        //--set pre-charge period
  20.         oled1_write_cmd(0xf1);
  21.         oled1_write_cmd(0xda);        //--set com pins hardware configuration
  22.         oled1_write_cmd(0x12);
  23.         oled1_write_cmd(0xdb);        //--set vcomh
  24.         oled1_write_cmd(0x30);
  25.         oled1_write_cmd(0x8d);        //--set chare pump enable/disable
  26.         oled1_write_cmd(0x14);        //--set(0x10) disable

  27.         clr_display();

  28.         oled1_write_cmd(0xaf);
  29.         //oled1_write_cmd(0xa7);        //--set normal display
  30.         oled1_write_cmd(0xa6);        //--set normal display
  31. }
显示效果如下图所示:
oled.jpg
代码托管在GITEE,后面评测会一直用这个仓库更新。
https://gitee.com/aple_sun/atf437-start



forgot 发表于 2022-12-30 17:10 | 显示全部楼层
我也是准备做一个OLED液晶显示的测评
您需要登录后才可以回帖 登录 | 注册

本版积分规则

77

主题

326

帖子

2

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