51-OLED显示代码

文章目录

  • 初始化代码
    • 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/bicheng/32297.shtml

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

相关文章

七层和四层的区别

OSI七层模型的结构如下&#xff1a; 物理层&#xff08;Physical Layer&#xff09;&#xff1a;负责传输原始比特流&#xff0c;实现数据在物理媒介上的传输&#xff1b; 数据链路层&#xff08;Data Link Layer&#xff09;&#xff1a;负责在相邻节点之间传输数据帧&#…

Springboot与RestTemplate

RestTemplate是Spring提供的用于访问Rest服务的客户端&#xff0c;RestTemplate提供了多种便捷访问远程Http服务的方法,能够大大提高客户端的编写效率。 一、使用Get进行访问 1、获取json格式 使用 getForEntity() API 发起 GET 请求&#xff1a; RestTemplate restTemplate…

Git简单使用和理解

workspace: 本地的工作目录。 index/stage&#xff1a;暂存区域&#xff0c;临时保存本地改动。 local repository: 本地仓库&#xff0c;只想最后一次提交HEAD。 remote repository&#xff1a;远程仓库。 对于Git,首先应该明白第一git是一种分布式版本控制系统&#xff0c;最…

后仿真中 module path polarity 问题

目录 一 未知极性 二 正极性 三 负极性 不知道大家有没有遇到这个问题:什么?我们知道的module path delay 指的是定义在specify...endspecify block 中的语句,指示输入-输出的延迟信息。 这里的module path 竟然还有极性问题,今天,来学习一下。 模块路径的极性是一…

FreeBSD服务器监控:核心指标解读与应用建议(Telnet)

随着企业IT环境的日益复杂&#xff0c;对服务器性能和稳定性的监控变得至关重要。特别是针对FreeBSD这类广泛应用的服务器操作系统&#xff0c;进行高效的监控和管理更是运维团队的核心任务。本文将针对监控易中FreeBSD服务器的核心监控指标进行解读&#xff0c;并提供相应的应…

用RNN构建人名分类器

目录 项目综述1.导入必备的工具包2.处理数据&#xff0c;满足训练要求2.1 统计常用的字符2.2 进行规范化处理,去除重音符号2.3 将文件读取到内存中2.4 构建人名国家和具体人名的对应关系2.5 one-hot编码 3.构建RNN模型3.1 构建传统RNN模型3.2 构建传统LSTM模型3.3 构建传统GRU模…

永久免费设备日志采集工具

免费试用下载: Gitee下载 最新版本 优势: A. 开箱即用. 解压直接运行.不需额外安装. B. 批管理设备. 设备配置均在后台管理. C. 无人值守 客户端自启动,自更新. D. 稳定安全. 架构简单,内存占用小,通过授权访问.

openeuler一个服务异常占用cpu的排查过程

1 环境 硬件环境&#xff1a;LS1046A arm64 系统环境&#xff1a;openEuler release 22.03 (LTS-SP1) Linux kernel 4.19.26 2 问题说明 我的硬件平台需要适配一下 openEuler release 22.03 (LTS-SP1) 但是目前只能使用原来硬件平台的内核&#xff0c;在适配的过程中…

LLM大语言模型应用方案之RAG检索增强生成的实现步骤。

0.我理解的RAG 什么是RAG&#xff1f; RAG的全称是“检索增强生成模型”&#xff08;Retrieval-Augmented Generation&#xff09;。这是一种特别聪明的大语言模型。 RAG是怎么工作的呢&#xff1f; 1.检索&#xff1a;当你问RAG一个问题时&#xff0c;它会先去“图书…

aardio - 【库】lock 跨进程读写锁

import win.ui; /*DSG{{*/ var winform win.form(text"aardio form";right272;bottom203;topmost1) winform.add( button{cls"button";text"无锁演示";left27;top132;right120;bottom184;z2}; button2{cls"button";text"有锁演示…

正确使用 QSqlDatabase 与 QSqlQuery 的方法

前言 在使用 Qt 的数据库模块时&#xff0c;许多人可能会对 QSqlDatabase 和 QSqlQuery 的使用方法感到困惑。本文将对这一话题进行详细讨论&#xff0c;并提供一些最佳实践。 基本使用示例 首先&#xff0c;让我们看看以下代码片段&#xff1a; {QSqlDatabase db QSqlDat…

Redis的实战常用一、验证码登录(解决session共享问题)(思路、意识)

一、基于session实现登录功能 第一步&#xff1a;发送验证码&#xff1a; 用户在提交手机号后&#xff0c;会校验手机号是否合法&#xff1a; 如果不合法&#xff0c;则要求用户重新输入手机号如果手机号合法&#xff0c;后台此时生成对应的验证码&#xff0c;同时将验证码进行…

前端路线指导(4):前端春招秋招经验分享

春招/秋招经验分享(前端) 哈喽大家好&#xff0c;我是小粉&#xff0c;双一流本科&#xff0c;自学前端一年&#xff0c;收获腾讯&#xff0c;字节等多家大厂offer&#xff0c;一半以上ssp~ 今天给大家分享一下我的春招&#xff08;暑期实习&#xff09;、秋招经历&#xff0c;…

【Gradio】如何设置 Gradio 数据框的样式

简介 数据可视化是数据分析和机器学习的关键方面。Gradio DataFrame 组件是一种流行的方式&#xff0c;在网络应用程序中显示表格数据&#xff08;特别是以 pandas DataFrame 对象的形式&#xff09;。 本文将探讨 Gradio 的最新增强功能&#xff0c;这些功能允许用户整合 pand…

Linux下静态IP地址的配置

Linux下一切皆文件!必然通过修改配置文件生效&#xff01; 1.方法1&#xff1a;直接修改网卡配置文件 配置静态IP地址 [rootheima ~]# cd /etc/sysconfig/network-scripts/ [rootheima network-scripts]# ls ifcfg-ens160 [rootheima network-scripts]# cat ifcfg-ens160 TY…

Spring的启动扩展点机制详解

在Java的世界中&#xff0c;我们知道Spring是当下最主流的开发框架&#xff0c;没有之一。而在使用Dubbo、Mybatis等开源框架时&#xff0c;我们发现可以采用和Spring完全一样的使用方式来使用它们。 可能你在平时的使用过程中并没有意识到这一点&#xff0c;但仔细想一想&…

飞机大战java

"飞机大战"是一种经典的射击游戏&#xff0c;通常在各种平台上都有实现&#xff0c;包括Java。如果你想要开发一个Java版本的飞机大战游戏&#xff0c;你可能需要考虑以下几个方面&#xff1a; 游戏设计&#xff1a;确定游戏的基本规则&#xff0c;比如玩家控制的飞机…

代码随想录第四十五天打卡

198.打家劫舍 视频讲解&#xff1a;动态规划&#xff0c;偷不偷这个房间呢&#xff1f;| LeetCode&#xff1a;198.打家劫舍_哔哩哔哩_bilibili 代码随想录 class Solution { public:int rob(vector<int>& nums) {vector<vector<int>>dp(nums.size(),ve…

通用大模型VS垂直大模型

通用大模型VS垂直大模型&#xff0c;你更青睐哪一方&#xff1f; 在当前AI大模型的竞争环境中&#xff0c;通用大模型和垂直大模型各有其独特的优势和挑战&#xff0c;选择哪一方更有前景需要考虑多方面因素。 通用大模型的优势与挑战 通用大模型如GPT-3、BERT等在自然语言处理…

解决js打开新页面百度网盘显示不存在方法:啊哦,你所访问的页面不存在了。

用js打开新页面open或window.location.href打开百度网盘后都显示&#xff1a;啊哦&#xff0c;你所访问的页面不存在了。 window.open(baidu_url); window.location.href baidu_url;在浏览器上&#xff0c;回车后网盘资源是可以打开的&#xff0c;刷新也是打开的。这是很奇怪…