【点灯鼠教程】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();
一次点亮!效果如下:
尾章,打印字符
点灯的最终目的是打印字符,画图出来。由于精力有限,目前只测试了字符,画图还等后续。
代码占空间,就不发了,将以附件形式上传整个工程。
先看看效果吧:
文章来源于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#发现之旅"的技术讲座.考虑 ...
最新文章
- HTML里面设置文本倒影,文字倒影怎么做
- DSP调试报错:OMAPL138 Connect to PRSC failed
- 推送提交到另一个分支
- 从Java到Kotlin(五)
- [转]十问 Linux 虚拟内存管理 (glibc)
- qt 将不同的数据类型组成一个新类型_SQL 通用数据类型
- s3c2440内存控制器与SDRAM基本测试
- 【初学线段树,看这篇文章准没错】线段树(单点修改and区间修改)acm寒假集训日记22/1/10
- mysql l查看历史等锁信息_mysql查看锁等信息SQL
- 搭建一个项目的准备工作
- 解决atom安装emmet的问题
- IOS判断用邮箱登录验证是不是合法的方法
- c primer plus 第七章 第十题
- 港澳台手机号正则表达式
- xp系统共享文件夹免密码访问设置
- Java小题精炼训练营(篇十三)
- 周鸿祎亲自站台,360年度新旗舰究竟有何特别?
- 男人就应该对自己狠一点
- 胆囊息肉,需要切除吗
- 【前端面试题】前端基础 | 八股文 | HTTP网络 | Vue | React