【STM32】0.96寸OLED显示屏(7针SPI协议)软件模拟SPI

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进行处理,非常感谢!

上一篇 2020年1月11日
下一篇 2020年1月11日

相关推荐