热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

OLED复习

OLED复习OLED工作模式选择:4种模式通过模块的BS1BS2设置,BS1BS2的设置与模块接口的关系如下三个脚,中间的TP引脚接的是

OLED复习

OLED工作模式选择:4种模式通过模块的BS1/BS2设置,BS1/BS2的设置与模块接口的关系如下
在这里插入图片描述
在这里插入图片描述
三个脚,中间的TP引脚接的是OLED显示屏;LP接的是地;HP接的是VCC
在这里插入图片描述
CS:OLED片选信号。
WR:向OLED写入数据。
RD:从OLED读取数据。
D[7:0]:8位双向数据线。
RST(RES):硬复位OLED。
DC:命令/数据标志(0,读写命令;1,读写数据)。
OLED控制器为SSD1306,有时读有时写,因此需要DC引脚来作用。

模块的8080并口读/写的过程为:
先根据要写入/读取的数据的类型,设置DC为高(数据)/低(命令),然后拉低片选,选中SSD1306,接着我们根据是读数据,还是要写数据置RD/WR为低,然后:
1.读数据:在RD的上升沿, 使数据锁存到数据线(D[7:0])上;
2.写数据:在WR的上升沿,使数据写入到SSD1306里面;


并口写时序图在这里插入图片描述



并口读时序图这里是引用


OLED模块显存
SSD1306的显存总共12864bit大小,SSD将这些显存分成了8页(Page)。每页128字节,刚好是12864的点阵大小。
在这里插入图片描述
(每页包含8行,总共64行,操作是以页为单位来操作)
程序原理
在STM32的内部建立一个 缓存(例如一个共128*8个字节的数组),在每次修改的时候,只是修改STM32上的缓存(实际上就是SRAM,即修改数组的数据),在修改完了之后,一次性把STM32上的缓存数据写入到OLED的GRAM。缺点:无法适用于内存比较小的单片机,点阵可能过大。
SSD1306的命令
在这里插入图片描述
命令0X81:设置对比度。包含两个字节,第一个0X81为命令,随后发送的一个字节为要设置的对比度的值。这个值设置得越大屏幕就越亮。
命令0XAE/0XAF:0XAE为关闭显示命令;0XAF为开启显示命令。
命令0X8D:包含2个字节,第一个为命令字,第二个为设置值,第二个字节的BIT2表示电荷泵的开关状态,该位为1,则开启电荷泵,为0则关闭。在模块初始化的时候,这个必须要开启,否则是看不到屏幕显示的。
命令0XB0~B7:用于设置页地址,其低三位的值对应着GRAM的页地址。
命令0X00~0X0F:用于设置显示时的起始列地址低四位。
命令0X10~0X1F:用于设置显示时的起始列地址高四位。

OLED初始化过程
(1)复位SSD1306
(2)驱动IC初始化代码(一般要复位所有的寄存器)
(3)开启显示
(4)清0显存
(5)开始写入显示

//向SSD1306写入一个字节。
//dat:要写入的数据/命令
//cmd:数据/命令标志 0,表示命令;1,表示数据;
void OLED_WR_Byte(u8 dat,u8 cmd)
{DATAOUT(dat); if(cmd)OLED_RS_Set();//如果是命令,把D/C置高else OLED_RS_Clr(); //若是数据,D/C置低OLED_CS_Clr();//片选置低//先把置低再拉高,上升沿时进行数据传输写数据OLED_WR_Clr();OLED_WR_Set();OLED_CS_Set(); //把片选再拉高,等待后续操作OLED_RS_Set(); //再拉高D/C,等待下次甄别数据还是命令信号
}

OLED更新缓存,写入并显示内容

//建立阵列,每个数据表示显存的一个点
u8 OLED_GRAM[128][8]; void OLED_Refresh_Gram(void)
{u8 i,n; //写页for(i&#61;0;i<8;i&#43;&#43;) { OLED_WR_Byte (0xb0&#43;i,OLED_CMD); //设置页地址&#xff08;0~7&#xff09;OLED_WR_Byte (0x00,OLED_CMD); //设置显示位置—列低地址OLED_WR_Byte (0x10,OLED_CMD); //设置显示位置—列高地址 for(n&#61;0;n<128;n&#43;&#43;)OLED_WR_Byte(OLED_GRAM[n][i],OLED_DATA); }
}

使用时&#xff0c;更新的缓存即对上面的数组进行操作&#xff0c;要进行显示则需要调用上图的函数写入显存。
OLED画点函数

void OLED_DrawPoint(u8 x,u8 y,u8 t)
{u8 pos,bx,temp&#61;0;if(x>127||y>63)return;//超出范围了.pos&#61;7-y/8;bx&#61;y%8;temp&#61;1<<(7-bx);if(t)OLED_GRAM[x][pos]|&#61;temp;else OLED_GRAM[x][pos]&&#61;~temp;
}

OLED字符显示函数

//在指定位置显示一个字符,包括部分字符
//x:0~127 y:0~63
//mode:0,反白显示;1, size:选择字体 12/16/24
void OLED_ShowChar(u8 x,u8 y,u8 chr,u8 size,u8 mode)
{ u8 temp,t,t1; u8 y0&#61;y;u8 csize&#61;(size/8&#43;((size%8)?1:0))*(size/2); //得到字体一个字符对应点阵集所占的字节数chr&#61;chr-&#39; &#39;;//得到偏移后的值&#xff0c;其实是减ASCII码得到是啥 for(t&#61;0;t<csize;t&#43;&#43;){ if(size&#61;&#61;12)temp&#61;asc2_1206[chr][t]; //调用1206字体else if(size&#61;&#61;16)temp&#61;asc2_1608[chr][t]; //调用1608字体else if(size&#61;&#61;24)temp&#61;asc2_2412[chr][t]; //调用2412字体else return; //没有的字库for(t1&#61;0;t1<8;t1&#43;&#43;){if(temp&0x80)OLED_DrawPoint(x,y,mode);else OLED_DrawPoint(x,y,!mode);temp<<&#61;1;y&#43;&#43;;if((y-y0)&#61;&#61;size){y&#61;y0;x&#43;&#43;; break;}} }
}
//码表&#xff08;部分&#xff09;一个字符占用16个字节
const unsigned char oled_asc2_1206[95][12]&#61;{
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*" ",0*/
{0x18,0x00,0x24,0xC0,0x1B,0x00,0x0D,0x80,0x32,0x40,0x01,0x80},/*"%",5*/
{0x03,0x80,0x1C,0x40,0x27,0x40,0x1C,0x80,0x07,0x40,0x00,0x40},/*"&",6*/

{0x00,0x00,0x03,0x80,0x04,0x40,0x04,0x40,0x06,0x40,0x00,0x00},/*"c",67*/
{0x00,0x00,0x03,0x80,0x04,0x40,0x24,0x40,0x3F,0xC0,0x00,0x40},/*"d",68*/

{0x00,0x00,0x40,0x20,0x7B,0xE0,0x04,0x00,0x00,0x00,0x00,0x00},/*"}",93*/
{0x40,0x00,0x80,0x00,0x40,0x00,0x20,0x00,0x20,0x00,0x40,0x00},/*"~",94*/
};
const unsigned char oled_asc2_1608[95][16]&#61;{
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*" ",0*/
{0x0F,0x00,0x10,0x84,0x0F,0x38,0x00,0xC0,0x07,0x78,0x18,0x84,0x00,0x78,0x00,0x00},/*"%",5*/
{0x00,0x78,0x0F,0x84,0x10,0xC4,0x11,0x24,0x0E,0x98,0x00,0xE4,0x00,0x84,0x00,0x08},/*"&",6*/

{0x00,0x00,0x1C,0x00,0x10,0x00,0x10,0xFC,0x13,0x00,0x1C,0x00,0x10,0x00,0x00,0x00},/*"7",23*/
{0x00,0x00,0x0E,0x38,0x11,0x44,0x10,0x84,0x10,0x84,0x11,0x44,0x0E,0x38,0x00,0x00},/*"8",24*/
{0x00,0x00,0x07,0x00,0x08,0x8C,0x10,0x44,0x10,0x44,0x08,0x88,0x07,0xF0,0x00,0x00},/*"9",25*/
}

推荐阅读
author-avatar
扬帆900
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有