📄 oled_function.c
字号:
#include "OLED_function.h"
#include "hardware_defs.h"
#include "type_defs.h"
#include "font.h"
#define IO_IN 0
#define IO_OUT 1
INT8U ContrastValue = 90;
/*******************************************************************************
OLED初始化
********************************************************************************/
void Init_OLED(void)
{
OLEDPortInit();
OLED_RST_HIGH;
OLED_CS_HIGH;
OLED_DC_HIGH;
OLED_DATA_HIGH;
OLED_CLK_HIGH;
OLED_PWR_LOW;
ResetOLED();
/* OLEDWriteCom(0xAE);
OLEDWriteCom(0xAD); //dc-dc off
OLEDWriteCom(0x8a);
halWait(100);
OLEDWriteCom(0x00);
OLEDWriteCom(0x10);
OLEDWriteCom(0x40);
OLEDWriteCom(0x81);
OLEDWriteCom(ContrastValue);
OLEDWriteCom(0xA0);
OLEDWriteCom(0xA4);
OLEDWriteCom(0xA6);
OLEDWriteCom(0xA8);
OLEDWriteCom(0x3f);
OLEDWriteCom(0xD3);
OLEDWriteCom(0x00);
OLEDWriteCom(0xD5);
OLEDWriteCom(0x20);
OLEDWriteCom(0xD8);
OLEDWriteCom(0x00);
OLEDWriteCom(0xDA);
OLEDWriteCom(0x12);
OLEDWriteCom(0xDB);
OLEDWriteCom(0x00);
OLEDWriteCom(0xD9);
OLEDWriteCom(0x22);
OLEDWriteCom(0xc8);
OLEDWriteCom(0xAF);*/
OLEDWriteCom(0xae);//(display on)
OLEDWriteCom(0x00);//set low column address
OLEDWriteCom(0x10);//set high column address
OLEDWriteCom(0x40);//(display start set)
OLEDWriteCom(0x2e);//(stop horzontal scroll)
OLEDWriteCom(0xb0);//(page address)
OLEDWriteCom(0x81);//(set contrast control register)
OLEDWriteCom(ContrastValue);
OLEDWriteCom(0xa1);//(set segment re-map)
OLEDWriteCom(0xa4);//(normal display mode)
OLEDWriteCom(0xa6);//(set normal/inverse display)
OLEDWriteCom(0xa8);//(set multiplex ratio)
OLEDWriteCom(0x3f);
OLEDWriteCom(0xd3);//(set display offset)
OLEDWriteCom(0x00);
OLEDWriteCom(0xad);//(set dc-dc on/off)
OLEDWriteCom(0x8e);//
OLEDWriteCom(0xc8);//(set com output scan direction)
OLEDWriteCom(0xd5);//(set display clock divide ratio/oscillator/frequency)
OLEDWriteCom(0xf0);//
OLEDWriteCom(0xd8);//(set area color mode on/off & low power display mode )
OLEDWriteCom(0x05);//
OLEDWriteCom(0xd9);//(set pre-charge period)
OLEDWriteCom(0xc2);
OLEDWriteCom(0xda);//(set com pins hardware configuration)
OLEDWriteCom(0x12);
OLEDWriteCom(0xdb);//(set vcom deselect level)
OLEDWriteCom(0x08);
OLEDWriteCom(0xaf);//(display on)
ClearScreen();
}
/*********************************************************************
//LCD 端口社初始化
*********************************************************************/
void OLEDPortInit(void)
{
IO_DIR_PORT_PIN(1, 0, IO_OUT); //RES控制端为输出
IO_DIR_PORT_PIN(1, 1, IO_OUT); //CS控制端为输出
IO_DIR_PORT_PIN(1, 2, IO_OUT); //DC控制端为输出
IO_DIR_PORT_PIN(1, 3, IO_OUT); //PWR控制端为输出
IO_DIR_PORT_PIN(2, 0, IO_OUT); //DATA数据端为输出
IO_DIR_PORT_PIN(2, 1, IO_OUT); //CLK控制端为输出
}
/***********************************************************************
//OLED重启
***********************************************************************/
void ResetOLED(void)
{
OLED_RST_LOW;
OLED_Delay_ms(10);
OLED_RST_HIGH;
}
/************************************************************************
//OLED延时
************************************************************************/
void OLED_Delay_ms(UINT16 num_ms)
{
UINT16 i;
for(i=0;i<num_ms;i++)
OLED_Delay_us(1000);
}
void OLED_Delay_us(UINT16 num_us)
{
UINT16 i;
for(i=0;i<num_us;i++);
{
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
}
}
/**************************************************************************
//OLED写指令
**************************************************************************/
void OLEDWriteCom(UINT8 command)
{
INT8U i, temp;
OLED_CLK_LOW;
OLED_CS_LOW;
OLED_DC_LOW;
temp = command;
for(i=0; i<8; i++)
{
if(temp & 0x80)
{
OLED_DATA_HIGH;
}
else OLED_DATA_LOW;
temp <<= 1;
OLED_CLK_HIGH;
asm("nop");
asm("nop");
OLED_CLK_LOW;
}
OLED_CS_HIGH;
}
/**********************************************************************
//OLED写数据
**********************************************************************/
void OLEDWriteData(UINT8 data)
{
INT8U i, temp;
OLED_CLK_LOW;
OLED_CS_LOW;
OLED_DC_HIGH;
temp = data;
for(i=0; i<8; i++)
{
if(temp & 0x80)
{
OLED_DATA_HIGH;
}
else OLED_DATA_LOW;
temp <<= 1;
OLED_CLK_HIGH;
asm("nop");
asm("nop");
OLED_CLK_LOW;
}
OLED_CS_HIGH;
}
/**********************************************************************
//OLED清屏
**********************************************************************/
void ClearScreen(void)
{
INT8U i , j;
for (i = 0 ; i < 8 ; i++)
{
SetRamAddr(i,0);
for (j=0;j<132; j++) OLEDWriteData(0x00);
}
}
/*******************************************************************************
//OLED RAM位置选择
********************************************************************************/
void SetRamAddr (INT8U Page, INT8U Col)
{
OLEDWriteCom(0xB0 + Page);
OLEDWriteCom(Col & 0x0f); //Set lower column address
OLEDWriteCom(0x10 | ((Col & 0xf0) >> 4)); //Set higher column address
}
/*******************************************************************************
//OLED字符汉字显示判断
********************************************************************************/
void Print(INT8U y, INT8U x, INT8U ch[], INT16U yn)
{
INT8U ch2[3];
INT8U ii;
ii = 0;
while(ch[ii] != '\0')
{
if(ch[ii] > 127)
{
ch2[0] = ch[ii];
ch2[1] = ch[ii + 1];
ch2[2] = '\0'; //汉字为两个字节
Print16(y , x , ch2 , yn); //显示汉字
x += 16;
ii += 2;
}
else
{
ch2[0] = ch[ii];
ch2[1] = '\0'; //字母占一个字节
Print8(y , x , ch2 , yn); //显示字母
x += 8;
ii += 1;
}
}
}
/*******************************************************************************
//OLED字符显示
********************************************************************************/
void Print8(INT16U y,INT16U x, INT8U ch[],INT16U yn)
{
INT8U wm ,ii = 0;
INT16U adder;
while(ch[ii] != '\0')
{
adder = (ch[ii] - 0x20) * 16;
SetRamAddr(y , x);
for(wm = 0;wm < 8;wm++)
{
if(yn == 0)
{
OLEDWriteData(~Font8X8[adder]);
}
else
{
OLEDWriteData(Font8X8[adder]);
}
adder += 1;
}
SetRamAddr(y + 1 , x);
for(wm = 0;wm < 8;wm++)
{
if(yn == 0)
{
OLEDWriteData(~Font8X8[adder]);
}
else
{
OLEDWriteData(Font8X8[adder]);
}
adder += 1;
}
ii += 1;
x += 8;
}
}
/*******************************************************************************
//函数名:void Print16(INT16U y,INT16U x,INT8U ch[],INT16U yn)
//功能:在屏幕上显示汉字
//输入:x ,y 坐标,ch[]待显示的汉字,yn是否反黑
//输出:无
********************************************************************************/
void Print16(INT16U y,INT16U x, INT8U ch[], INT16U yn)
{
INT8U wm ,ii = 0;
INT16U adder;
wm = 0;
adder = 1;
while(FontNew8X16_Index[wm] > 0x7f)
{
if(FontNew8X16_Index[wm] == ch[ii])
{
if(FontNew8X16_Index[wm + 1] == ch[ii + 1])
{
adder = wm * 16;
break;
}
}
wm += 2; //找到汉字在索引中的位置
}
SetRamAddr(y , x);
if(adder != 1) //找到汉字,显示出来
{
SetRamAddr(y , x);
for(wm = 0;wm < 16;wm++)
{
if(yn == 0)
{
OLEDWriteData(~FontNew16X16[adder]);
}
else
{
OLEDWriteData(FontNew16X16[adder]);
}
adder += 1;
}
SetRamAddr(y + 1 , x);
for(wm = 0;wm < 16;wm++)
{
if(yn == 0)
{
OLEDWriteData(~FontNew16X16[adder]);
}
else
{
OLEDWriteData(FontNew16X16[adder]);
}
adder += 1;
}
}
else //找不到字显示空格
{
ii += 1;
SetRamAddr(y , x);
for(wm = 0;wm < 16;wm++)
{
if(yn == 0)
{
OLEDWriteData(0xff);
}
else
{
OLEDWriteData(0x00);
}
}
SetRamAddr(y + 1 , x);
for(wm = 0;wm < 16;wm++)
{
if(yn == 0)
{
OLEDWriteData(0xff);
}
else
{
OLEDWriteData(0x00);
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -