万物基于点灯

——沃兹基硕德

点灯,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】相关推荐

  1. K210裸机点灯之旅(1)点亮SSD1306【c开发i2c】

    万物基于点灯 --沃兹基硕德 点灯,I2C点灯 就像正常点灯一样,打开勘智IDE,大地球,礼物,find i2c,None... 果断下载GPIO,打开百度! 还是None? 自己动手! API,I2 ...

  2. Orange pi GPIO输出控制,裸机点灯大法(二)!

    文章目录 Orange pi GPIO输出控制方式 前言 1.OPi.GPIO安装及使用 2.引脚编号 3.WiringOP-Zero-Python安装及使用 4.WiringOP-Zero 安装及使 ...

  3. Orange pi GPIO输出控制,裸机点灯大法(一)!

    裸机点灯大法 玩树莓派或者香橙派,如果不玩裸机点灯,那岂不是不完整.所谓裸机点灯,即一块裸板,通过gpio输出控制,实现控制板载绿色的电源指示灯以及红色的状态指示灯 裸机点灯(GPIO输出控制)的两种 ...

  4. Maix Bit(K210) 裸机开发教程(七) SD卡文件系统使用

    SD卡使用 1.代码获取 2.代码修改 3. SD卡常用API 4.修改 5.效果展示 K210 裸机使用SD卡,下图是SD卡接口 1.代码获取 在我前面一篇博客里面简述了代码如何下载以及使用.htt ...

  5. python同时监控键鼠教程

    小白也能看懂的python同时监控键鼠教程 虽然pynupt模块也可以实现,但监控不完全(主要是不会) 这里我主要使用多个模块来实现互不冲突的监控 首先用到的模块就是threading#使键鼠监控同时 ...

  6. 计算机主机装机步骤,电脑组装步骤详细教程之裸机点亮 再将DIY硬件装入主机箱...

    对于装机小白来说,如果没有DIY装机经验,那么装机还是有难度的,甚至不知道哪个硬件安装到哪里.不过如果有电脑组装教程的话,我们可以根据装机教程一步一步组装即可.下面装机之家为大家分享一个电脑组装教程, ...

  7. C#发现之旅第一讲 C#-XML开发

    C#发现之旅第一讲 C#-XML开发 袁永福 2008-5-15 系列课程说明     为了让大家更深入的了解和使用C#,我们将开始这一系列的主题为"C#发现之旅"的技术讲座.考虑 ...

  8. MultiRow发现之旅(六)- 使用MultiRow开发票据应用(附源码)

    前文回顾 MultiRow发现之旅(一)- 高效模板设计器 MultiRow发现之旅(二)- 详解属性管理器 MultiRow发现之旅(三)- 模板管理器和Table MultiRow发现之旅(四)- ...

  9. C#发现之旅第二讲 C#-XSLT开发

    C#发现之旅第二讲 C#-XSLT开发 袁永福 2008-5-15 系列课程说明     为了让大家更深入的了解和使用C#,我们开始这一系列的主题为"C#发现之旅"的技术讲座.考虑 ...

最新文章

  1. HTML里面设置文本倒影,文字倒影怎么做
  2. DSP调试报错:OMAPL138 Connect to PRSC failed
  3. 推送提交到另一个分支
  4. 从Java到Kotlin(五)
  5. [转]十问 Linux 虚拟内存管理 (glibc)
  6. qt 将不同的数据类型组成一个新类型_SQL 通用数据类型
  7. s3c2440内存控制器与SDRAM基本测试
  8. 【初学线段树,看这篇文章准没错】线段树(单点修改and区间修改)acm寒假集训日记22/1/10
  9. mysql l查看历史等锁信息_mysql查看锁等信息SQL
  10. 搭建一个项目的准备工作
  11. 解决atom安装emmet的问题
  12. IOS判断用邮箱登录验证是不是合法的方法
  13. c primer plus 第七章 第十题
  14. 港澳台手机号正则表达式
  15. xp系统共享文件夹免密码访问设置
  16. Java小题精炼训练营(篇十三)
  17. 周鸿祎亲自站台,360年度新旗舰究竟有何特别?
  18. 男人就应该对自己狠一点
  19. 胆囊息肉,需要切除吗
  20. 【前端面试题】前端基础 | 八股文 | HTTP网络 | Vue | React

热门文章

  1. 兼容主流浏览器的网页闹钟
  2. ad域服务器站点,如何变更站点 AD 域服务器IP地址
  3. 从Apple 播客预览下载音乐到本地目录
  4. 在.net项目中生成的pdb是什么文件?
  5. (转)人生的十二种财富
  6. loading怎么关闭 vant_页面loading解决方案
  7. mapbox尝鲜值之云图动画
  8. 一百个和尚一百个馒头问题
  9. 真题讲解(软件维护工具、水晶法)-软件设计(四十)
  10. docker pull通过http代理服务拉取镜像docker配置通过私库拉取镜像