当前位置: 首页 > news >正文

眉山做网站余姚网站制作公司

眉山做网站,余姚网站制作公司,长春搜索排名公司,网站首页模板免费下载一、介绍 OLED是有机发光二极管,又称为有机电激光显示(Organic Electroluminescence Display, OLED)。OLED由于同时具备自发光,不需背光源、对比度高、厚度薄、视角广、反应速度快、可用于挠曲性面板、使用温度范围广…

一、介绍

OLED是有机发光二极管,又称为有机电激光显示(Organic Electroluminescence Display, OLED)。OLED由于同时具备自发光,不需背光源、对比度高、厚度薄、视角广、反应速度快、可用于挠曲性面板、使用温度范围广、构造及制程较简单等优异之特性,被认为是下一代的平面显示器新兴应用技术
在这里插入图片描述

OLED屏幕特点

1.模块尺寸:23.7 *23.8mm

2.电源电压:3.3-5.5V

3.驱动芯片:SSD1306

4.测试平台:提供 k60/k10,9s12XS128,51,stm32,stm8等单片机

OLED屏幕接线说明

在这里插入图片描述

OLED屏幕显存

OLED本身是没有显存的,他的现存是依赖SSD1306提供的,而SSD1306提供一块显存。

SSD1306显存总共为128*64bit大小,SSD1306将这些显存分成了8页。每页包含了128个字节。

OLED屏幕原理

STM32内部建立一个缓存(共128*8个字节),每次修改的时候,只是修改STM32上的缓存(实际上就是SRAM),修改完后一次性把STM32上的缓存数据写入到OLED的GRAM。这个方法也有坏处,对于SRAM很小的单片机(51系列)就比较麻烦。

STM32CubeMX配置

我们这里OLED用的是硬件驱动的,既然单片机有这个硬件资源我们就不要消耗CPU的算力使用软驱了,在CubeMX中打开I2C后可以配置成快速和慢速的,快速的刷新的非常快,速度大概是普通的四倍
在这里插入图片描述

程序设计
OLED.C

/*** 基于硬件IIC通信的OLED驱动程序* API完全打包好的直接选择你的硬件IIC口即可**/
#include "main.h"
#include "i2c.h"
#include "stdio.h"
#include "oled_font.h"
#include "oled.h"uint8_t OLED_Buffer[8][128]={0};/*** @brief  OLED写命令* @param  Command 要写入的命令* @retval 无*/
void OLED_WriteCommand(uint8_t Command)
{uint8_t *pData;pData = &Command;HAL_I2C_Mem_Write(&Hardware_IIC_No,0x78,0x00,I2C_MEMADD_SIZE_8BIT,pData,1,100);
}/*** @brief  OLED写数据* @param  Data 要写入的数据* @retval 无*/
void OLED_WriteData(uint8_t Data)
{uint8_t *pData;pData = &Data;HAL_I2C_Mem_Write(&Hardware_IIC_No,0x78,0x40,I2C_MEMADD_SIZE_8BIT,pData,1,100);}/*** @brief  OLED设置光标位置* @param  Y 以左上角为原点,向下方向的坐标,范围:0~7* @param  X 以左上角为原点,向右方向的坐标,范围:0~127* @retval 无*/
void OLED_SetCursor(uint8_t Y, uint8_t X)
{OLED_WriteCommand(0xB0 | Y);					//设置Y位置OLED_WriteCommand(0x10 | ((X & 0xF0) >> 4));	//设置X位置低4位OLED_WriteCommand(0x00 | (X & 0x0F));			//设置X位置高4位
}/*** @brief  OLED清屏* @param  无* @retval 无*/
void OLED_Clear(void)
{uint8_t i, j;for (j = 0; j < 8; j++){OLED_SetCursor(j, 0);for(i = 0; i < 128; i++){OLED_WriteData(0x00);}}
}/*** @brief  OLED显示一个字符* @param  Line 行位置,范围:1~4* @param  Column 列位置,范围:1~16* @param  Char 要显示的一个字符,范围:ASCII可见字符* @retval 无*/
void OLED_ShowChar(uint8_t Line, uint8_t Column, char Char)
{uint8_t i;OLED_SetCursor((Line - 1) * 2, (Column - 1) * 8);		//设置光标位置在上半部分for (i = 0; i < 8; i++){OLED_WriteData(OLED_F8x16[Char - ' '][i]);			//显示上半部分内容}OLED_SetCursor((Line - 1) * 2 + 1, (Column - 1) * 8);	//设置光标位置在下半部分for (i = 0; i < 8; i++){OLED_WriteData(OLED_F8x16[Char - ' '][i + 8]);		//显示下半部分内容}
}/*** @brief  OLED显示字符串* @param  Line 起始行位置,范围:1~4* @param  Column 起始列位置,范围:1~16* @param  String 要显示的字符串,范围:ASCII可见字符* @retval 无*/
void OLED_ShowString(uint8_t Line, uint8_t Column, char *String)
{uint8_t i;for (i = 0; String[i] != '\0'; i++){OLED_ShowChar(Line, Column + i, String[i]);}
}/*** @brief  OLED次方函数* @retval 返回值等于X的Y次方*/
uint32_t OLED_Pow(uint32_t X, uint32_t Y)
{uint32_t Result = 1;while (Y--){Result *= X;}return Result;
}/*** @brief  OLED显示数字(十进制,正数)* @param  Line 起始行位置,范围:1~4* @param  Column 起始列位置,范围:1~16* @param  Number 要显示的数字,范围:0~4294967295* @param  Length 要显示数字的长度,范围:1~10* @retval 无*/
void OLED_ShowNum(uint8_t Line, uint8_t Column, uint32_t Number, uint8_t Length)
{uint8_t i;for (i = 0; i < Length; i++){OLED_ShowChar(Line, Column + i, Number / OLED_Pow(10, Length - i - 1) % 10 + '0');}
}/*** @brief  OLED显示数字(十进制,带符号数)* @param  Line 起始行位置,范围:1~4* @param  Column 起始列位置,范围:1~16* @param  Number 要显示的数字,范围:-2147483648~2147483647* @param  Length 要显示数字的长度,范围:1~10* @retval 无*/
void OLED_ShowSignedNum(uint8_t Line, uint8_t Column, int32_t Number, uint8_t Length)
{uint8_t i;uint32_t Number1;if (Number >= 0){OLED_ShowChar(Line, Column, '+');Number1 = Number;}else{OLED_ShowChar(Line, Column, '-');Number1 = -Number;}for (i = 0; i < Length; i++){OLED_ShowChar(Line, Column + i + 1, Number1 / OLED_Pow(10, Length - i - 1) % 10 + '0');}
}/*** @brief  OLED显示数字(十六进制,正数)* @param  Line 起始行位置,范围:1~4* @param  Column 起始列位置,范围:1~16* @param  Number 要显示的数字,范围:0~0xFFFFFFFF* @param  Length 要显示数字的长度,范围:1~8* @retval 无*/
void OLED_ShowHexNum(uint8_t Line, uint8_t Column, uint32_t Number, uint8_t Length)
{uint8_t i, SingleNumber;for (i = 0; i < Length; i++){SingleNumber = Number / OLED_Pow(16, Length - i - 1) % 16;if (SingleNumber < 10){OLED_ShowChar(Line, Column + i, SingleNumber + '0');}else{OLED_ShowChar(Line, Column + i, SingleNumber - 10 + 'A');}}
}/*** @brief  OLED显示数字(二进制,正数)* @param  Line 起始行位置,范围:1~4* @param  Column 起始列位置,范围:1~16* @param  Number 要显示的数字,范围:0~1111 1111 1111 1111* @param  Length 要显示数字的长度,范围:1~16* @retval 无*/
void OLED_ShowBinNum(uint8_t Line, uint8_t Column, uint32_t Number, uint8_t Length)
{uint8_t i;for (i = 0; i < Length; i++){OLED_ShowChar(Line, Column + i, Number / OLED_Pow(2, Length - i - 1) % 2 + '0');}
}/***  @brief OLED显示模拟量*  @param Line起始位置,范围0~3*  @param Colum 起始列位置,0~7*  @param CHN 汉字序列*/
void OLED_ShowChinese(uint8_t Line, uint8_t Column, uint8_t CHN)
{uint8_t i;OLED_SetCursor(Line*2, Column*16);		//设置光标位置在上半部分for (i = 0; i < 16; i++){OLED_WriteData(GBK[CHN][i]);			//显示上半部分内容}OLED_SetCursor((Line*2)+1,Column*16);	//设置光标位置在下半部分for (i = 0; i < 16; i++){OLED_WriteData(GBK[CHN][i + 16]);		//显示下半部分内容}
}/***  @brief OLED显示模拟量*  @param Pic第几张图片,范围0~3*  @param Colum 起始列位置,0~7**/
void OLED_ShowPicture(uint8_t Pic)
{uint8_t i,j;Pic=Pic*8;for(j=0;j<8;j++){OLED_SetCursor(j,0);//开始显示for (i = 0; i < 128; i++){OLED_WriteData(Picture[j+Pic][i]);			//发送数据}}
}
/** 快速显示照片*/
void OLED_FastShowPicture(uint8_t Pic)
{uint8_t i,j;Pic=Pic*8;for(j=0;j<8;j++){for (i = 0; i < 128; i++){OLED_Buffer[j][i]=(Picture[j+Pic][i]);			//发送数据}}
}
/** @brief 向缓冲区写入字符数据* Line 1~4;* Column 1~16;*/
void OLED_FastShowChar(uint8_t Line, uint8_t Column, char Char)
{uint8_t i;for (i = 0; i < 8; i++){OLED_Buffer[(Line- 1) * 2][(Column-1)*8+i] = OLED_F8x16[Char - ' '][i];//显示上半部分内容}for (i = 0; i < 8; i++){OLED_Buffer[((Line ) * 2) - 1][(Column-1)*8+i]= OLED_F8x16[Char - ' '][i+8];	//显示下半部分内容}
}
/*** @brief  快速的OLED显示字符串* @param  Line 起始行位置,范围:1~4* @param  Column 起始列位置,范围:1~16* @param  String 要显示的字符串,范围:ASCII可见字符* @retval 无*/
void OLED_FastShowString(uint8_t Line, uint8_t Column, char *String)
{uint8_t i;for (i = 0; String[i] != '\0'; i++){OLED_FastShowChar(Line, Column + i, String[i]);}
}
/*** @brief  快速的OLED显示数字* @param  Line 起始行位置,范围:1~4* @param  Column 起始列位置,范围:1~16* @param  Number 要显示的字数字,范围:数字,变量* @param  Length 数字长度* @retval 无*/
void OLED_FastShowNum(uint8_t Line, uint8_t Column, uint32_t Number, uint8_t Length)
{uint8_t i;for (i = 0; i < Length; i++){OLED_FastShowChar(Line, Column + i, Number / OLED_Pow(10, Length - i - 1) % 10 + '0');}
}
/** @brief 向OLED屏幕发送缓存区数据到OLED的0x40寄存器位置用以显示;*/
void Refresh()
{uint8_t j;uint8_t *pData;for(j=0;j<8;j++){pData = &OLED_Buffer[j][0];OLED_SetCursor(j,0);//开始显示HAL_I2C_Mem_Write(&Hardware_IIC_No,0x78,0x40,I2C_MEMADD_SIZE_8BIT,pData,128,0xff);}
}
/*** @brief  OLED初始化* @param  无* @retval 无*/
void OLED_Init(void)
{HAL_Delay(200);OLED_WriteCommand(0xAE);	//关闭显示OLED_WriteCommand(0xD5);	//设置显示时钟分频比/振荡器频率OLED_WriteCommand(0x80);OLED_WriteCommand(0xA8);	//设置多路复用率OLED_WriteCommand(0x3F);OLED_WriteCommand(0xD3);	//设置显示偏移OLED_WriteCommand(0x00);OLED_WriteCommand(0x40);	//设置显示开始行OLED_WriteCommand(0xA1);	//设置左右方向,0xA1正常 0xA0左右反置OLED_WriteCommand(0xC8);	//设置上下方向,0xC8正常 0xC0上下反置OLED_WriteCommand(0xDA);	//设置COM引脚硬件配置OLED_WriteCommand(0x12);OLED_WriteCommand(0x81);	//设置对比度控制OLED_WriteCommand(0xCF);OLED_WriteCommand(0xD9);	//设置预充电周期OLED_WriteCommand(0xF1);OLED_WriteCommand(0xDB);	//设置VCOMH取消选择级别OLED_WriteCommand(0x30);OLED_WriteCommand(0xA4);	//设置整个显示打开/关闭OLED_WriteCommand(0xA6);	//设置正常/倒转显示OLED_WriteCommand(0x8D);	//设置充电泵OLED_WriteCommand(0x14);OLED_WriteCommand(0xAF);	//开启显示OLED_Clear();				//OLED清屏
}

OLED.H

#ifndef __OLED_H
#define __OLED_H#include "main.h"#define Hardware_IIC_No hi2c1 /*选择自己使用的IIC号码*/void OLED_Init(void);
void OLED_Clear(void);
void OLED_ShowChar(uint8_t Line, uint8_t Column, char Char);//显示字符
void OLED_ShowString(uint8_t Line, uint8_t Column, char *String);//字符串
void OLED_ShowNum(uint8_t Line, uint8_t Column, uint32_t Number, uint8_t Length);//数字
void OLED_ShowSignedNum(uint8_t Line, uint8_t Column, int32_t Number, uint8_t Length);//负数
void OLED_ShowHexNum(uint8_t Line, uint8_t Column, uint32_t Number, uint8_t Length);//16进制数
void OLED_ShowBinNum(uint8_t Line, uint8_t Column, uint32_t Number, uint8_t Length);//二进制数
void OLED_ShowChinese(uint8_t Line, uint8_t Column, uint8_t CHN);
void OLED_ShowPicture(uint8_t Pic);//满屏幕显示照片
void OLED_FastShowPicture(uint8_t Pic);
void OLED_FastShowChar(uint8_t Line, uint8_t Column, char Char);
void OLED_FastShowString(uint8_t Line, uint8_t Column, char *String);
void OLED_FastShowNum(uint8_t Line, uint8_t Column, uint32_t Number, uint8_t Length);
void Refresh(void);
void DMA_Refresh(void);
uint32_t OLED_Pow(uint32_t X, uint32_t Y);#endif
http://www.shuangfujiaoyu.com/news/58526.html

相关文章:

  • 深圳企业登记注册抚顺seo
  • 焦作网站建设哪家正规哈尔滨seo优化软件
  • 南昌企业做网站公关公司排行榜
  • html个人网页完整代码模板seo营销培训
  • 广东网站设计费用制作一个网页的步骤
  • 微网站中定位功能怎么做的seo综合查询是什么意思
  • 网站全屏轮播怎么做百度互联网营销顾问
  • 专业做网站电话百度搜索引擎怎么做
  • 如何做输入密码进入网站网络服务器地址怎么查
  • 深圳深圳龙岗网站建设公司seo关键词优化怎么收费
  • 北海哪家做网站网站seo运营
  • 有域名有服务器如何做网站怎么免费创建网站
  • 连锁酒店网站方案百度网站下载安装
  • 小型旅游网站建设方案营销软文推广平台
  • 低价网站建设哪家更好流量平台排名
  • 哪里有网站制作平台说说seo论坛
  • 渭南市网站建设友链交易网
  • 霸州有做滤芯网站的吗营销宝
  • 0基础怎么做网站模版成都网站关键词推广优化
  • 从搜索引擎访问网站策划推广方案
  • 五指山网站开发价格seo策略
  • 乐清做网站的公司企业官方网站推广
  • wordpress福利网站源码海口百度seo公司
  • 网页生成链接淘宝优化
  • 网站建设地位成都网站优化平台
  • 网站优化对企业有什么好处提升seo排名平台
  • 深圳做人工智能芯片的公司沈阳seo排名收费
  • 做好的网站怎么演示怎么优化自己网站
  • 明天去广州需要隔离吗杭州seo外包
  • 做试试彩网站关注公众号推广2元一个