3692|2

565

帖子

0

TA的资源

一粒金砂(高级)

楼主
 

【AT-START-F425测评】+移植u8g2单色图形库驱动0.96吋OLED [复制链接]

 

1、前言

关于0.96吋oled的详细驱动,可参考【BLE 5.3无线MCU CH582】5、硬件I2C驱动0.96吋OLED,本文移植u8g2图形库来驱动OLED。

 

2、关于u8g2库

u8g2是单色显示库的第二个版本。支持lcd和oled,支持众多驱动芯片,比如SSD1305, SSD1306, SSD1309, SSD1312, SSD1316, SSD1320, SSD1322, SSD1325, SSD1327, SSD1329, SSD1606, SSD1607, SH1106, SH1107, SH1108, SH1122, T6963, RA8835, LC7981, PCD8544, PCF8812, HX1230, UC1601, UC1604, UC1608, UC1610, UC1611, UC1617, UC1638, UC1701, ST7511, ST7528, ST7565, ST7567, ST7571, ST7586, ST7588, ST75256, ST75320, NT7534, ST7920, IST3020, IST7920, LD7032, KS0108, KS0713, HD44102, T7932, SED1520, SBN1661, IL3820, MAX7219等。

 

开源,可直接下载代码移植:https://github.com/olikraus/u8g2。

 

3、移植

(1)直接从github下载代码,u8g2支持c/c++ ,csrc文件夹下面是c源码

(2)u8g2里面支持多种芯片,这里添加自己与自己芯片对应的,以u8x8_d_xxx.c命名的就是驱动文件,这里我们使用的ssd1306,因此只需将u8x8_d_ssd1312_128x64_noname.c这个驱动文件添加到工程中

(3)修改"u8g2_d_setup.c"这个文件,删除其他函数只留下自己器件相关的。由于我用的硬件IIC,而且因为自己单片机空间较大所以选择后缀为f的函数使用,即我选择的是"u8g2_Setup_ssd1306_i2c_128x64_noname_f"这个函数,其他都删除了。当然也可以使用后缀为1或者2的函数,比较省空间,但是自然的会比较耗时。

(4)修改“u8g2_d_memory.c”文件,这个文件里面其实就是“u8g2_d_setup.c”文件对应的缓冲区,同上面一样,屏蔽掉没用到的,留下用到的。

(5)关于字库

“u8g2_fonts.c”文件中定义了各种字库,这些字库比较占用空间,根据使用情况屏蔽掉没有使用的。 

 

(6)两个回调函数

void u8g2_Setup_ssd1306_i2c_128x64_noname_f(u8g2_t *u8g2, const u8g2_cb_t *rotation, u8x8_msg_cb byte_cb, u8x8_msg_cb gpio_and_delay_cb);

参数byte_cb和gpio_and_delay_cb是需要编写的两个回调函数。

byte_cb是硬件接口相关的函数,gpio_and_delay_cb是关于io口操作延时相关的函数。

关于回调函数的写法可以参考官方的描述:https://github.com/olikraus/u8g2/wiki/Porting-to-new-MCU-platform,,针对at32f425的如下:

  • uint8_t u8x8_byte_at32f425_hw_i2c(u8x8_t *u8x8, uint8_t msg, uint8_t arg_int, void *arg_ptr)
  • {
  • static uint8_t buffer[32]; /* u8g2/u8x8 will never send more than 32 bytes between START_TRANSFER and END_TRANSFER */
  • static uint8_t buf_idx;
  • uint8_t *data;
  • switch(msg)
  • {
  • case U8X8_MSG_BYTE_SEND:
  • data = (uint8_t *)arg_ptr;
  • while( arg_int > 0 ){
  • buffer[buf_idx++] = *data;
  • data++;
  • arg_int--;
  • }
  • break;
  • case U8X8_MSG_BYTE_INIT:
  • /* add your custom code to init i2c subsystem */
  • break;
  • case U8X8_MSG_BYTE_START_TRANSFER:
  • buf_idx = 0;
  • break;
  • case U8X8_MSG_BYTE_END_TRANSFER:
  • HW_I2cWrite(buffer,buf_idx);
  • break;
  • default:
  • return 0;
  • }
  • return 1;
  • }
  • uint8_t u8g2_gpio_and_delay_at32f425(U8X8_UNUSED u8x8_t *u8x8, U8X8_UNUSED uint8_t msg, U8X8_UNUSED uint8_t arg_int, U8X8_UNUSED void *arg_ptr)
  • {
  • switch(msg)
  • {
  • case U8X8_MSG_GPIO_AND_DELAY_INIT:
  • break;
  • case U8X8_MSG_DELAY_MILLI:
  • delay_ms(arg_int);
  • break;
  • case U8X8_MSG_GPIO_I2C_CLOCK:
  • break;
  • case U8X8_MSG_GPIO_I2C_DATA:
  • break;
  • default:
  • return 0;
  • }
  • return 1; // command processed successfully.
  • }

 u8x8_byte_at32f425_hw_i2c函数中关于硬件i2c写的具体函数如下:

  • void HW_I2cWrite(uint8_t *buf,uint8_t len)
  • {
  • if(len<=0)
  • return ;
  • /* wait for the busy falg to be reset */
  • while(i2c_flag_get(I2C1, I2C_BUSYF_FLAG) );
  • /* start transfer */
  • i2c_transmit_set(I2C1, I2C_SLAVE_ADDRESS7, len, I2C_SOFT_STOP_MODE, I2C_GEN_START_WRITE);
  • i2c_start_generate(I2C1);
  • while(i2c_flag_get(I2C1, I2C_ADDRF_FLAG) );
  • for(uint8_t i=0;i<len;i++)
  • {
  • while(!i2c_flag_get(I2C1, I2C_TDIS_FLAG) );
  • i2c_data_send(I2C1, buf[i]);
  • }
  • i2c_stop_generate(I2C1);
  • while(!i2c_flag_get(I2C1, I2C_STOPF_FLAG) );
  • i2c_flag_clear(I2C1, I2C_STOPF_FLAG);
  • }

 

4、代码测试

  • static u8g2_t u8g2;
  • void U8g2Init(void)
  • {
  • HW_I2cInit();
  • u8g2_Setup_ssd1306_i2c_128x64_noname_f(&u8g2,U8G2_R0,u8x8_byte_at32f425_hw_i2c,u8g2_gpio_and_delay_at32f425);
  • u8g2_InitDisplay(&u8g2); // send init sequence to the display, display is in sleep mode after this,
  • u8g2_SetPowerSave(&u8g2, 0); // wake up display
  • u8g2_ClearBuffer(&u8g2);
  • void DrawLogo(void);
  • DrawLogo();
  • }
  • void DrawLogo(void)
  • {
  • u8g2_SetFontMode(&u8g2, 1); /*字体模式选择*/
  • u8g2_SetFontDirection(&u8g2, 0); /*字体方向选择*/
  • u8g2_SetFont(&u8g2, u8g2_font_inb24_mf); /*字库选择*/ //u8g2_font_inb24_mf
  • u8g2_DrawStr(&u8g2, 0, 20, "U");
  • u8g2_SetFontDirection(&u8g2, 1);
  • u8g2_SetFont(&u8g2, u8g2_font_inb30_mn); //u8g2_font_inb30_mn
  • u8g2_DrawStr(&u8g2, 21,8,"8");
  • u8g2_SetFontDirection(&u8g2, 0);
  • u8g2_SetFont(&u8g2, u8g2_font_inb24_mf); //u8g2_font_inb24_mf
  • u8g2_DrawStr(&u8g2, 51,30,"g");
  • u8g2_DrawStr(&u8g2, 67,30,"\xb2");
  • u8g2_DrawHLine(&u8g2, 2, 35, 47);
  • u8g2_DrawHLine(&u8g2, 3, 36, 47);
  • u8g2_DrawVLine(&u8g2, 45, 32, 12);
  • u8g2_DrawVLine(&u8g2, 46, 33, 12);
  • u8g2_SetFont(&u8g2, u8g2_font_4x6_tr); //u8g2_font_4x6_tr
  • u8g2_DrawStr(&u8g2, 1,54,"github.com/olikraus/u8g2");
  • u8g2_SendBuffer(&u8g2);
  • }

5、显示

 

 

 

 

 

 

 

 

最新回复

有没有显示中文的字库呀?还有占有空间大吗?  详情 回复 发表于 2022-4-26 08:56
点赞 关注
个人签名stm32/LoRa物联网:304350312
 
 

回复
举报

7196

帖子

11

TA的资源

版主

沙发
 
有没有显示中文的字库呀?还有占有空间大吗?
 
 
 

回复

565

帖子

0

TA的资源

一粒金砂(高级)

板凳
 
lugl4313820 发表于 2022-4-26 08:56 有没有显示中文的字库呀?还有占有空间大吗?

有的,搜了一下,其中的一个中文字库,14k

 

个人签名stm32/LoRa物联网:304350312
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条
有奖直播 | AI之眼——安森美图像传感器 报名中
直播时间:2025年4月25日(周五)上午10:00-11:30
直播主题:AI之眼——安森美图像传感器
报名观看直播、直播间提问、填写问卷均有机会获得精美礼品!

查看 »

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网 8

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表