?? 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 + -