RTT_0.96寸OLED_IIC驱动
1、前言
emm,这种应用跟rtt没多大关系,iic驱动也就是用到了其中的rt_i2c_transfer,不过还是写一下吧。
oled就是挺常见的,0.96寸,128*64的屏,用IIC接口驱动。
就算是从淘宝买的屏,商家也会有资料,各平台的例程,打开stm32的例程作为移植到现在代码的参考。
下面是如何向OLED写命令、写数据的代码、初始化OLED、某个位置显示字符串、显示整数、小数;
如果要画点、画线这样涉及到某个像素点的,还需要1M的缓存,[128][8]去保存当前屏幕的数据,更新这个数组然后再写。
2、铺路代码
2.1、向OLED写命令
//对OLED写某个命令cmd
static rt_err_t oled_write_cmd(uint8_t cmd)
{struct rt_i2c_msg msg;uint8_t buffer[2]={OLED_CMD_CMD,cmd};msg.addr = OLED_I2C_ADDR;msg.flags = RT_I2C_WR;msg.buf = buffer;msg.len = 2;if(rt_i2c_transfer(i2c_bus, &msg, 1) != 1){return RT_ERROR;}return RT_EOK;
}
2.2、向OLED写数据
//对OLED写数据data
static rt_err_t oled_write_data(uint8_t data)
{struct rt_i2c_msg msg;uint8_t buffer[2]={OLED_CMD_DATA,data};msg.addr = OLED_I2C_ADDR;msg.flags = RT_I2C_WR;msg.buf = buffer;msg.len = 2;if(rt_i2c_transfer(i2c_bus, &msg, 1) != 1){return RT_ERROR;}return RT_EOK;
}
2.3、设置OLED地址
//设置起始点坐标128*64
void oled_set_pos(uint8_t x,uint8_t y)
{oled_write_cmd(0xb0+y);oled_write_cmd(((x&0xf0)>>4)|0x10);oled_write_cmd((x&0x0f));
}
3、初始化OLED
- 首先要选择IIC,配置SCL和SDA的引脚,rt_device_find打开IIC设备。
- 根据卖家例程,上电需要延时、然后有一系列的命令、最后清屏。
//清屏
void oled_clear()
{uint8_t row,col;for(row = 0;row < 8;row++){oled_write_cmd(0xb0+row); //page0-page1oled_write_cmd(0x00); //low column start addressoled_write_cmd(0x10); //high column start addressfor(col=0;col<128;col++){oled_write_data(0x00);}}
}//OLED初始化
void oled_init()
{rt_thread_mdelay(100); //上电必须延时oled_write_cmd(0xAE); //display offoled_write_cmd(0x20); //Set Memory Addressing Modeoled_write_cmd(0x10); //00,Horizontal Addressing Mode;01,Vertical Addressing Mode;10,Page Addressing Mode (RESET);11,Invalidoled_write_cmd(0xb0); //Set Page Start Address for Page Addressing Mode,0-7oled_write_cmd(0xc8); //Set COM Output Scan Directionoled_write_cmd(0x00); //---set low column addressoled_write_cmd(0x10); //---set high column addressoled_write_cmd(0x40); //--set start line addressoled_write_cmd(0x81); //--set contrast control registeroled_write_cmd(0xff); //亮度调节 0x00~0xffoled_write_cmd(0xa1); //--set segment re-map 0 to 127oled_write_cmd(0xa6); //--set normal displayoled_write_cmd(0xa8); //--set multiplex ratio(1 to 64)oled_write_cmd(0x3F); //oled_write_cmd(0xa4); //0xa4,Output follows RAM content;0xa5,Output ignores RAM contentoled_write_cmd(0xd3); //-set display offsetoled_write_cmd(0x00); //-not offsetoled_write_cmd(0xd5); //--set display clock divide ratio/oscillator frequencyoled_write_cmd(0xf0); //--set divide ratiooled_write_cmd(0xd9); //--set pre-charge periodoled_write_cmd(0x22); //oled_write_cmd(0xda); //--set com pins hardware configurationoled_write_cmd(0x12);oled_write_cmd(0xdb); //--set vcomholed_write_cmd(0x20); //0x20,0.77xVccoled_write_cmd(0x8d); //--set DC-DC enableoled_write_cmd(0x14); //oled_write_cmd(0xaf); //--turn on oled paneloled_clear(); //清屏
}
rt_err_t oled_iic_startup()
{//查找I2C总线设备,获取I2C总线设备句柄i2c_bus = (struct rt_i2c_bus_device *)rt_device_find(OLED_I2C_BUS_NAME);if (i2c_bus == RT_NULL){LOG_D("can't find device!\n");return RT_ERROR;}//OLED初始化oled_init();return RT_EOK;
}
4、显示
4.1、字符串
//参数 : x,y:起始点坐标:(x:0~127, y:0~7);
// ch[]:要显示的字符串;
// TextSize:字符大小:(FONT_6x8代表6*8 ; FONT_8x16代表8*16)
void oled_show_string(uint8_t x, uint8_t y, uint8_t ch[], uint8_t TextSize)
{uint8_t c = 0,i = 0,j = 0;switch(TextSize){case FONT_6x8:{while(ch[j] != '\0'){ //循环到字符串末尾c = ch[j] - 32;if(x > 128-6){x = 0; y++; //当前行显示不完,自动转到下一行if(y==8) break; //超出显示范围,退出}oled_set_pos(x,y);for(i=0;i<6;i++) //显示一个字符oled_write_data(F6x8[c][i]);x += 6; //下一个位置j++;}}break;case FONT_8x16:{while(ch[j] != '\0'){c = ch[j] - 32;if(x > 128-8){x = 0; y++;if(y==7) break; //超出显示范围,退出}oled_set_pos(x,y);for(i=0;i<8;i++) //显示一个字符oled_write_data(F8X16[c*16+i]);oled_set_pos(x,y+1);for(i=0;i<8;i++)oled_write_data(F8X16[c*16+i+8]);x += 8;j++;}}break;}
}
4.2、整数、小数(根据情况修改小数点后保留几位)
void oled_show_num(uint8_t x, uint8_t y, uint16_t num, uint8_t TextSize)
{uint8_t buffer[10];rt_snprintf(buffer,10,"%d",num);oled_show_string(x,y,buffer,TextSize);}
void oled_show_double(uint8_t x, uint8_t y, double num, uint8_t TextSize)
{uint8_t buffer[20];rt_snprintf(buffer,20,"%f",num);oled_show_string(x,y,buffer,TextSize);}
RTT_0.96寸OLED_IIC驱动相关推荐
- 0.96寸OLED驱动(基于STM32f103)
最近入手了一块0.96寸的oled,一直在用给的例程,想自己从底层写一下驱动,了解oled的初始化流程和控制 注:本文只涉及oled的初始化,如果需要显示GUI或者图片,汉字,需要使用库或者自己更进一 ...
- STM32V107VCT6,基于HAL库的用IO口模拟I2C的0.96寸OLED驱动
前言 作为一个初学者,当然希望有比较好的范例可以学习,但在CSDN和众多家的单片机学习网站,没发现现成的I2C模拟接口的HAL库的0.96寸的OLED驱动,经过努力,把这个代码调试出来,为此,基于技术 ...
- STM32 HAL 库0.96寸oledSSD1306 驱动
看到网上的ssd1306初始化都一个样.我自己写了一个锻炼一下编程和看英文文档的能力顺便熟悉下hal库 这个是Google上找的官方初始流程不得不说百度和中文文档是阉割版后面直接少了这个关键的东西害的 ...
- 合宙 ESP32C3 使用micropython 驱动配套0.96寸 TFT ST7735 屏幕显示色块和文字
合宙的esp32c3 开发板配套了0.96寸屏幕驱动板,可直接使用如下链接的代码.注意替换对应的pin脚和st7735.py文件 1. 想显示色块参考如下链接: 链接: 合宙esp32c3+合宙air ...
- FPGA驱动0.96寸OLED(SSD1306)
目录 一.七针0.96寸OLED驱动原理 二.SSD1306驱动时序 1.GDDRAM内部结构: (1)页寻址 (2)水平寻址 (3)垂直寻址 2.初始化 3.清屏 4.发送数据 三.子模块源码 1. ...
- 0.96寸OLED显示屏介绍
OLED显示屏简介 OLED,即有机发光二极管(Organic Light Emitting Diode).OLED 由于同时具备自发光,不需背光源.对比度高.厚度薄.视角广.反应速度快.可用于挠曲性 ...
- stm32学习记录之0.96寸OLED显示屏配置
目录 0.96寸oled屏概述 工程实现 GPIO初始化 SSD1306 初始化 启动与停止函数 各个功能函数 0.96寸oled屏概述 本次实验所用oled显示屏为黄蓝屏,即屏上1/4 部分为黄光, ...
- 【0.96寸 OLED屏实现1500Fps的帧率】STM32 软件、硬件SPI、I2C驱动总结
目录 SPI版 OLED SPI 端口定义 七针OLED引脚定义 六针OLED引脚定义 软件SPI 硬件SPI 启用DMA 帧率测试 I2C 版 软件I2C 硬件I2C DMA STM32F103VE ...
- 用esp8266驱动0.96寸OLED屏幕 太空人动画
昨天闲来没事玩了一下OLED屏幕 之前只是做过显示图片 还没弄过动画的 (其实差不多–) 用esp8266驱动0.96寸LED屏幕 太空人动画 入门esp8266 看这篇文章 参考https://bl ...
最新文章
- c语言编译开头,#includestdio.h,为什么C语言代码开头都有这一行?
- css3 各种纸张贴纸效果
- pytest框架安装(MacOS)
- Java 访问RabbitMQ
- 93号涨0.86元售6.2元/升 20日油价正式上调
- Raft成员变更的工程实践
- python lxml使用_使用lxml和Python进行Web抓取的简介
- 通过系统进程查找sql语句
- 代码生成器 Freemaker
- java多线程框架 netty,JavaSocket编程之Netty框架线程模型
- 移动热修复Sophix之初体验
- Team Foundation Server 2013 with Update 3 Install LOG
- 联系人管理系统 Python GUI版
- 语音识别到底是怎么一回事?学习门槛真的那么高么?
- 以HT82K629B为主控的程序员专用CV键盘(无需代码烧写)
- QQ群怎么快速封群,如何举报骗子QQ群可以使之封群?
- 【群体遗传】Fst(群体间分化指数)
- jenkins自动化打包android,Android使用Jenkins实现自动化打包
- vue-cli3的项目 CDN链接报错解决 Uncaught TypeError: Cannot read property 'prototype' of undefined at Object.
- tiktok广告推广怎么能精准展现?什么行业适合在tiktok投放广告?
热门文章
- 点灯游戏原生JS实现与jQuery实现
- armeabi-v7a armeabi arm64-v8a 有何区别 ,英雄不问出处
- 51单片机 串口12864显示驱动
- oracle连接plsql和instantclient版本都对是64位,依然不能初始化oci.dll解决办法
- 【Mac】macOS无法验证此App不包含恶意软件 解决方法
- 个人微信订阅号(公众号)的注册流程
- 朴素贝叶斯(Naive Bayes)和校正曲线(Calibration Curve)
- 联想计算机的未来发展,2019联想创新科技大会:为每一个智能未来
- 基于物联网技术的智能温室大棚设计
- 第十一周项目四算星座