趁着热劲直接将以应用方式驱动OLED模块做个小结(稍后再将以应用方式点灯的过程总结一下,并将与python/内核模块方式等点灯操作作个比较总结)。总所周知(岂马在我的认知里),在嵌入式世界里使用I2C总线驱动器件一般是相对折磨人的事情,如果单纯想直接套用代码硬来移植,那么想必会劝退大部分初学者。如果想拿捏好I2C总线,个人的总结就是理解时序+使用示波器/逻辑分析仪,多多尝试,掌握好规律,就能轻松拿捏I2C移植部分了。
一. 确认I2C及地址
一般大家都不会从无到有的写I2C驱动代码的,我也是拿现成的来改,但是改之前先确认I2C总线地址要与代码的地址相一致。此次实验,将OLED模块连接到了I2C0接口上,而I2C0接口对应的引脚如图1所示,龙芯系统对应的I2C资源(如果龙芯系统占用了I2Cx资源,那么要么修改对应资源并重新编译内核,要么就是选择其他可用的接口资源)如图2所示,该接口对应的系统物理地址如图3所示。

图1 原理图I2C0位置

图2 龙芯系统开发的I2C资源
图3 系统中I2C0对应的地址
从上图3中可以看到与OLED连接后的I2C0地址为0x3C,这个就是代码中要修改的位置(如果连接到其它I2Cx接口,就用这个方式查找修改)。对应的代码一般就是OLED对应的头文件.h(与I2C接口连接的模块头文件),如图4所示。

图4 I2C0对应的头文件
二. 想要显示的内容
- 显示中文,可以通过字模软件进行修改,我这里直接用的是网站https://www.23bei.com/tool/218.html。
- 显示图像,可以通过image2Lcd软件。本来想显示图标
,可惜没有成功(OLED不支持)。
三. 对应的文件
前期工作确定了以后,接下来的任务就是以工程方式组织对应的文件,如图5所示,其中图5中红色框中的内容是编译对应生成的文件。

图5 工程目录
- oled_app.h头文件:相应的OLED地址及函数声明
- oled_app.c文件:相应的OLED操作函数
- oled_code_table.c文件:相应的字模文件
- main文件
#include#include#include#include#include#include#include#include#include#include#include"oled_app.h"externintfd;externconstunsignedcharBMP1[];intmain(intargc,char*argv[]){inti =0;OLED_Init();usleep(1000*100);OLED_Fill(0xff);while(1) {OLED_Fill(0xff);sleep(1);OLED_CLS();sleep(1);OLED_ShowStr(0,0, (unsignedchar*)"Bobbma",2);OLED_ShowStr(0,3, (unsignedchar*)"Welcome to",1);OLED_ShowStr(0,4, (unsignedchar*)"Loongson world!",2);sleep(1);OLED_CLS();for(i =0; i <4; i++) {OLED_ShowCN(22+ i *16,0, i);}for(i =0; i <7; i++) {OLED_ShowCN(i *16,3, i+4);}for(i =0; i <7; i++) {OLED_ShowCN(i *16,5, i+11);}sleep(1);OLED_CLS();}close(fd); }
- makefile文件
Target = oled_demo ARCH = loongarch CC = loongarch64-linux-gnu-gcc build_dir = build_$(ARCH)src_dir = sources inc_dir = includes . sources =$(foreachdir,$(src_dir),$(wildcard$(dir)/*.c)) objects =$(patsubst%.c,$(build_dir)/%.o,$(notdir$(sources))) includes =$(foreachdir,$(inc_dir),$(wildcard$(dir)/*.h)) CFLAGS =$(patsubst%, -I%,$(inc_dir))$(build_dir)/$(Target):$(objects)| create_build$(CC)$^-o$@$(build_dir)/%.o :$(src_dir)/%.c$(includes)| create_build$(CC)-c$(CFLAGS)$<-o$@.PHONY:clean cleanall check create_buildclean:rm -rf$(build_dir)cleanall:rm -rf build_x86 build_armcheck:[url=home.php?mod=space&uid=70594]@echo[/url]$(CFLAGS)@echo$(CURDIR)@echo$(src_dir)@echo$(sources)@echo$(objects)create_build:[url=home.php?mod=space&uid=2293869]@MKDIR[/url] -p$(build_dir)
三. 测试实验
将编译生成的文件拷贝到龙芯2K0300蜂鸟板中,执行操作演示如下视频所示。