STM32F103C8T6驱动6线OLED(SPI通讯)
传送门:Arduino使用u8g2库函数驱动4线/6线OLED屏幕(I2C/SPI通讯)附带库函数详解 【点击进入】
一、0.96寸SSD1306原理图(默认为SPI)
二、OLED硬件介绍及控制方式
建议直接观看【正点原子】推出的视频讲解:【点击进入】
三、程序控制
- OLED 更新缓存,显示内容
u8 OLED_GRAM[128][8];
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); }
}
- 向OLED写入一个字节
//dat:要写入的数据/命令
//cmd:数据/命令标志 0,表示命令;1,表示数据;
void OLED_WR_Byte(u8 dat,u8 cmd)
{ u8 i; if(cmd)OLED_RS_Set();else OLED_RS_Clr(); for(i=0;i<8;i++){ OLED_SCLK_Clr();if(dat&0x80)OLED_SDIN_Set();else OLED_SDIN_Clr();OLED_SCLK_Set();dat<<=1; } OLED_RS_Set();
}
3.开启OLED显示
void OLED_Display_On(void)
{OLED_WR_Byte(0X8D,OLED_CMD); //SET DCDC命令OLED_WR_Byte(0X14,OLED_CMD); //DCDC ONOLED_WR_Byte(0XAF,OLED_CMD); //DISPLAY ON
}
4.关闭OLED显示
void OLED_Display_Off(void)
{OLED_WR_Byte(0X8D,OLED_CMD); //SET DCDC命令OLED_WR_Byte(0X10,OLED_CMD); //DCDC OFFOLED_WR_Byte(0XAE,OLED_CMD); //DISPLAY OFF
}
5.清屏函数
void OLED_Clear(void)
{ u8 i,n; for(i=0;i<8;i++)for(n=0;n<128;n++)OLED_GRAM[n][i]=0X00; OLED_Refresh_Gram();//更新显示
}
6.功能函数
//画点
//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;
}//在指定位置显示一个字符,包括部分字符
//x:0~127
//y:0~63
//mode:0,反白显示;1,正常显示
//size:选择字体 16/12
void OLED_ShowChar(u8 x,u8 y,u8 chr,u8 size,u8 mode)
{ u8 temp,t,t1;u8 y0=y;chr=chr-' ';//得到偏移后的值 for(t=0;t<size;t++){ if(size==12)temp=oled_asc2_1206[chr][t]; //调用1206字体else temp=oled_asc2_1608[chr][t]; //调用1608字体 for(t1=0;t1<8;t1++){if(temp&0x80)OLED_DrawPoint(x,y,mode);else OLED_DrawPoint(x,y,!mode);temp<<=1;y++;if((y-y0)==size){y=y0;x++;break;}} }
}
//m^n函数
u32 oled_pow(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_ShowNumber(u8 x,u8 y,u32 num,u8 len,u8 size)
{ u8 t,temp;u8 enshow=0; for(t=0;t<len;t++){temp=(num/oled_pow(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); }
}
//显示字符串
//x,y:起点坐标
//*p:字符串起始地址
//用16字体
void OLED_ShowString(u8 x,u8 y,const u8 *p)
{#define MAX_CHAR_POSX 122
#define MAX_CHAR_POSY 58 while(*p!='\0'){ if(x>MAX_CHAR_POSX){x=0;y+=16;}if(y>MAX_CHAR_POSY){y=x=0;OLED_Clear();}OLED_ShowChar(x,y,*p,12,1); x+=8;p++;}
}
四、效果展示
1.主函数
int main(void)
{ Stm32_Clock_Init(9); //=====系统时钟设置JTAG_Set(JTAG_SWD_DISABLE); //=====关闭JTAG接口JTAG_Set(SWD_ENABLE); //=====打开SWD接口 可以利用主板的SWD接口调试delay_init(72); //=====延时初始化OLED_Init(); //=====OLED初始化while(1){ OLED_ShowString(50,0,"*****");OLED_ShowString(0,15,"*****");OLED_ShowString(35,30,"*****");OLED_ShowString(15,45,"*****");OLED_Refresh_Gram();delay_ms(50);}
}
2.引脚定义(oled.h)
#ifndef __OLED_H
#define __OLED_H
#include "sys.h"//-----------------OLED端口定义----------------
#define OLED_SCLK_Clr() PBout(5)=0 //SCL
#define OLED_SCLK_Set() PBout(5)=1 //SCL#define OLED_SDIN_Clr() PBout(4)=0 //SDA
#define OLED_SDIN_Set() PBout(4)=1 //SDA#define OLED_RST_Clr() PBout(3)=0 //RST
#define OLED_RST_Set() PBout(3)=1 //RST#define OLED_RS_Clr() PAout(15)=0 //DC
#define OLED_RS_Set() PAout(15)=1 //DC#define OLED_CMD 0 //写命令
#define OLED_DATA 1 //写数据
//OLED控制用函数
void OLED_WR_Byte(u8 dat,u8 cmd);
void OLED_Display_On(void);
void OLED_Display_Off(void);
void OLED_Refresh_Gram(void);
void OLED_Init(void);
void OLED_Clear(void);
void OLED_DrawPoint(u8 x,u8 y,u8 t);
void OLED_ShowChar(u8 x,u8 y,u8 chr,u8 size,u8 mode);
void OLED_ShowNumber(u8 x,u8 y,u32 num,u8 len,u8 size);
void OLED_ShowString(u8 x,u8 y,const u8 *p);
#endif
详情请关注亿航创客官方抖音账号:EhangGroup
STM32F103C8T6驱动6线OLED(SPI通讯)相关推荐
- Arduino使用u8g2库函数驱动4线/6线OLED屏幕(I2C/SPI通讯)附带库函数详解
话不多说,直接入正题: 常见的OLED通常有两种样式,如下图所示,分别是4线和6线控制 本人几乎浏览了网上所有关于控制OLED模块的教程,并都经过了项目实测:大力推荐u8g2这个库函数来控制,文章末尾 ...
- stm32硬件SPI驱动3线SPI-LCD的方法
1.基本控制原理 三线SPI LCD, 顾名思义,最少只需要3个IO控制LCD显示,如果采用硬件控制上电时序和背光,最少只需要接SCK,CS,MOSI三个引脚即可控制LCD,并且不管接不接其他引脚,控 ...
- STM32——驱动7引脚OLED
STM32驱动7引脚的OLED 寒假在家里无聊又不能出门,开学可能还延迟了(新型肺炎最近比较猖狂)武汉加油!陕西加油!全国一起加油!一定要减少出门啊!!! 放假前带了一个OLED屏幕,想着刚好没有接触 ...
- 详细介绍GPIO、I2C、SPI通讯原理以及物理层原理
目录 一. GPIO 1. 什么是GPIO? 2. GPIO组成原理 3. GPIO工作原理 二. I2C 1. 什么是I2C? 2. I2C组成原理 3. I2C的特性 4. I2C的通讯模式 5. ...
- 联盛德 HLK-W806 (六): I2C驱动SSD1306 128x64 OLED液晶屏
目录 联盛德 HLK-W806 (一): Ubuntu20.04下的开发环境配置, 编译和烧录说明 联盛德 HLK-W806 (二): Win10下的开发环境配置, 编译和烧录说明 联盛德 HLK-W ...
- SPI通讯原理,SPI驱动程序编写,EEPROM,Tja1145,CAN收发器驱动程序,嵌入式,单片机,软件
一.SPI通信原理讲解 0.架构讲解 1.通常CPU芯片(如TI的280049.英飞凌的TC234)中集成了SPI模块,CPU可使用SPI通讯模块实现与外部设备的通讯,如CPU与EEPROM模块的通讯 ...
- Linux驱动修炼之道-SPI驱动框架源码分析(上)
Linux驱动修炼之道-SPI驱动框架源码分析(上) SPI协议是一种同步的串行数据连接标准,由摩托罗拉公司命名,可工作于全双工模式.相关通讯设备可工作于m/s模式.主设备发起数据帧,允许多个从设 ...
- 加密芯片SPI通讯的调试
SPI是串行外设接口(Serial Peripheral Interface)的缩写.是Motorola公司推出的一种同步串行接口技术,是一种高速的.全双工,同步的通信总线. SPI的通信原理很简单, ...
- SPI通讯协议详解 基于STM32
SPI 协议简介 SPI 协议是由摩托罗拉公司提出的通讯协议 (Serial Peripheral Interface),即串行外围设备接口,是 一种高速全双工的通信总线.它被广泛地使用在 ADC.L ...
最新文章
- Rook存储:Kubernetes中最优秀的存储
- 基于耳-脑电图的脑机接口研究进展
- [恢]hdu 2077
- React + TypeScript 默认 Props 的处理
- leetcode176. 第二高的薪水(SQL)
- centos装java配件_CentOS安装JAVA
- Linux yum源码包安装和卸载
- android 的android httpClient详解
- android迷你世界助手52,迷你世界助手盒子刷迷你币
- Android人脸支付功能,OPPO Find X成为首款支持微信人脸支付的安卓手机
- jquery/zepto 圣诞节雪花飞扬
- python实现将不同的附件发邮件到不同的地区
- 最好用的 Base64 在线工具
- java SSM 框架 多数据源
- Java基础及API总结
- 华为回应员工辞职事件:否认规避劳动合同法
- WhatsUP启动出现错误解决办法
- XTTS迁移11g到19c
- Delphi/Lazarus/Pascal基于Castle Engine的IOS人体活动识别
- iOS 图表工具charts之LineChartView