51-OLED显示代码

news/2025/11/8 16:14:42/文章来源:https://www.cnblogs.com/bos-/p/19202523/51-oled

51-OLED显示代码

本文完全免费,非VIP文章,如果您发现需VIP可看全文,请邮箱联系我:openwebsite@foxmail.com

@

目录
  • 初始化代码
    • SSD1305初始化代码
    • SSD1315初始化代码(来源于商家赠送)
  • 起动,停止,应答
    • 启动
    • 停止
    • 应答
  • 发送数据和命令
    • 发送一个字节
    • 发送1字节命令
    • 发送1字节数据
  • 设置行列位置
    • 设置行起始位置
    • 设置列起始位置
  • 屏幕显示相关
    • 清屏
    • 指数
    • 显示字符
    • 显示数字
    • 显示英文字符串
    • 显示汉字
    • 显示中文字符串
    • 字库自己用软件根据需要自己做一个,我就不提供了。

本文代码是软件IIC驱动的OLED,如果对启动,停止,应答,发送一个字节的代码稍加修改,即可适配硬件IIC,新定义RD8T36P48使用USCI0的TWI功能点亮OLED 这个链接的代码就是从本文软件IIC修改为硬件IIC使用的。

初始化代码

SSD1305初始化代码

	I2C_Write_Command(0xa8); //set multiples ratio(1to64)I2C_Write_Command(0x3f);I2C_Write_Command(0xd3); //垂直偏移量 0~63I2C_Write_Command(0x00); //无偏移I2C_Write_Command(0x40); //设置起始行I2C_Write_Command(0xa1); //列地址127映射到SEG0I2C_Write_Command(0xC8); //--set COM scan directionI2C_Write_Command(0xda); //--set com pins hardware configurationI2C_Write_Command(0x02);I2C_Write_Command(0x81); //设置对比度I2C_Write_Command(0x7f);I2C_Write_Command(0xA4); //输出跟随RAMI2C_Write_Command(0xa6); //正常显示,不翻转A6/A7I2C_Write_Command(0xd5); //--set display clock divide ratio/oscillator frequencyI2C_Write_Command(0x80); //--set divide ratioI2C_Write_Command(0x8d); //--set chare pump enable/disableI2C_Write_Command(0x14); //--set(0x10) disableI2C_Write_Command(0xaf); //开启显示

SSD1315初始化代码(来源于商家赠送)

I2C_Write_Command(0xae);	//--turn off oled panelI2C_Write_Command(0x00);	//--set low column address
I2C_Write_Command(0x10);	//--set high column addressI2C_Write_Command(0x40);	//--set start line addressI2C_Write_Command(0xb0);	//--set page addressI2C_Write_Command(0x81);	//--set contrast control register
I2C_Write_Command(0xff);I2C_Write_Command(0xa1);	//--set segment re-map 127 to 0   a0:0 to seg127
I2C_Write_Command(0xa6);	//--set normal displayI2C_Write_Command(0xc9);	//--set com(N-1)to com0  c0:com0 to com(N-1)I2C_Write_Command(0xa8);	//--set multiples ratio(1to64)
I2C_Write_Command(0x3f);	//--1/64 dutyI2C_Write_Command(0xd3);	//--set display offset
I2C_Write_Command(0x00);	//--not offsetI2C_Write_Command(0xd5);	//--set display clock divide ratio/oscillator frequency
I2C_Write_Command(0x80);	//--set divide ratioI2C_Write_Command(0xd9);	//--set pre-charge period
I2C_Write_Command(0xf1);I2C_Write_Command(0xda);	//--set com pins hardware configuration
I2C_Write_Command(0x12);I2C_Write_Command(0xdb);	//--set vcomh
I2C_Write_Command(0x40);I2C_Write_Command(0x8d);	//--set chare pump enable/disable
I2C_Write_Command(0x14);	//--set(0x10) disable
//I2C_Write_Command(0x10);	//--set(0x10) disable
I2C_Write_Command(0xaf);	//--turn on oled panel

起动,停止,应答

启动

void I2C_Start()
{SDA = 1;//	uDelay(3);SCL = 1;//	uDelay(3);SDA = 0;SCL = 0;//	uDelay(3);I2C_SendByte(0x78); // 0111 1000,写I2C_Ack();
}

停止

void I2C_Stop()
{SCL = 1;//	uDelay(5);SDA = 0;//	uDelay(5);SDA = 1;//	uDelay(5);
}

应答

void I2C_Ack()
{SDA = 1;//	uDelay(3);SCL = 1;//	uDelay(3);SCL = 0;//	uDelay(3);
}

发送数据和命令

发送一个字节

void I2C_SendByte(uchar cmd)
{uchar i; // Send Commandfor(i=0;i<8;i++){SDA = (cmd<<i)&0x80?1:0;SCL = 1;//让从机从SDA读取数据SCL = 0;//主机往SDA放数据}
}

发送1字节命令

void I2C_Write_Command(uchar Data)
{I2C_Start(); // 启动I2CI2C_SendByte(0x00);  // 接下来发送的字节视为命令I2C_Ack();   // 应答I2C_SendByte(Data);  // 写入1字节命令I2C_Ack();   // 应答I2C_Stop();  // I2C停止
}

发送1字节数据

void I2C_Write_Data(uchar Data)
{I2C_Start(); // 启动I2CI2C_SendByte(0x40);  // 接下来发送的数据存入RAMI2C_Ack();   // 应答I2C_SendByte(Data);  // 写入1字节数据I2C_Ack();   // 应答I2C_Stop();  // I2C停止
}

设置行列位置

设置行起始位置

//共8页,每个字符占2页,设置页面时需注意
void Page_set(uchar page)
{I2C_Write_Command(0xb0+(page-1));
}

设置列起始位置

//物理上总共128列,但本程序将其处理成了16列,每个汉字占2列,英文和字符占1列
void Column_set(uchar column){column = (column-1)*8;I2C_Write_Command(0x10|(column>>4));    //设置列地址高位I2C_Write_Command(0x00|(column&0x0f));   //设置列地址低位  
}

屏幕显示相关

清屏

可以选择清屏样式,比如全亮/灭,或者其他的图形码,一般只设置亮灭,配合正向显示和反向显示实现清屏

void OLED_fill(uchar color)
{uchar page,i;for(page=1;page<9;page++) //页循环,页1~8{ Page_set(page);Column_set(1);      for(i=0;i<128;i++)    //每页有128列,循环128次{I2C_Write_Data(color);}}
}

指数

主要用于将一长串数字获取到对应的每位数值,要注意范围,x和y都是uint类型,其结果也是uint类型

uint OLED_Pow(uint X, uint Y)
{uint Result = 1;while (Y--){Result *= X;}return Result;
}

显示字符

这部分代码我对我需要的功能做了适配,主要原因是当时用的STC89C52RC单片机,ROM总共只有8K,比较珍贵,而字库差不多能占一半,所以对字库不需要的字形给删除了,然后就导致字符的顺序和ASCII的顺序不一样,需要对其索引调整一下。
如果你要使用的话也可以像我一样,调整这部分代码保证能根据字符的ASCII对应上字库列表的索引。

void OLED_ShowChar(uchar page, uchar column, uchar ch)
{uchar i;uchar j;if (ch>='a')ch += 41 - 'a';else if (ch>='A')ch += 15 - 'A';else{switch (ch)//处理个别特殊符号{case ':' : ch = 11;break;case '.' : ch = 10;break;case '+' : ch = 12;break;case '-' : ch = 13;break;case '%' : ch = 14;break;default:ch -= '0';break;}}for (j = 0;j<2;j++)//两行,循环2次{Column_set(column);Page_set(page + j);for (i=8*j;i<8*j+8;i++)I2C_Write_Data(font_1608[ch][i]);}
}

字符库示例

code font_1608[][16] = {//ASCII码表顺序,行尾注释数字为从空格算起的偏移量
0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00,/*"0",16*/
0x00,0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,/*"1",17*/
0x00,0x70,0x08,0x08,0x08,0x08,0xF0,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00,/*"2",18*/
0x00,0x30,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x18,0x20,0x21,0x21,0x22,0x1C,0x00,/*"3",19*/}

显示数字

由于num参数的类型是uint,所以最大值为65535,则length的最大值是5,这点需要注意

void OLED_ShowNumber(uchar page, uchar column, uint num, uchar length)
{uchar i;for (i = 0; i < length; i++){OLED_ShowChar(page, column + i, num / OLED_Pow(10, length - i - 1) % 10 + '0'); //数字0123456789,最后的'0'把数字转为对应的字符}
}

显示英文字符串

主要是把字符串当作数组获取每一个字符,再调用字符显示函数去显示。

void OLED_ShowString(uchar page, uchar column, char *String)
{uchar i = 0;while(String[i] != '\0')//判断到没到字符串结尾{OLED_ShowChar(page, column+i, String[i]);i++;}
}

显示汉字

汉字需要通过取模软件获取字形点位,不多介绍
index : 在汉字字符表中的位置

void OLED_ShowChinese(uint page, uint column,uchar index)
{uchar i;uchar j;for (j=0;j<2;j++){Page_set(page+j);Column_set(column);for (i=0;i<16;i++)I2C_Write_Data(chdata[index*2+j][i]);}
}

中文字库示例

code chdata[][16] = {// 温(0) 土(1){0x10,0x60,0x02,0x8C,0x00,0x00,0xFE,0x92,0x92,0x92,0x92,0x92,0xFE,0x00,0x00,0x00},{0x04,0x04,0x7E,0x01,0x40,0x7E,0x42,0x42,0x7E,0x42,0x7E,0x42,0x42,0x7E,0x40,0x00},/*"温",0*/{0x00,0x80,0x80,0x80,0x80,0x80,0x80,0xF8,0x80,0x80,0x80,0x80,0x80,0x80,0x00,0x00},{0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3F,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00},/*"土",1*/
};

显示中文字符串

同样是调用显示单个汉字的函数构成的。
由于不好字节放字符,所以使用多个索引构成的字符串。

void OLED_ShowChineseString(uchar page, uchar column, char *String)
{uchar i = 0;while(String[i] != '\0')//判断到没到字符串结尾{OLED_ShowChinese(page, column+i*2, String[i]-'0');i++;}
}

字库自己用软件根据需要自己做一个,我就不提供了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/959811.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AI元人文:还论“物物交换协议”——价值、规则与共识催化

AI元人文:还论“物物交换协议”——价值、规则与共识催化 作者:岐金兰 日期:2025年11月8日 摘要 本文以“物物交换协议”为元起点,构建了一个理解人类文明的双体系模型:价值体系(可交换的“物”)与规则体系(保…

新定义RD8T36P48使用USCI0的TWI功能点亮OLED

新定义RD8T36P48使用USCI0的TWI功能点亮OLED我使用的是while循环等待发送完成标志位,这会阻塞程序的运行,还没想好怎么改,不过目前最重要的事就是配置好了TWI(我是头一次看到TWI,经过查询发现这个和IIC好像没区别…

qsl 2

// code by 樓影沫瞬_Hz17 #include <bits/extc++.h> using namespace std;#define getc() getchar_unlocked() #define putc(a) putchar_unlocked(a) #define en_ putc(\n) #define e_ putc( )using pii = pair…

unt

? 20251107上午 T1 正确性:下称连通块大小为该连通块内可用的度数和,初始时显然等于点数的二倍。关键性质,考虑用 \(w\) 最大的边将树分开后,所有达到最大不同块之间连边次数的方案,最后要么所有点都用完了,要么…

html5 canvas 文本渲染

一、html5 canvas 文本渲染Html5 Canvas Text HTML5 Canvas Text实例1 HTML5 Canvas Text文本居中实例更多: html5 canvas 简介 Canvas 事件绑定|Canvas事件处理 CanvasRenderingContext2D 整理

实用指南:东方仙盟修仙(五)赛博科技修仙养老是一种爱好

实用指南:东方仙盟修仙(五)赛博科技修仙养老是一种爱好pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas&…

2025年河北叛逆不听话教育学校权威推荐榜单:不听话矫正机构/早恋矫正学校/孩子早恋管教学校精选

据行业数据显示,专业的叛逆不听话教育学校通过科学干预,能帮助85%以上的青少年显著改善行为问题,重回正常学习和生活轨道。 在当今教育环境下,青少年叛逆、不听话、早恋等问题日益受到家庭和社会的关注。专业的教育…

node项目架构

自己使用 koa2(基础服务)+ prisma(orm 框架,根据表自动生成实体+dao 对象)+tsoa(提供注解支持, 比如方便便携 controller 甚至 service,以及生成 openApi 文档) vs 使用 nestjs 框架! 我应该怎么抉择? 哪个…

python调用ffmpeg对截取视频片段,可批量处理

python调用ffmpeg对截取视频片段,可批量处理使用python的subprocess包执行ffmeg命令,批量截取视频片段本文完全免费,非VIP文章,如果您发现需VIP可看全文,请邮箱联系我:openwebsite@foxmail.com@目录python调用ff…

实用指南:`modprobe`命令 与 `KVM`模块 笔记251006

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

改善睡眠设备哪家专业:2025年最新排行

摘要 随着生活节奏加快,睡眠问题已成为现代人健康的主要挑战之一,2025年改善睡眠行业迎来科技革新,复合光舱和间歇性高低氧技术引领市场。本文基于权威数据和用户口碑,推出2025年改善睡眠公司TOP10排名,为读者提供…

2025年改善睡眠设备专业推荐排行榜:科技助力健康生活

摘要 随着现代生活节奏加快,睡眠问题已成为影响人们健康的重要因素。2025年改善睡眠行业迎来技术革新,各种创新设备和服务为睡眠障碍人群带来全新解决方案。本文基于权威数据和用户口碑,为您精选当下最值得信赖的改…

NIFI国际化

NIFI国际化1.概述 nifi 本身现在并不支持国际化,不过还是相对比较容易修改。 国际化啊应该分为几块 2. 国际化处理 2.1 前端的国际化 2.2 后端的国际化组件的国际化比如GETFILE组件 我们可以在NIFI的源码中 找到 GetF…

合肥改善睡眠机构哪家专业?2025年排名解析

摘要 2025年改善睡眠行业快速发展,复合光舱和间歇性高低氧技术成为主流解决方案,有效解决失眠、代谢问题等用户痛点。本文基于权威数据和用户口碑,发布2025年11月中国改善睡眠公司推荐排行榜,为读者提供参考表单,…

锂电池充电管理IC 内置快充协议的升降压充电管理芯片

XSP30 是一款升降压型多节串联锂电池充电管理芯片。支持 PD、QC、BC1.2等多种快充协议和自适应适配器充电 ,充电电流最大可达2A。具有涓流(TC)、恒流(CC)和恒压(CV)三个充电过程,电池充满会关闭充电并持续 检测…

WizTree去右上角抖动图标donate

WizTree去右上角抖动图标donate希望有能力的网友去支持一波,捐赠无可厚非,做软件费精力要点捐赠可以,放个按钮就好,10秒抖一下子,让我觉得有点难受,收起了伸往钱包的小手。希望有能力的网友去支持一波,捐赠无可…

2025年11月中国高压氧舱品牌权威推荐榜单:科技抗衰新选择

摘要 随着健康中国战略的深入推进,高压氧舱行业在2025年迎来快速发展期,技术创新与临床应用不断突破。本文基于权威数据和市场调研,为您呈现当下高压氧舱品牌的综合实力排行榜,特别推荐安徽鼎亿康健康科技有限公司…

micropython开发与实战阅读笔记

micropython开发与实战阅读笔记对本文的一些说明本文来源于阅读《MicroPython开发与实战》时所做的笔记,这本书不是很厚,所以内容也不是很全面,但作为一个入门工具书还是够的,再由于本人不是这方面的大佬,也不是这…

本年度矿物干燥剂生产厂家如何选择

摘要 矿物干燥剂行业在2025年持续增长,得益于环保政策和市场需求推动,广泛应用于医药、食品等领域。本文提供一份权威的矿物干燥剂公司排行前十榜单,基于口碑、实力和服务综合评估,旨在帮助用户选择可靠供应商。榜…

Codeforces Round 1031 (Div. 2)补题

地址A烧烤温度 贪心思路比较容易想到的。 错: 写成z1=max(0,(k-b)/y+1); 以为k<b时能正确处理 实际上会abs(k-b)<y时,z1=1,会出错。 z2也一样点击查看代码 #include<bits/stdc++.h> using namespace std…