【点灯鼠教程】K210裸机点灯之旅(1)点亮SSD1306【C开发I2C】
万物基于点灯
——沃兹基硕德
点灯,I2C点灯
就像正常点灯一样,打开勘智IDE,大地球,礼物,find i2c,None。。。
果断下载GPIO,打开百度!
还是None?
自己动手!
API,I2C
翻开手册145页,大写的i2c映入眼前
> 145第14章集成电路内置总线(I²C)
API参考对应的头文件i2c.h为用户提供以下接口
• i2c_init
• i2c_init_as_slave
• i2c_send_data
• i2c_send_data_dma
• i2c_recv_data
• i2c_recv_data_dma
下单I2C_INIT,I2C_SEND_DATA,开始点灯!
码代码,堆积木
注册io6,io8 为i2c0地址线(可以使用ide一键配置,见ide使用)
ret += fpioa_set_function(6, FUNC_I2C0_SCLK);
ret += fpioa_set_function(8, FUNC_I2C0_SDA);
初始化I2C,配置I²C器件从地址、寄存器位宽度和I²C速率。
i2c_init(I2C_DEVICE_0, SSD1306_I2C_ADDR, 7, 400000);
问题出现了,ADDR地址多少?百度,0x78,完美,,,,,?恭喜你进入了第一个大坑
K210的SLK扫描不到最后一位地址——来自某热心群友的分享
折腾了一天一夜,最后祭出 MaixPy (MaixPy大法好)
i2c.scan()
>>>60
60=0x3c=0x78/2(RX78-2?不由自主幻视)
果然是有一位没读到。。
点灯!点1306!
打开1306手册,一堆文字。
果断关掉,打开百度打开maixpy,果然有现成 例程 (才发现这个例程已经给出addr地址 SSD1306_ADDR = 0x3c了,所以白忙活了一天?)
开始移植。。。1.。。2.。。3.。。。
移植好了
uint8 buff[2] = {0x00, 0x01};
void SSD1306_WriteCmd(uint8 cmd) {buff[0] = 0x00;buff[1] = cmd;i2c_send_data(I2C_DEVICE_0, buff, 2); // cmd// i2c_send_data(SSD1306_I2C_ADDR, cmd, 1);
}void SSD1306_WriteData(uint8 data) {buff[0] = 0x40;buff[1] = data;i2c_send_data(I2C_DEVICE_0, buff, 2); // cmd
}
// SSD1306初始化
void OLED_Init(void) {// SSD1306复位之后,默认的是页寻址方式SSD1306_WriteCmd(0xAE); //--display offSSD1306_WriteCmd(0x00); //--set low column addressSSD1306_WriteCmd(0x10); //--set high column addressSSD1306_WriteCmd(0x40); //--set start line addressSSD1306_WriteCmd(0xB0); //--set page addressSSD1306_WriteCmd(0x81); // contract controlSSD1306_WriteCmd(0xFF); //--128SSD1306_WriteCmd(0xA1); // set segment re-map 0 to 127SSD1306_WriteCmd(0xA6); // set normal displaySSD1306_WriteCmd(0xA8); // set multiplex ratio(1 to 64)SSD1306_WriteCmd(0x3F); //--1/32 dutySSD1306_WriteCmd(0xC8); // Com scan directionSSD1306_WriteCmd(0xD3); // set display offsetSSD1306_WriteCmd(0x00); // no offsetSSD1306_WriteCmd(0xD5); // set display clock divide ratio/oscillator// frequencySSD1306_WriteCmd(0x80); //SSD1306_WriteCmd(0xD8); // set area color mode offSSD1306_WriteCmd(0x05); //SSD1306_WriteCmd(0xD9); // Set Pre-Charge PeriodSSD1306_WriteCmd(0xF1); //SSD1306_WriteCmd(0xDA); // set com pin hardware configuartionSSD1306_WriteCmd(0x12); //SSD1306_WriteCmd(0xDB); // set VcomhSSD1306_WriteCmd(0x30); // 0x20,0.77xVccSSD1306_WriteCmd(0x8D); // set charge pump enableSSD1306_WriteCmd(0x14); //SSD1306_WriteCmd(0xAF); //--turn on oled panel
}//坐标设置:也就是在哪里显示
void OLED_SetPos(uint8 x, uint8 y) {//以下3个寄存器只在页寻址的模式下有效SSD1306_WriteCmd(0xb0 + y); //页地址设置 0xb0~0xb7SSD1306_WriteCmd(((x & 0xf0) >> 4) | 0x10); //列高位地址设置SSD1306_WriteCmd((x & 0x0f)); //列低位地址设置
}//开启OLED显示
void OLED_DisplayOn(void) {SSD1306_WriteCmd(0X8D); // SET DCDC命令SSD1306_WriteCmd(0X14); // DCDC ONSSD1306_WriteCmd(0XAF); // DISPLAY ON
}//关闭OLED显示
void OLED_DisplayOff(void) {SSD1306_WriteCmd(0X8D); // SET DCDC命令SSD1306_WriteCmd(0X10); // DCDC OFFSSD1306_WriteCmd(0XAE); // DISPLAY OFF
}//清屏函数,清完屏,整个屏幕是黑色的!和没点亮一样
void OLED_Clear(void) {uint8 i, n;for (i = 0; i < 8; i++) {SSD1306_WriteCmd(0xb0 + i); //设置页地址(0~7)SSD1306_WriteCmd(0x00); //设置显示位置—列低地址SSD1306_WriteCmd(0x10); //设置显示位置—列高地址for (n = 0; n < 128; n++) SSD1306_WriteData(0);} //更新显示
}
好吧哪有那么无聊一个一个移植。这里使用的是freemote的 一文彻底了解SSD1306驱动0.96寸OLED
通过修改I2C的入口,绑定到K210的I2C上,代码就可以直接使用了(这才是写代码的好习惯,只需要修改入口,就可以轻松移植代码,而不是将代码与设备深度绑定,修改代码要从内部一点一点改)
修改方法如下,重写WriteCmd和WriteData
typedef __uint8_t uint8;
uint8 buff[2] = {0x00, 0x01};
void SSD1306_WriteCmd(uint8 cmd) {buff[0] = 0x00;buff[1] = cmd;i2c_send_data(I2C_DEVICE_0, buff, 2); // cmd// i2c_send_data(SSD1306_I2C_ADDR, cmd, 1);
}void SSD1306_WriteData(uint8 data) {buff[0] = 0x40;buff[1] = data;i2c_send_data(I2C_DEVICE_0, buff, 2); // cmd
}void SSD1306_WriteData(uint8 data) {
buff[0] = 0x40;
buff[1] = data;
i2c_send_data(I2C_DEVICE_0, buff, 2); // cmd
}
入口修改好了,接下来就该点灯了。
测试!听从我的呼唤,闪烁吧,1306!
从maixpy移植oled_fill()进行测试:
void oled_fill(uint8 data) {uint8 x, y;for (x = 0; x < 8; x++) {SSD1306_WriteCmd(0xb0 + x);SSD1306_WriteCmd(0x10);SSD1306_WriteCmd(0x01);for (y = 0; y < 128; y++) {SSD1306_WriteData(data);}}
}
主函数输入
i2c_init(I2C_DEVICE_0, SSD1306_I2C_ADDR, 7, 400000);OLED_Init();oled_fill(0xff);OLED_DisplayOn();
一次点亮!效果如下:
尾章,打印字符
点灯的最终目的是打印字符,画图出来。由于精力有限,目前只测试了字符,画图还等后续。
代码占空间,就不发了,将以附件形式上传整个工程。
先看看效果吧:
![](/assets/blank.gif)
文章来源于Sipeed点灯鼠,原文链接:https://bbs.sipeed.com/thread/588
搬运请注明原文地址
【点灯鼠教程】K210裸机点灯之旅(1)点亮SSD1306【C开发I2C】相关推荐
- K210裸机点灯之旅(1)点亮SSD1306【c开发i2c】
万物基于点灯 --沃兹基硕德 点灯,I2C点灯 就像正常点灯一样,打开勘智IDE,大地球,礼物,find i2c,None... 果断下载GPIO,打开百度! 还是None? 自己动手! API,I2 ...
- Orange pi GPIO输出控制,裸机点灯大法(二)!
文章目录 Orange pi GPIO输出控制方式 前言 1.OPi.GPIO安装及使用 2.引脚编号 3.WiringOP-Zero-Python安装及使用 4.WiringOP-Zero 安装及使 ...
- Orange pi GPIO输出控制,裸机点灯大法(一)!
裸机点灯大法 玩树莓派或者香橙派,如果不玩裸机点灯,那岂不是不完整.所谓裸机点灯,即一块裸板,通过gpio输出控制,实现控制板载绿色的电源指示灯以及红色的状态指示灯 裸机点灯(GPIO输出控制)的两种 ...
- Maix Bit(K210) 裸机开发教程(七) SD卡文件系统使用
SD卡使用 1.代码获取 2.代码修改 3. SD卡常用API 4.修改 5.效果展示 K210 裸机使用SD卡,下图是SD卡接口 1.代码获取 在我前面一篇博客里面简述了代码如何下载以及使用.htt ...
- python同时监控键鼠教程
小白也能看懂的python同时监控键鼠教程 虽然pynupt模块也可以实现,但监控不完全(主要是不会) 这里我主要使用多个模块来实现互不冲突的监控 首先用到的模块就是threading#使键鼠监控同时 ...
- 计算机主机装机步骤,电脑组装步骤详细教程之裸机点亮 再将DIY硬件装入主机箱...
对于装机小白来说,如果没有DIY装机经验,那么装机还是有难度的,甚至不知道哪个硬件安装到哪里.不过如果有电脑组装教程的话,我们可以根据装机教程一步一步组装即可.下面装机之家为大家分享一个电脑组装教程, ...
- C#发现之旅第一讲 C#-XML开发
C#发现之旅第一讲 C#-XML开发 袁永福 2008-5-15 系列课程说明 为了让大家更深入的了解和使用C#,我们将开始这一系列的主题为"C#发现之旅"的技术讲座.考虑 ...
- MultiRow发现之旅(六)- 使用MultiRow开发票据应用(附源码)
前文回顾 MultiRow发现之旅(一)- 高效模板设计器 MultiRow发现之旅(二)- 详解属性管理器 MultiRow发现之旅(三)- 模板管理器和Table MultiRow发现之旅(四)- ...
- C#发现之旅第二讲 C#-XSLT开发
C#发现之旅第二讲 C#-XSLT开发 袁永福 2008-5-15 系列课程说明 为了让大家更深入的了解和使用C#,我们开始这一系列的主题为"C#发现之旅"的技术讲座.考虑 ...
最新文章
- 去除iphone图标的半弧高亮效果
- iOS10 权限崩溃问题
- UNIX再学习 -- TCP/UDP 客户机/服务器
- 【转】Asp.net的生命周期应用之IHttpModule和IHttpHandler
- 中国内镜下血管采集市场趋势报告、技术动态创新及市场预测
- mysql与mysqli
- Excel导出xml
- IE地址栏可输入的最大字符数
- 基于OpenCV DNN模块给黑白老照片上色(附Python/C++源码)
- io vivado 怎么查看ps_基于Vivado的嵌入式开发 ——PS+PL实践
- 双非计算机专业考研失败总结
- PID控制算法实践应用(一):PID算法的离散化
- 如何最用最懒的方式获取百度地图的行政区边界坐标范围
- android的资源混淆,android混淆资源引发的血案以及学习感受资源混淆
- CVPR2021 | 2D目标检测论文解读
- GBase 8a GDCA认证之GBase 8a初认识
- sql依据单个字段去重_sql如何去重查询
- 正则匹配过滤空格字符串
- 2020大学生网络安全知识竞赛总决赛模拟卷易错题集(5)
- table 表格自动计算
热门文章
- bugfree安装中mysql未安装,BugFree怎么安装使用,BugFree安装使用教程
- java set子集_Java 求集合的所有子集
- 秒杀程序调试-环境搭建
- SpringMVC(一):SpringMVC简介、入门案例
- oracle查看rac主备,Oracle数据库RAC 主备切换文档
- 菜鸟程序员内功心法--C++(核心编程)
- 隐马尔可夫模型(HMM) - 2 - 概率计算方法
- D. Same Count One div1+div2
- 守护线程是什么?守护线程和非守护线程的区别是?守护线程的作用是?
- 什么是浮动路由及作用