[AT32F405] 【AT-START-F405测评】第二步:点亮OLED屏

[复制链接]
 楼主| lovelessing 发表于 2024-4-27 17:40 | 显示全部楼层 |阅读模式
OLED屏其本质也是LED,所以并不比点亮LED难多少,这次就来点个OELD吧
鉴于OELD的像素相对于LED非常非常多,因此需要专用的屏驱IC来批量控制LED,也称之为屏驱IC,实际上OELD内部的LED需要点亮的电压高达十几伏特,一般常见的是SSD、SH系列的IC,兼容IIC、SPI、8080接口,我用的是4线SPI接口的。
42593662cbe1dc41f2.png
第一步:测试SPI驱动是否正常
仿照demo例程crc_transfer_polling修改SPI的管脚及工作模式等。这里用的是SPI2,由于不需要CRC,直接关掉即可spi_crc_enable(SPI2, FALSE);
  1. gpio_init_type gpio_initstructure;
  2.     crm_periph_clock_enable(CRM_GPIOB_PERIPH_CLOCK, TRUE);
  3.     crm_periph_clock_enable(CRM_GPIOC_PERIPH_CLOCK, TRUE);

  4.     /* slave sck pin */
  5.     gpio_initstructure.gpio_out_type       = GPIO_OUTPUT_PUSH_PULL;
  6.     gpio_initstructure.gpio_pull           = GPIO_PULL_DOWN;
  7.     gpio_initstructure.gpio_mode           = GPIO_MODE_MUX;
  8.     gpio_initstructure.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;

  9.         gpio_initstructure.gpio_mode           = GPIO_MODE_OUTPUT;
  10.         gpio_initstructure.gpio_pull           = GPIO_PULL_UP;
  11.     gpio_initstructure.gpio_pins           = GPIO_PINS_12;
  12.     gpio_init(GPIOB, &gpio_initstructure);
  13.         gpio_initstructure.gpio_pull           = GPIO_PULL_UP;
  14.     gpio_initstructure.gpio_pins           = GPIO_PINS_4;
  15.     gpio_init(GPIOB, &gpio_initstructure);
  16.         gpio_initstructure.gpio_pull           = GPIO_PULL_UP;
  17.     gpio_initstructure.gpio_pins           = GPIO_PINS_4;
  18.     gpio_init(GPIOC, &gpio_initstructure);
  19.        
  20.         gpio_initstructure.gpio_mode           = GPIO_MODE_MUX;
  21.        
  22.     /* slave sck pin */
  23.     gpio_initstructure.gpio_pull           = GPIO_PULL_DOWN;
  24.     gpio_initstructure.gpio_pins           = GPIO_PINS_13;
  25.     gpio_init(GPIOB, &gpio_initstructure);
  26.     gpio_pin_mux_config(GPIOB, GPIO_PINS_SOURCE13, GPIO_MUX_5);

  27.     /* slave miso pin */
  28.     gpio_initstructure.gpio_pull           = GPIO_PULL_UP;
  29.     gpio_initstructure.gpio_pins           = GPIO_PINS_2;
  30.     gpio_init(GPIOC, &gpio_initstructure);
  31.     gpio_pin_mux_config(GPIOC, GPIO_PINS_SOURCE2, GPIO_MUX_5);

  32.     /* slave mosi pin */
  33.     gpio_initstructure.gpio_pull           = GPIO_PULL_UP;
  34.     gpio_initstructure.gpio_pins           = GPIO_PINS_3;
  35.     gpio_init(GPIOC, &gpio_initstructure);
  36.     gpio_pin_mux_config(GPIOC, GPIO_PINS_SOURCE3, GPIO_MUX_5);

  37.     spi_init_type spi_init_struct;
  38.     crm_periph_clock_enable(CRM_SPI2_PERIPH_CLOCK, TRUE);
  39.     spi_default_para_init(&spi_init_struct);
  40.     spi_init_struct.transmission_mode = SPI_TRANSMIT_FULL_DUPLEX;
  41.     spi_init_struct.master_slave_mode = SPI_MODE_MASTER;
  42.     spi_init_struct.mclk_freq_division = SPI_MCLK_DIV_8;
  43.     spi_init_struct.first_bit_transmission = SPI_FIRST_BIT_MSB;
  44.     spi_init_struct.frame_bit_num = SPI_FRAME_8BIT;
  45.     spi_init_struct.clock_polarity = SPI_CLOCK_POLARITY_HIGH;
  46.     spi_init_struct.clock_phase = SPI_CLOCK_PHASE_2EDGE;
  47.     spi_init_struct.cs_mode_selection = SPI_CS_SOFTWARE_MODE;
  48.     spi_init(SPI2, &spi_init_struct);

  49.     spi_crc_polynomial_set(SPI2, 7);
  50.     spi_crc_enable(SPI2, FALSE);
  51.     spi_enable(SPI2, TRUE);
第二步:编写SPI测试函数,查看管脚波形,调用此函数随便发送个数据测试一下,测试正常
  1. uint8_t spi_tx_rx(uint8_t para)
  2. {
  3.     uint8_t rx;

  4.     while(spi_i2s_flag_get(SPI2, SPI_I2S_TDBE_FLAG) == RESET);

  5.     spi_i2s_data_transmit(SPI2, para);

  6.     while(spi_i2s_flag_get(SPI2, SPI_I2S_RDBF_FLAG) == RESET);

  7.     rx = spi_i2s_data_receive(SPI2);
  8.     return rx;
  9. }
第三步:移植OLED驱动程序,这一步可以说是轻车熟路了,CtrlC、CtrlV走起
  1. OLED_CS_Set();
  2.     OLED_DC_Set();
  3.     OLED_RES_Set();
  4.     DelayMs(10);
  5.     OLED_RES_Clr();
  6.     DelayMs(120);
  7.     OLED_RES_Set();

  8.     OLED_WR_Byte(0xAE, OLED_CMD); //关闭显示
  9.     OLED_WR_Byte(0xD5, OLED_CMD); //设置时钟分频因子,震荡频率
  10.     OLED_WR_Byte(80, OLED_CMD);  //[3:0],分频因子;[7:4],震荡频率
  11.     OLED_WR_Byte(0xA8, OLED_CMD); //设置驱动路数
  12.     OLED_WR_Byte(0X3F, OLED_CMD); //默认0X3F(1/64)
  13.     OLED_WR_Byte(0xD3, OLED_CMD); //设置显示偏移
  14.     OLED_WR_Byte(0X00, OLED_CMD); //默认为0

  15.     OLED_WR_Byte(0x40, OLED_CMD); //设置显示开始行 [5:0],行数.

  16.     OLED_WR_Byte(0x8D, OLED_CMD); //电荷泵设置
  17.     OLED_WR_Byte(0x14, OLED_CMD); //bit2,开启/关闭
  18.     OLED_WR_Byte(0x20, OLED_CMD); //设置内存地址模式
  19.     OLED_WR_Byte(0x02, OLED_CMD); //[1:0],00,列地址模式;01,行地址模式;10,页地址模式;默认10;
  20.     OLED_WR_Byte(0xA1, OLED_CMD); //段重定义设置,bit0:0,0->0;1,0->127;
  21.     OLED_WR_Byte(0xC8, OLED_CMD); //设置COM扫描方向;bit3:0,普通模式;1,重定义模式 COM[N-1]->COM0;N:驱动路数
  22.     OLED_WR_Byte(0xDA, OLED_CMD); //设置COM硬件引脚配置
  23.     OLED_WR_Byte(0x12, OLED_CMD); //[5:4]配置

  24.     OLED_WR_Byte(0x81, OLED_CMD); //对比度设置
  25.     OLED_WR_Byte(0xEF, OLED_CMD); //1~255;默认0X7F (亮度设置,越大越亮)
  26.     OLED_WR_Byte(0xD9, OLED_CMD); //设置预充电周期
  27.     OLED_WR_Byte(0xf1, OLED_CMD); //[3:0],PHASE 1;[7:4],PHASE 2;
  28.     OLED_WR_Byte(0xDB, OLED_CMD); //设置VCOMH 电压倍率
  29.     OLED_WR_Byte(0x30, OLED_CMD); //[6:4] 000,0.65*vcc;001,0.77*vcc;011,0.83*vcc;

  30.     OLED_WR_Byte(0xA4, OLED_CMD); //全局显示开启;bit0:1,开启;0,关闭;(白屏/黑屏)
  31.     OLED_WR_Byte(0xA6, OLED_CMD); //设置显示方式;bit0:1,反相显示;0,正常显示
  32.     OLED_WR_Byte(0xAF, OLED_CMD); //开启显示
  33.     OLED_Clear(0);
第四步:写OLED测试函数,下载到开发板,就随便画仨框吧
  1. int main(void)
  2. {
  3.     uint8_t i;
  4.     system_clock_config();
  5.     at32_board_init();
  6.     OLED_Init();
  7.     OLED_SetDir(3);
  8.     OLED_Clear(0);
  9.         OLED_DrawRectangle(5,5,122,59,1);
  10.         OLED_DrawRectangle(15,15,112,49,1);
  11.         OLED_DrawRectangle(25,25,102,39,1);
  12.         OLED_Refresh_Gram();
  13.     while(1)
  14.     {
  15.                
  16.     }
  17. }
第五步:接线再复位重启
2285662cc75d327da.jpg
另一张图
49997662cc7d54a908.png
chenjun89 发表于 2024-5-5 20:12 来自手机 | 显示全部楼层
本质上都是二极管发光,但是控制是两回事。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

21

主题

136

帖子

2

粉丝
快速回复 返回顶部 返回列表