Author:AXYZdong
自动化专业 工科男
有一点思考,有一点想法,有一点理性
【自制展示】2020鼠年大吉
文章目录
- 概述
-
- 3.1硬件设计
- 3.2软件设计
-
- 3.2.1编程要点
- 3.2.2代码分析
-
- 1、OLED驱动头文件oled.h
- 2、OLED驱动文件oled.c
- 3、字库取模头文件oledfont.h
- 4、图片取模头文件bmp.h
- 4、主函数
概述
某宝上买的OLED,IIC/SPI都可以,买来看的时候发现背面焊的是SPI。板子上又没有硬件SPI,只好用软件模拟SPI。很久之前学的了,现在把它写在CSDN上,各位大佬如有什么想法,欢迎评论!(PS:文末会附上此工程的全部文件,欢迎下载交流)
3.1硬件设计
硬件方面不多讲,直接看某宝上图片。
3.2软件设计
3.2.1编程要点
1、初始化GPIO口来模拟SPI,每个人设置的GPIO口不同,开发板与OLED接线也会不同,所以在拿到别人的程序代码时,一定要看看ta是用那几个GPIO口来模拟的,不要看ta程序开头的注释,很有可能ta后面把模拟的GPIO口改过,而注释没改
2、OLED驱动程序,这里的驱动程序可以参考别人写的,然后自己再加以修改或者补充。
3、取模,包括文字取模和图片取模。根据自己的需要来取模。需要取模软件的可以私信我。
3.2.2代码分析
1、OLED驱动头文件oled.h
2、OLED驱动文件oled.c
#include "oled.h"#include "stdlib.h"#include "oledfont.h" #include "delay.h"//OLED的显存//存放格式如下.//[0]0 1 2 3 ... 127 //[1]0 1 2 3 ... 127 //[2]0 1 2 3 ... 127 //[3]0 1 2 3 ... 127 //[4]0 1 2 3 ... 127 //[5]0 1 2 3 ... 127 //[6]0 1 2 3 ... 127 //[7]0 1 2 3 ... 127 #if OLED_MODE==1//向SSD1106写入一个字节。//dat:要写入的数据/命令//cmd:数据/命令标志 0,表示命令;1,表示数据;void OLED_WR_Byte(u8 dat,u8 cmd){ DATAOUT(dat); if(cmd) OLED_DC_Set(); else OLED_DC_Clr(); OLED_CS_Clr(); OLED_WR_Clr(); OLED_WR_Set(); OLED_CS_Set(); OLED_DC_Set(); } #else//向SSD1106写入一个字节。//dat:要写入的数据/命令//cmd:数据/命令标志 0,表示命令;1,表示数据;void OLED_WR_Byte(u8 dat,u8 cmd){ u8 i; if(cmd) OLED_DC_Set(); else OLED_DC_Clr(); OLED_CS_Clr(); for(i=0;i8;i++) { OLED_SCLK_Clr(); if(dat&0x80)OLED_SDIN_Set(); else OLED_SDIN_Clr(); OLED_SCLK_Set(); dat1; } OLED_CS_Set(); OLED_DC_Set(); } #endif void OLED_Set_Pos(unsigned char x, unsigned char y) { OLED_WR_Byte(0xb0+y,OLED_CMD); OLED_WR_Byte(((x&0xf0)>>4)|0x10,OLED_CMD); OLED_WR_Byte((x&0x0f)|0x01,OLED_CMD); } //开启OLED显示 void OLED_Display_On(void){ OLED_WR_Byte(0X8D,OLED_CMD); //SET DCDC命令 OLED_WR_Byte(0X14,OLED_CMD); //DCDC ON OLED_WR_Byte(0XAF,OLED_CMD); //DISPLAY ON}//关闭OLED显示 void OLED_Display_Off(void){ OLED_WR_Byte(0X8D,OLED_CMD); //SET DCDC命令 OLED_WR_Byte(0X10,OLED_CMD); //DCDC OFF OLED_WR_Byte(0XAE,OLED_CMD); //DISPLAY OFF} //清屏函数,清完屏,整个屏幕是黑色的!和没点亮一样!!! void OLED_Clear(void) { u8 i,n; for(i=0;i8;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;n128;n++)OLED_WR_Byte(0,OLED_DATA); } //更新显示}//在指定位置显示一个字符,包括部分字符//x:0~127//y:0~63//mode:0,反白显示;1,正常显示 //size:选择字体 16/12 void OLED_ShowChar(u8 x,u8 y,u8 chr){ unsigned char c=0,i=0; c=chr-' ';//得到偏移后的值 if(x>Max_Column-1){x=0;y=y+2;} if(SIZE ==16) { OLED_Set_Pos(x,y); for(i=0;i8;i++) OLED_WR_Byte(F8X16[c*16+i],OLED_DATA); OLED_Set_Pos(x,y+1); for(i=0;i声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!