#include "OLED.h"
#include "OLED_FONT.h"
#include "OLED_FONT_CHINESE.h"
#include <stdarg.h>
#include <string.h>
#include <stdio.h>
typedef enum
{
CMD =0u,//命令时为低电平
DATA =1u,//数据时为高电平
}CMD_OR_DATA;
static const struct{
uint8_t width;
uint8_t height;
const unsigned char *pData;
}Font[] =
{
{.width=6,.height= 8,.pData= &ASCII_6X8[0][0]},
{.width=8,.height=16,.pData=&ASCII_8X16[0][0]},
{.width=16,.height=16,.pData=&CHINESE_16X16[0][0]},
};
#ifdef OLED_RAM //开启显存
static uint8_t OLED_RAM_DATA[(OLED_HEIGHT/8)][OLED_WIDTH] ={0}; //显存
static uint8_t line_position = 0,row_position = 0; //光标位置
#endif
static void OLED_SetPosition(uint8_t line,uint8_t x); //设置坐标
/*******************************************************************************
* 函数名称:OLED_PORT_Init(void)
* 功能说明:OLED端口初始化程序
* 参数说明:无
* 函数返回:无
* 使用示例:
********************************************************************************/
void OLED_PORT_Init(void)
{
#if(OLEDHardWareSPI)
OLEDHardWareSPI_Init();
#else
GPIO_Init(OLED_SCL_PORT,OLED_SCL_PIN,GPO);
GPIO_Init(OLED_SDA_PORT,OLED_SDA_PIN,GPO);
#endif
GPIO_Init(OLED_RST_PORT,OLED_RST_PIN,GPO);
GPIO_Init(OLED_DC_PORT ,OLED_DC_PIN ,GPO);
}
/*******************************************************************************
* 函数名称:OLED_WriteByte(CMD_OR_DATA DCvalue,uint8_t data)
* 功能说明:OLED发送一字节数据
* 参数说明:CMD_OR_DATA DCvalue:命令或数据
uint8_t data :发送的数据
* 函数返回:无
* 使用示例:
********************************************************************************/
void OLED_WriteByte(CMD_OR_DATA DCvalue,uint8_t data)
{
uint8_t i;
OLED_DC = DCvalue; //DCvalue是1DC就为1 不是1DC就为0 1是数据 0是命?
#ifdef OLED_RAM //如果开启显存
if(DCvalue == DATA) //发送数据时更新
{
OLED_RAM_DATA[line_position][row_position++] = data;
if(row_position > 127)
{
row_position = 0;
line_position ++;
}
}
#endif
#if(OLEDHardWareSPI)
OLEDHardWareSPI_SendByte(data);
#else
OLED_SCL=0;
for(i=0;i < 8;i++)
{
OLED_SDA = (data&0x80) ? 1 : 0;//上升沿发送数据
OLED_SCL = 1;
OLED_SCL = 0;
data <<= 1;
}
#endif
}
/*******************************************************************************
* 函数名称:OLED_SetPosition(uint8_t line,uint8_t x)
* 功能说明:OLED设置光标位置
* 参数说明:uint8_t line:行位置(0-7)
uint8_t x :列位置(0-127)
* 函数返回:无
* 使用示例:
********************************************************************************/
void OLED_SetPosition(uint8_t line,uint8_t x)
{
OLED_WriteByte(CMD,0xB0+line); //设置行
OLED_WriteByte(CMD,x&0x0F); //设置某列的低四位地址 0x00-0x0F
OLED_WriteByte(CMD,(x>>4)|0x10); //设置某列的高四位地址 0x10-0x1F
#ifdef OLED_RAM //如果开启显存
line_position = line;
row_position = x;
#endif
}
/*******************************************************************************
* 函数名称:OLED_DrawPoint(uint8_t x,uint8_t y,uint8_t value)
* 功能说明:OLED在某一位置画点,需要开启显存
* 参数说明:
uint8_t x:列位置(0-127)
uint8_t y:行位置(0-64)
uint8_t value:该点是否显示(0:不显示,1:显示)
* 函数返回:无
* 使用示例:
********************************************************************************/
#ifdef OLED_RAM //开启显存
void OLED_DrawPoint(uint8_t x,uint8_t y,uint8_t value)
{
uint8_t data_temp; //data1 当前点的数据
uint8_t line = y/8;
data_temp = OLED_RAM_DATA[line][x];
if(value)
data_temp |= 0x01<<(y%8);
else
data_temp &= ~(0x01<<(y%8));
OLED_SetPosition(line,x);
OLED_WriteByte(DATA,data_temp);
}
#endif
/*******************************************************************************
* 函数名称:OLED_FillRect(uint8_t x0,uint8_t y0,uint8_t x1,uint8_t y1,uint8_t data)
* 功能说明:OLED填充某一矩形区域
* 参数说明:uint8_t line:行位置(0-7)
uint8_t x :列位置(0-127)
uint8_t data:该区域是否显示(0:不显示,1:显示)
* 函数返回:无
* 使用示例:
********************************************************************************/
#ifdef OLED_RAM //开启显存
void OLED_FillRect(uint8_t x0,uint8_t y0,uint8_t x1,uint8_t y1,uint8_t data)
{
uint8_t y,x;
for(y=y0;y <= y1;y++)
{
for(x=x0;x <= x1;x++)
{
OLED_DrawPoint(x,y,data);
}
}
}
#endif
/*******************************************************************************
* 函数名称:OLED_FillPart(uint8_t x0,uint8_t line0,uint8_t x1,uint8_t line1,uint8_t data)
* 功能说明:OLED填充某一矩形区域
* 参数说明:
uint8_t x0 :列起始位置(0-127)
uint8_t line0:行起始位置(0-7)
uint8_t x1 :列结束位置(0-127)
uint8_t line1:行结束位置(0-7)
uint8_t data:该区域是否显示(0:不显示,1:显示)
* 函数返回:无
* 使用示例:OLED_FillPart(0,0,OLED_WIDTH,7,0); //清屏
********************************************************************************/
void OLED_FillPart(uint8_t x0,uint8_t line0,uint8_t x1,uint8_t line1,uint8_t data)
{
uint8_t line,x;
data = data ? 0xff : 0x00;
for(line=line0;line <= line1;line++)
{
OLED_SetPosition(line,x0);
for(x=x0;x < x1;x++)
{
#ifdef OLED_RAM //开启显存
OLED_RAM_DATA[line][x] = 0;
#endif
OLED_WriteByte(DATA,data);
}
}
}
/*******************************************************************************
* 函数名称:OLED_Clear(void)
* 功能说明:OLED清屏,如果开启显存,则同样清零
* 参数说明:无
* 函数返回:无
* 使用示例:
********************************************************************************/
void OLED_Clear(void)
{
int line,x;
for(line=0;line < (OLED_HEIGHT/8);line++)
{
OLED_SetPosition(line,0);
for(x=0;x<OLED_WIDTH;x++)
{
#ifdef OLED_RAM //开启显存
OLED_RAM_DATA[line][x] = 0;
#endif
OLED_WriteByte(DATA,0);
}
}
}
/*******************************************************************************
* 函数名称:OLED_Init(void)
* 功能说明:OLED初始化
* 参数说明:无
* 函数返回:无
* 使用示例:
********************************************************************************/
void OLED_Init(void)
{
uint16_t i;
OLED_PORT_Init();
// OLED_CS = 0; //芯片选择输入 低电平使能
OLED_RST=0; //复位信号,不可省略
for(i=0;i<10000;i++);
OLED_RST=1;
OLED_WriteByte(CMD,0xA8); //set Multiplex Ratio
OLED_WriteByte(CMD,0x3F);
OLED_WriteByte(CMD,0xD3); //设置显示偏移
OLED_WriteByte(CMD,0x00);
OLED_WriteByte(CMD,0x40); //设置开始显示行
OLED_WriteByte(CMD,0xA1); //设置段重映射 A0h/A1h
OLED_WriteByte(CMD,0xC8); //设置COM的扫描方向 C0h/C8h
OLED_WriteByte(CMD,0xDA); //设置COM管脚的硬件配置
OLED_WriteByte(CMD,0x12);
OLED_WriteByte(CMD,0x81); //设置对比度
OLED_WriteByte(CMD,0x7F);
OLED_WriteByte(CMD,0xA4); //禁止屏幕显示
OLED_WriteByte(CMD,0xA6); //设置正常显示
OLED_WriteByte(CMD,0xD5); //设置OSC频率
OLED_WriteByte(CMD,0x80);
OLED_WriteByte(CMD,0x8D); //Enable charge pupm regulator
OLED_WriteByte(CMD,0x14);
OLED_WriteByte(CMD,0xAF); //开显示
OLED_Clear(); //清屏
}
/*******************************************************************************
* 函数名称:OLED_DispChar(OLED_FONT font,uint8_t line,uint8_t x,char ascii)
* 功能说明:OLED显示一个字符
* 参数说明:OLED_FONT font:字体(OLED_FONT枚举)
uint8_t line:行位置(0-7)
uint8_t x :列位置(0-127)
char ascii :要显示的字符
* 函数返回:无
* 使用示例:
*******
评论0