预备知识

1. I2C基本原理

2. SH1106通过I2C读写

OLED初始化

#define OLED_CMD  0
#define OLED_DATA 1/**********************************************
// IIC Write Command
**********************************************/
void Write_IIC_Command(unsigned char IIC_Command)//只提供伪代码,具体实现依赖于HW
{IIC_Start();Set_Slave_Adr(0x3C);            //Slave address,具体看OLED pin脚设置Set_Dir = Write;IIC_Wait_Ack(); Write_IIC_Byte(0x00);           //write commandIIC_Wait_Ack();  Write_IIC_Byte(IIC_Command); IIC_Wait_Ack();    IIC_Stop();
}
/**********************************************
// IIC Write Data
**********************************************/
void Write_IIC_Data(unsigned char IIC_Data)
{IIC_Start();Write_IIC_Byte(0x78);          //IIC_Wait_Ack();   Write_IIC_Byte(0x40);           //write dataIIC_Wait_Ack(); Write_IIC_Byte(IIC_Data);IIC_Wait_Ack();    IIC_Stop();
}void OLED_WR_Byte(unsigned dat,unsigned cmd)
{if(cmd){Write_IIC_Data(dat);}else{Write_IIC_Command(dat);}}void OLED_Set_Pos(unsigned char x, unsigned char y)
{OLED_WR_Byte(0xb0+y,OLED_CMD);OLED_WR_Byte((((x+2)&0xf0)>>4)|0x10,OLED_CMD);OLED_WR_Byte(((x+2)&0x0f),OLED_CMD);
}void OLED_Clear(void)
{U8 i,n;for(i=0;i<8;i++){OLED_WR_Byte (0xb0+i,OLED_CMD);    //设置页地址(0~7)OLED_WR_Byte (0x02,OLED_CMD);      //设置显示位置—列低地址OLED_WR_Byte (0x10,OLED_CMD);      //设置显示位置—列高地址for(n=0;n<128;n++)OLED_WR_Byte(0,OLED_DATA);} //更新显示
}void OLED_All(void)
{U8 i,n;for(i=0;i<8;i++){OLED_WR_Byte (0xb0+i,OLED_CMD);OLED_WR_Byte (0x02,OLED_CMD);OLED_WR_Byte (0x10,OLED_CMD);for(n=0;n<128;n++)OLED_WR_Byte(0xff,OLED_DATA);}
}void OLED_Init(void)
{OLED_WR_Byte(0xAE,OLED_CMD);//--turn off oled panelOLED_WR_Byte(0x02,OLED_CMD);//---set low column addressOLED_WR_Byte(0x10,OLED_CMD);//---set high column addressOLED_WR_Byte(0x40,OLED_CMD);//--set start line address  Set Mapping RAM Display Start Line (0x00~0x3F)OLED_WR_Byte(0x81,OLED_CMD);//--set contrast control registerOLED_WR_Byte(0xCF,OLED_CMD); // Set SEG Output Current BrightnessOLED_WR_Byte(0xA1,OLED_CMD);//--Set SEG/Column Mapping     0xa0左右反置 0xa1正常     //????OLED_WR_Byte(0xC8,OLED_CMD);//Set COM/Row Scan Direction   0xc0上下反置 0xc8正常    ///????OLED_WR_Byte(0xA6,OLED_CMD);//--set normal displayOLED_WR_Byte(0xA8,OLED_CMD);//--set multiplex ratio(1 to 64)OLED_WR_Byte(0x3f,OLED_CMD);//--1/64 dutyOLED_WR_Byte(0xD3,OLED_CMD);//-set display offset   Shift Mapping RAM Counter (0x00~0x3F)OLED_WR_Byte(0x00,OLED_CMD);//-not offsetOLED_WR_Byte(0xd5,OLED_CMD);//--set display clock divide ratio/oscillator frequencyOLED_WR_Byte(0x80,OLED_CMD);//--set divide ratio, Set Clock as 100 Frames/SecOLED_WR_Byte(0xD9,OLED_CMD);//--set pre-charge periodOLED_WR_Byte(0xF1,OLED_CMD);//Set Pre-Charge as 15 Clocks & Discharge as 1 ClockOLED_WR_Byte(0xDA,OLED_CMD);//--set com pins hardware configurationOLED_WR_Byte(0x12,OLED_CMD);OLED_WR_Byte(0xDB,OLED_CMD);//--set vcomhOLED_WR_Byte(0x40,OLED_CMD);//Set VCOM Deselect LevelOLED_WR_Byte(0xA4,OLED_CMD);// Disable Entire Display On (0xa4/0xa5)OLED_WR_Byte(0xA6,OLED_CMD);// Disable Inverse Display On (0xa6/a7)OLED_WR_Byte(0xAF,OLED_CMD);//--turn on oled panelOLED_Clear();OLED_Set_Pos(0,0);
}

字符/字符串显示

/************************************6*8的点阵************************************/
const unsigned char F6x8[][6] =
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00,// sp0x00, 0x00, 0x00, 0x2f, 0x00, 0x00,// !0x00, 0x00, 0x07, 0x00, 0x07, 0x00,// "0x00, 0x14, 0x7f, 0x14, 0x7f, 0x14,// #0x00, 0x24, 0x2a, 0x7f, 0x2a, 0x12,// $0x00, 0x62, 0x64, 0x08, 0x13, 0x23,// %0x00, 0x36, 0x49, 0x55, 0x22, 0x50,// &0x00, 0x00, 0x05, 0x03, 0x00, 0x00,// '0x00, 0x00, 0x1c, 0x22, 0x41, 0x00,// (0x00, 0x00, 0x41, 0x22, 0x1c, 0x00,// )0x00, 0x14, 0x08, 0x3E, 0x08, 0x14,// *0x00, 0x08, 0x08, 0x3E, 0x08, 0x08,// +0x00, 0x00, 0x00, 0xA0, 0x60, 0x00,// ,0x00, 0x08, 0x08, 0x08, 0x08, 0x08,// -0x00, 0x00, 0x60, 0x60, 0x00, 0x00,// .0x00, 0x20, 0x10, 0x08, 0x04, 0x02,// /0x00, 0x3E, 0x51, 0x49, 0x45, 0x3E,// 00x00, 0x00, 0x42, 0x7F, 0x40, 0x00,// 10x00, 0x42, 0x61, 0x51, 0x49, 0x46,// 20x00, 0x21, 0x41, 0x45, 0x4B, 0x31,// 30x00, 0x18, 0x14, 0x12, 0x7F, 0x10,// 40x00, 0x27, 0x45, 0x45, 0x45, 0x39,// 50x00, 0x3C, 0x4A, 0x49, 0x49, 0x30,// 60x00, 0x01, 0x71, 0x09, 0x05, 0x03,// 70x00, 0x36, 0x49, 0x49, 0x49, 0x36,// 80x00, 0x06, 0x49, 0x49, 0x29, 0x1E,// 90x00, 0x00, 0x36, 0x36, 0x00, 0x00,// :0x00, 0x00, 0x56, 0x36, 0x00, 0x00,// ;0x00, 0x08, 0x14, 0x22, 0x41, 0x00,// <0x00, 0x14, 0x14, 0x14, 0x14, 0x14,// =0x00, 0x00, 0x41, 0x22, 0x14, 0x08,// >0x00, 0x02, 0x01, 0x51, 0x09, 0x06,// ?0x00, 0x32, 0x49, 0x59, 0x51, 0x3E,// @0x00, 0x7C, 0x12, 0x11, 0x12, 0x7C,// A0x00, 0x7F, 0x49, 0x49, 0x49, 0x36,// B0x00, 0x3E, 0x41, 0x41, 0x41, 0x22,// C0x00, 0x7F, 0x41, 0x41, 0x22, 0x1C,// D0x00, 0x7F, 0x49, 0x49, 0x49, 0x41,// E0x00, 0x7F, 0x09, 0x09, 0x09, 0x01,// F0x00, 0x3E, 0x41, 0x49, 0x49, 0x7A,// G0x00, 0x7F, 0x08, 0x08, 0x08, 0x7F,// H0x00, 0x00, 0x41, 0x7F, 0x41, 0x00,// I0x00, 0x20, 0x40, 0x41, 0x3F, 0x01,// J0x00, 0x7F, 0x08, 0x14, 0x22, 0x41,// K0x00, 0x7F, 0x40, 0x40, 0x40, 0x40,// L0x00, 0x7F, 0x02, 0x0C, 0x02, 0x7F,// M0x00, 0x7F, 0x04, 0x08, 0x10, 0x7F,// N0x00, 0x3E, 0x41, 0x41, 0x41, 0x3E,// O0x00, 0x7F, 0x09, 0x09, 0x09, 0x06,// P0x00, 0x3E, 0x41, 0x51, 0x21, 0x5E,// Q0x00, 0x7F, 0x09, 0x19, 0x29, 0x46,// R0x00, 0x46, 0x49, 0x49, 0x49, 0x31,// S0x00, 0x01, 0x01, 0x7F, 0x01, 0x01,// T0x00, 0x3F, 0x40, 0x40, 0x40, 0x3F,// U0x00, 0x1F, 0x20, 0x40, 0x20, 0x1F,// V0x00, 0x3F, 0x40, 0x38, 0x40, 0x3F,// W0x00, 0x63, 0x14, 0x08, 0x14, 0x63,// X0x00, 0x07, 0x08, 0x70, 0x08, 0x07,// Y0x00, 0x61, 0x51, 0x49, 0x45, 0x43,// Z0x00, 0x00, 0x7F, 0x41, 0x41, 0x00,// [0x00, 0x55, 0x2A, 0x55, 0x2A, 0x55,// 550x00, 0x00, 0x41, 0x41, 0x7F, 0x00,// ]0x00, 0x04, 0x02, 0x01, 0x02, 0x04,// ^0x00, 0x40, 0x40, 0x40, 0x40, 0x40,// _0x00, 0x00, 0x01, 0x02, 0x04, 0x00,// '0x00, 0x20, 0x54, 0x54, 0x54, 0x78,// a0x00, 0x7F, 0x48, 0x44, 0x44, 0x38,// b0x00, 0x38, 0x44, 0x44, 0x44, 0x20,// c0x00, 0x38, 0x44, 0x44, 0x48, 0x7F,// d0x00, 0x38, 0x54, 0x54, 0x54, 0x18,// e0x00, 0x08, 0x7E, 0x09, 0x01, 0x02,// f0x00, 0x18, 0xA4, 0xA4, 0xA4, 0x7C,// g0x00, 0x7F, 0x08, 0x04, 0x04, 0x78,// h0x00, 0x00, 0x44, 0x7D, 0x40, 0x00,// i0x00, 0x40, 0x80, 0x84, 0x7D, 0x00,// j0x00, 0x7F, 0x10, 0x28, 0x44, 0x00,// k0x00, 0x00, 0x41, 0x7F, 0x40, 0x00,// l0x00, 0x7C, 0x04, 0x18, 0x04, 0x78,// m0x00, 0x7C, 0x08, 0x04, 0x04, 0x78,// n0x00, 0x38, 0x44, 0x44, 0x44, 0x38,// o0x00, 0xFC, 0x24, 0x24, 0x24, 0x18,// p0x00, 0x18, 0x24, 0x24, 0x18, 0xFC,// q0x00, 0x7C, 0x08, 0x04, 0x04, 0x08,// r0x00, 0x48, 0x54, 0x54, 0x54, 0x20,// s0x00, 0x04, 0x3F, 0x44, 0x40, 0x20,// t0x00, 0x3C, 0x40, 0x40, 0x20, 0x7C,// u0x00, 0x1C, 0x20, 0x40, 0x20, 0x1C,// v0x00, 0x3C, 0x40, 0x30, 0x40, 0x3C,// w0x00, 0x44, 0x28, 0x10, 0x28, 0x44,// x0x00, 0x1C, 0xA0, 0xA0, 0xA0, 0x7C,// y0x00, 0x44, 0x64, 0x54, 0x4C, 0x44,// z0x14, 0x14, 0x14, 0x14, 0x14, 0x14,// horiz lines
};void OLED_ShowChar(U8 x,U8 y,U8 chr)
{unsigned char c=0,i=0;c=chr-' ';//得到偏移后的值if(x>128-1){x=0;y=y+2;}{OLED_Set_Pos(x,y+1);for(i=0;i<6;i++)OLED_WR_Byte(F6x8[c][i],OLED_DATA);}
}void OLED_ShowString(U8 x,U8 y,U8 *chr)
{unsigned char j=0;while (chr[j]!='\0'){        OLED_ShowChar(x,y,chr[j]);x+=8;if(x>120){x=0;y+=2;}j++;}
}

显示示例

void main()
{//init settingOLED_Init();OLED_All();OLED_Clear();OLED_ShowChar( 1, 1, '1');}

OLED 读Status/RAM data

void OLED_Read_Status( U8* pdata )//只提供伪代码,忽略等ACK等过程
{Set_Slave_Adr(0x3C);            //Slave address,具体看OLED pin脚设置Set_Dir = Write;Write_IIC_Byte(0x00);           //commandSet_Slave_Adr(0x3C);Set_Dir = Read;pdata = Read_IIC_Data();
}void OLED_Read_RAM( U8* pdata, U8 len )//读ram 之前需要先设置要读的起始column addr和page addr
{U8 dummy;Set_Slave_Adr(0x3C);            //Slave address,具体看OLED pin脚设置Set_Dir = Write;Write_IIC_Byte(0x40);          //dataSet_Slave_Adr(0x3C);Set_Dir = Read;dummy = Read_IIC_Data(1);//第一个byte是dummy datapdata = Read_IIC_Data( len );
}

参考代码:https://download.csdn.net/download/qq_36243592/15893303?spm=1001.2014.3001.5501

OLED SH1106通过I2C显示相关推荐

  1. 1.3寸OLED SH1106 IIC驱动显示错误解决方法

    网上买的1.3寸OLED 用的时候发现显示有问题,整体像素都往左两个,导致左边少两列像素,右边两列则为乱码. 解决方法 在设置光标函数中让x轴向右位移2个像素. void OLED_SetCursor ...

  2. NanoPC-T4(RK3399) game1 oled(I2C)显示时间天气温度

    文章目录 1. 查看GPIO定义 wiringpi库 2. 确保硬件无问题 (i2c-tools) 3. 安装oled驱动python包 3.1 用例测试 3.2 测试用例2 4. oled显示时间, ...

  3. STM32 HAL 驱动I2C总线0.91寸OLED模块(基于SSD1306显示驱动芯片)

    STM32 HAL 驱动I2C总线0.91寸OLED模块(基于SSD1306显示驱动芯片) 基于SSD1306驱动芯片的OLED模块有多种型号,有0.91英寸,0.96英寸等等.OLED采用单色显示方 ...

  4. STM32 OLED屏(I2C接口)显示

    SSD1306 OLED特性 手册说明 GDDRAM寻址模式(0x20) I2C地址与时序 软件配置 I2C的配置 OLED初始化过程 显示中文 显示英文 显示图片 OLED特性 型号:SSD1306 ...

  5. 1.3寸IIC OLED SH1106和Arduino库的适配性鸡肋问题

    1.3寸IIC OLED SH1106和Arduino库的适配性鸡肋问题 在还没有购买或者有购买意向的小伙伴,要注意一下,选购OLED屏幕的时候注意考量自己需求以及用途,不然买回来发现用不了,那就是一 ...

  6. Arduino与Proteus仿真实例-OLED显示屏(SSD1306)I2C驱动仿真

    OLED显示屏(SSD1306)I2C驱动仿真 首字母缩写词"OLED"代表有机发光二极管 - 一种使用 LED 的技术,其中的光由有机分子产生. 这些有机 LED 用于制造被认为 ...

  7. 继续树莓派4B+OLED:开机自动显示IP地址

    因为有了之前(树莓派:Adafruit的I2C SSD1306 OLED驱动)那篇的基础,想干脆让它开机自动显示IP地址. 首先当然找获取IP的代码.记得前几年抄过一段,所以又找了出来: def ge ...

  8. Blinker 天气时钟 esp8266+SH1106 OLCD屏显示

    Blinker 天气时钟 esp8266+SH1106 OLCD屏显示

  9. 0.96寸OLED取字模文字显示

    0.96寸OLED取字模文字显示 话不多说上干货 这是我使用的取字软件打开会有这样的提示(我暂时不清楚为什么,不过使用起来没有问题) 打开后我们需要在这里进行一些参数的设置 我的是这样设置的,其中会遇 ...

最新文章

  1. Python_note3 基本数据类型+time库使用
  2. luogu P5292 [HNOI2019]校园旅行
  3. Oracle Exadata迈入十年将助企业迈向数位转型之路
  4. 服务器上的hdfs的配置文件中,namenode不能设置成127.0.0.1或者localhost,要设置ip或者映射别名
  5. OpenCV使用dnn从图像中解析人体部位的实例(附完整代码)
  6. Linux 分割、合并文件
  7. 贫穷中透着零基础的单人制作游戏手册之二:做游戏不光靠创意
  8. 关于Fiori MyAccount无法在standalone环境下运行的问题
  9. 界面设计语言_使用任何语言设计界面的提示
  10. [css] 你知道什么是CSS-in-JS吗?说说你对它的了解
  11. 【MyBatis-Plus】第一章 快速入门
  12. 奇安信代码安全实验室帮助微软修复远程内核级漏洞,获官方致谢
  13. mysql sam和db_Mysql
  14. RFID医疗废物管理系统解决方案-RFID技术的医疗废弃物管理系统
  15. 硬盘的修复(三)恢复删除文件
  16. P1_M4_L5 Lateral Dynamic Bicycle Model(自行车模型的横向动力学建模)
  17. OC 调用 Swift 方法
  18. 使用ns2仿真ping
  19. 路由器、交换机、猫(Modem)、LAN、WAN、WLAN、VLAN基本概念
  20. 逻辑越权——垂直、水平越权

热门文章

  1. 微信小程序-调用腾讯地图插件实现定点,路线规划,地铁图,服务拓展(逆地址解析,地点搜索)
  2. 从茅台和可乐,看看企业“护城河”
  3. 【论文】使用文本分类的PRF
  4. “瓯江论数 数安中国”2022数据安全发展大会启幕,数据宝董事长汤寒林受邀发表演讲
  5. 长广溪湿地公园集体活动
  6. SEM,KPI,CPC,CPA,ROI……一篇文章搞懂电子商务最全术语!
  7. 期货交易心得 Round 5
  8. 江苏学计算机二本大学排名,江苏二本大学排名榜大全
  9. practice是什么意思_practice是什么意思_practice在线翻译_英语_读音_用法_例句_海词词典...
  10. TouchGFX简介