OLED显示实验(8080接口方式)
OLED接口说明
读写流程简述
先根据要写入/读取的数据的类型,设置 DC 为高(针对数据)/低(针对命令),然后拉低片选(选中 SSD1306芯片),接着我们根据是读数据,还是要写数据置 RD/WR为低或者高,如果是写数据或者写命令,就在RD的上升沿,使数据/命令锁存到数据线(D[7:0])上;如果是读数据或者读状态,就在WR的上升沿,使状态/数据所存至数据线(D[7:0])上。
SSD1306 的 8080 并口读写时序解析
OLED显存的排列
在单片机的内部建立一个OLED的GRAM(需要128*8 个字节),在每次修改的时候,只是修改单片机上的GRAM(实际上就是 SRAM),在修改完了之后,一次性把单片机内部的 GRAM写入到OLED的GRAM中。
OLED基本操作流程
OLED官方库函数的功能
OLED官方库函数解析
数据写入操作函数
//dat:要写入的数据/命令
//cmd:数据/命令标志 0,表示命令;1,表示数据;
void OLED_WR_Byte(u8 dat,u8 cmd)
{
DATAOUT(dat); // 以字节为单位写入PortC端口中
OLED_RS=cmd; // 写入数据/命令
OLED_CS=0; // 使能片选功能
OLED_WR=0;
OLED_WR=1; // WR=0,WR=1,是为了实现上升沿
OLED_CS=1; // 关闭片选段
OLED_RS=1; // DC电平恢复至初始状态
}
数据写入操作函数的使用
当我们在使用void OLED_Refresh_Gram(void) 函数将我们的128*8的数组写入OLED的GRAM中时,我们必须触发OLED中的WR的上升沿,以便将OLED的数据按字节为单位从D[7:0]写入OLED中。
//更新显存到LCD
void OLED_Refresh_Gram(void)
{
u8 i,n;
for(i=0;i<8;i++)
{
OLED_WR_Byte (0xb0+i,OLED_CMD); //设置页地址(0~7)
OLED_WR_Byte (0x00,OLED_CMD); //设置显示位置—列低地址
OLED_WR_Byte (0x10,OLED_CMD); //设置显示位置—列高地址
for(n=0;n<128;n++)OLED_WR_Byte(OLED_GRAM[n][i],OLED_DATA);
}
}
画点操作函数
//画点
//x:0~127
//y:0~63
//t:1 填充 0,清空
void OLED_DrawPoint(u8 x,u8 y,u8 t)
{
u8 pos,bx,temp=0;
if(x>127||y>63)return;//超出范围了.
pos=7-y/8; // 显示要画的点所在的页号
bx=y%8; // 当前页的行号
temp=1<<(7-bx); // 要明白为什么这样操作必须要明白取模方式
if(t)OLED_GRAM[x][pos]|=temp; // 填充
else OLED_GRAM[x][pos]&=~temp; // 清空
}
画点操作函数的使用
#include "oled.h"
#include "stm32f10x.h"
#include "delay.h"
int main()
{
u8 x=10, y=10, mode=1;
delay_init(); // 定时器初始化
OLED_Init(); // OLED初始化
delay_ms(10); // 等待初始化
while(1)
{
OLED_DrawPoint(x, y, mode);
x++;y++;
OLED_Refresh_Gram(); // 将数据更新至OLED的GRAM的缓存中
x &= 0x1F;
y &= 0x1F;
}
}
矩形区域填充函数解析
//x1,y1,x2,y2 填充区域的对角坐标
//确保x1<=x2;y1<=y2 0<=x1<=127 0<=y1<=63
//dot:0,清空;1,填充
void OLED_Fill(u8 x1,u8 y1,u8 x2,u8 y2,u8 dot)
{
u8 x,y;
for(x=x1;x<=x2;x++) // 进行行的填充
{
for(y=y1;y<=y2;y++) // 进行列的填充
OLED_DrawPoint(x,y,dot);
}
OLED_Refresh_Gram();//更新显示
}
矩形区域填充函数的使用
#include "oled.h"
#include "stm32f10x.h"
#include "delay.h"
int main()
{
u8 x=10, y=10, mode=1;
delay_init(); // 定时器初始化
OLED_Init(); // OLED初始化
delay_ms(10); // 等待初始化
while(1)
{
OLED_ShowString(10,10,"Hello World",16); // 用2412字体写入(单个字符占24行12列)
OLED_ShowString(10,26,"Today:",24); // 用1608字体写入(单个字符占16行8列)
OLED_Fill(10,50,30,70,1); // 填充(10,50)到(30,70)的区域
OLED_Refresh_Gram(); // 将128*64的数据装入OLED的GRAM中
}
}
显示字符函数
//在指定位置显示一个字符,包括部分字符
//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=y;
u8 csize=(size/8+((size%8)?1:0))*(size/2); //得到字体一个字符对应点阵集所占的字节数
chr=chr-' ';//得到偏移后的值
for(t=0;t if(size==12)temp=asc2_1206[chr][t]; //调用1206字体 else if(size==16)temp=asc2_1608[chr][t]; //调用1608字体 else if(size==24)temp=asc2_2412[chr][t]; //调用2412字体 else return; //没有的字库 for(t1=0;t1<8;t1++) // 显示一个字节的信息 { if(temp&0x80) // 判断最高位是否为1 OLED_DrawPoint(x,y,mode); else OLED_DrawPoint(x,y,!mode); temp<<=1; // 不断向左移位(与上面的判断相呼用来将temp中为1的点点亮) y++; if((y-y0)==size) // 当读到结尾就停(读取长度=字体的长度) { y=y0; // 从第一行开始读 x++; // 列+1 break; } } } } 显示字符函数的使用 #include "oled.h" #include "stm32f10x.h" #include "delay.h" int main() { u8 x=10, y=10, mode=1; delay_init(); // 定时器初始化 OLED_Init(); // OLED初始化 delay_ms(10); // 等待初始化 while(1) { OLED_ShowString(10,10,"Hello World",16); // 用1608字体写入(单个字符占16行8列) OLED_ShowChar(10,26,"T",24); // 用2412字体写入(单个字符占24行12列) OLED_Refresh_Gram(); // 将128*64的数据装入OLED的GRAM中 } } 显式数字的函数 //m^n函数 u32 mypow(u8 m,u8 n) { u32 result=1; while(n--)result*=m; return result; } //显示2个数字 //x,y :起点坐标 //len :数字的位数 //size:字体大小 //mode:模式 0,填充模式;1,叠加模式 //num:数值(0~4294967295); void OLED_ShowNum(u8 x,u8 y,u32 num,u8 len,u8 size) { u8 t,temp; u8 enshow=0; for(t=0;t temp=(num/mypow(10,len-t-1))%10; if(enshow==0&&t<(len-1)) { if(temp==0) { OLED_ShowChar(x+(size/2)*t,y,' ',size,1); continue; }else enshow=1; } OLED_ShowChar(x+(size/2)*t,y,temp+'0',size,1); // 显示数字对应的ASCII码
上一篇:“电容触摸按键实验”实例解析
下一篇:ST-LINK V2 无法下载程序相关问题
推荐阅读最新更新时间:2024-11-16 22:07
推荐帖子
- PCB的一个PPT教程,写得挺好的,新手可以一看。
- 适合新人!PCB的一个PPT教程,写得挺好的,新手可以一看。谢谢分享了!看是否真的绝对?但确实写得很好,初学入门很快,不熟练的也可以参考看了,PPT不错来看看啊,谢过!有没有提高篇的也可以上传来看看啊~!来看看啊,谢过!看看,感谢LZ分享哈哈哈哈下下来先看一下啊怎么收钱呢~~~谢谢!有DXP的没,最好有提高版谢谢分享了!来赞一个吧。看看,感谢LZ分享看看,感谢LZ分享新手学习一下!!!!学习一下!!!!谢谢楼主分享让我
- 371340158 PCB设计
- 电子测量仪器:市场需求继续扩大
- 作者:佚名阅读:934引用:0发布时间:2006-06-2811:31出处:中国机械网电子仪器是对物质世界的信息进行测量与控制的基本手段。它融合了微电子技术、计算机技术、通信技术、网络技术、新元器件新材料技术、现代测试技术、现代设计制造技术和现代工艺技术等,是现代工业产品中新技术应用最多、最快的产品之一。近年来,我国电子测量仪器行业在经过一段沉寂后,慢慢开始复苏。 生产与销售大幅增长 据中国电子仪器行业协会统计分析,2003年电子测量仪器工业
- fighting 测试/测量
- 关于2.4G无线模块|UART串口转数传收发问题
- 我的问题是:关于2.4G无线模块的收发问题。问题描述:我有三个数据采集需要,每个采集端我配了一个无线串口发送模块(附图),把UART串口数据转换成2.4G信号发送,但是我接收端也需要用同等型号的该无线串口发送模块进行接收么?如果是,我用一个可以接收三个发过来的信息么???我可以用一个类似网关的设备接收该3个模块发送的数据,然后传到我的已经联网的上位机上吗???有么有这种设备(并且配套了上位机软件)!谢谢解答。关于2.4G无线模块|UART串口转数传收发问题当然是可以的chen
- xueyongchao8805 RF/无线
- 求购二手AM335x Starter Kit 开发板
- 求购二手AM335xStarterKit开发板,QQ47152894手机:13198555416求购二手AM335xStarterKit开发板我有:qq,364810709我有364810709我有,364810709
- lx1314110 淘e淘
- 【HC32F460开发板测评】NO.5 GUIX的移植和应用
- AzureGUIX简介GUIX是微软的高级工业级GUI解决方案,专门针对深度嵌入式,实时和IoT应用程序而设计。微软还提供了名为GUIXStudio的桌面开发工具,该工具允许开发人员在桌面上设计其GUI并生成GUIX代码,然后可以将其导出到目标。GUIX通过了医疗认证IEC-62304ClassC,汽车认证IEC-61508ASILD,工业认证IEC-61508SIL4和运输/铁路认证EN50128。表明GUIX可用于安全
- yang377156216 国产芯片交流
- 保安队HMI开发板-STM32H7S7(焊接篇)
- MCU:STM32H7S7NORFLASH:MX25UW256PSRAM:APS256XXNEMMC:THGBMJG6C1LBAIL保安队HMI开发板-STM32H7S7(焊接篇)STM32H7S不是今年刚出的芯片吗?这就有人用上了? 趁热乎
- bloody41760 stm32/stm8