OLED 屏幕.c文件
ulong fontaddr = 0;
void Write_Command_OLED(int data1)
{
char i;
OLED_DC = 0;
OLED_CLK = 0;
for(i = 0; i < 8; i++)
{
if(data1 & 0x80)
{
OLED_MOS = 1;
}
else
{
OLED_MOS = 0;
}
OLED_CLK = 1;
_nop_();
OLED_CLK = 0;
data1 <<= 1;
}
}
void Write_Data_OLED(int data1)
{
char i;
OLED_DC = 1;
OLED_CLK = 0;
for(i = 0; i < 8; i++)
{
if(data1 & 0x80)
{
OLED_MOS = 1;
}
else
{
OLED_MOS = 0;
}
OLED_CLK = 1;
_nop_();
OLED_CLK = 0;
data1 <<= 1;
}
}
void Delay_Nms(int n_ms)
{
int j, k;
for(j = 0; j < n_ms; j++)
{
for(k = 0; k < 110; k++);
}
}
void Write_Address_OLED(uchar page, uchar column)
{
Write_Command_OLED(0xb0 + column);
Write_Command_OLED((((page + 2) & 0xf0) >> 4) | 0x10);
Write_Command_OLED(((page + 2) & 0x0f) | 0x00);
}
void Initial_OLED(void)
{
OLED_CS1 = 0;
Rom_CS = 1;
// OLED_reset=0;
Delay_Nms(20);
//OLED_reset=1;
Delay_Nms(20);
Write_Command_OLED(0xAE); //display off
Write_Command_OLED(0x20); //Set Memory Addressing Mode
Write_Command_OLED(0x10); //00,Horizontal Addressing Mode;01,Vertical Addressing Mode;10,Page Addressing Mode (RESET);11,Invalid
Write_Command_OLED(0xb0); //Set Page Start Address for Page Addressing Mode,0-7
Write_Command_OLED(0xc8); //Set COM Output Scan Direction
Write_Command_OLED(0x02); //---set low column address
Write_Command_OLED(0x10); //---set high column address
Write_Command_OLED(0x40); //--set start line address
Write_Command_OLED(0x81); //--set contrast control register
Write_Command_OLED(0x7f);
Write_Command_OLED(0xa1); //--set segment re-map 0 to 127
Write_Command_OLED(0xa6); //--set normal display
Write_Command_OLED(0xa8); //--set multiplex ratio(1 to 64)
Write_Command_OLED(0x3F); //
Write_Command_OLED(0xa4); //0xa4,Output follows RAM content;0xa5,Output ignores RAM content
Write_Command_OLED(0xd3); //-set display offset
Write_Command_OLED(0x00); //-not offset
Write_Command_OLED(0xd5); //--set display clock divide ratio/oscillator frequency
Write_Command_OLED(0xf0); //--set divide ratio
Write_Command_OLED(0xd9); //--set pre-charge period
Write_Command_OLED(0x22); //
Write_Command_OLED(0xda); //--set com pins hardware configuration
Write_Command_OLED(0x12);
Write_Command_OLED(0xdb); //--set vcomh
Write_Command_OLED(0x20); //0x20,0.77xVcc
Write_Command_OLED(0x8d); //--set DC-DC enable
Write_Command_OLED(0x14); //
Write_Command_OLED(0xaf); //--turn on OLED panel
OLED_CS1 = 1;
}
void OLED_CLEAR(void)
{
unsigned char i, j;
OLED_CS1 = 0;
Rom_CS = 1;
for(i = 0; i < 8; i++)
{
Write_Command_OLED(0xb0 + i);
Write_Command_OLED(0x02);
Write_Command_OLED(0x10);
for(j = 0; j < 132; j++)
{
Write_Data_OLED(0x00);
}
}
OLED_CS1 = 1;
}
void OLED_Display_Graphic_16x16(uint page, uint column, uchar *dp)
{
uint i, j;
OLED_CS1 = 0;
Rom_CS = 1;
for(j = 2; j > 0; j--)
{
Write_Address_OLED(column, page);
for (i = 0; i < 16; i++)
{
Write_Data_OLED(*dp);
dp++;
}
page++;
}
OLED_CS1 = 1;
}
void OLED_Display_Graphic_8x16(uint page, uchar column, uchar *dp)
{
uint i, j;
OLED_CS1 = 0;
for(j = 2; j > 0; j--)
{
Write_Address_OLED(column, page);
for (i = 0; i < 8; i++)
{
Write_Data_OLED(*dp);
}
page++;
}
OLED_CS1 = 1;
}
void Write_Command_ROM( uchar datu )
{
uchar i;
for(i = 0; i < 8; i++ )
{
if(datu & 0x80)
{
OLED_MOS = 1;
}
else
{
OLED_MOS = 0;
}
datu = datu << 1;
OLED_CLK = 0;
OLED_CLK = 1;
}
}
uchar Read_Data_From_ROM(void)
{
uchar i;
uchar ret_data = 0;
OLED_CLK = 1;
for(i = 0; i < 8; i++)
{
Rom_OUT = 1;
OLED_CLK = 0;
ret_data = ret_data << 1;
if( Rom_OUT )
{
ret_data = ret_data + 1;
}
else
{
ret_data = ret_data + 0;
}
OLED_CLK = 1;
}
return(ret_data);
}
void Read_N_Bytes_Data_From_ROM(uchar addrHigh, uchar addrMid, uchar addrLow, uchar *pBuff, uchar DataLen )
{
uchar i;
Rom_CS = 0;
OLED_CS1 = 1;
OLED_CLK = 0;
Write_Command_ROM(0x03);
Write_Command_ROM(addrHigh);
Write_Command_ROM(addrMid);
Write_Command_ROM(addrLow);
for(i = 0; i < DataLen; i++ )
{
*(pBuff + i) = Read_Data_From_ROM();
}
Rom_CS = 1;
}
/******************************************************************/
void OLED_Display_String(uchar y, uchar x, uchar *text)
{
uchar i = 0;
uchar addrHigh, addrMid, addrLow ;
uchar fontbuf[32];
while((text[i] > 0x00))
{
if(((text[i] >= 0xb0) && (text[i] <= 0xf7)) && (text[i + 1] >= 0xa1))
{
fontaddr = (text[i] - 0xb0) * 94;
fontaddr += (text[i + 1] - 0xa1) + 846;
fontaddr = (ulong)(fontaddr * 32);
addrHigh = (fontaddr & 0xff0000) >> 16;
addrMid = (fontaddr & 0xff00) >> 8;
addrLow = fontaddr & 0xff;
Read_N_Bytes_Data_From_ROM(addrHigh, addrMid, addrLow, fontbuf, 32 );
OLED_Display_Graphic_16x16(y, x, fontbuf);
i += 2;
x += 16;
}
else if(((text[i] >= 0xa1) && (text[i] <= 0xa3)) && (text[i + 1] >= 0xa1))
{
fontaddr = (text[i] - 0xa1) * 94;
fontaddr += (text[i + 1] - 0xa1);
fontaddr = (ulong)(fontaddr * 32);
addrHigh = (fontaddr & 0xff0000) >> 16;
addrMid = (fontaddr & 0xff00) >> 8;
addrLow = fontaddr & 0xff;
Read_N_Bytes_Data_From_ROM(addrHigh, addrMid, addrLow, fontbuf, 32 );
OLED_Display_Graphic_16x16(y, x, fontbuf);
i += 2;
x += 16;
}
else if((text[i] >= 0x20) && (text[i] <= 0x7e))
{
unsigned char fontbuf[16];
fontaddr = (text[i] - 0x20);
fontaddr = (unsigned long)(fontaddr * 16);
fontaddr = (unsigned long)(fontaddr + 0x3cf80);
addrHigh = (fontaddr & 0xff0000) >> 16;
addrMid = (fontaddr & 0xff00) >> 8;
addrLow = fontaddr & 0xff;
Read_N_Bytes_Data_From_ROM(addrHigh, addrMid, addrLow, fontbuf, 16 );
OLED_Display_Graphic_8x16(y, x, fontbuf);
i += 1;
x += 8;
}
else
{
i++;
}
}
}
void OLED_Display_Number(uchar y, uchar x, ulong Number)
{
uchar Number_String[10][2] = {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9"};
if(Number < 10)
{
OLED_Display_String(y, x, Number_String [Number]);
}
else if(Number < 100)
{
OLED_Display_String(y, x, Number_String[ Number / 10 % 10]);
OLED_Display_String(y, x + 8, Number_String[Number % 10]);
}
else if(Number < 1000)
{
OLED_Display_String(y, x, Number_String[Number / 100 % 10]);
OLED_Display_String(y, x + 1 * 8, Number_String [Number / 10 % 10]);
OLED_Display_String(y, x + 2 * 8, Number_String [Number % 10]);
}
else if(Number < 10000)
{
OLED_Display_String(y, x, Number_String [Number / 1000 % 10]);
OLED_Display_String(y, x + 1 * 8, Number_String [Number / 100 % 10]);
OLED_Display_String(y, x + 2 * 8, Number_String [Number / 10 % 10]);
OLED_Display_String(y, x + 3 * 8, Number_String [Number % 10]);
}
else if(Number < 100000)
{
OLED_Display_String(y, x, Number_String [Number / 10000 % 10]);
OLED_Display_String(y, x + 1 * 8, Number_String [Number / 1000 % 10]);
OLED_Display_String(y, x + 2 * 8, Number_String [Number / 100 % 10]);
OLED_Display_String(y, x + 3 * 8, Number_String [Number / 10 % 10]);
OLED_Display_String(y, x + 4 * 8, Number_String [Number % 10]);
}
else if(Number < 1000000)
{
OLED_Display_String(y, x, Number_String [Number / 100000 % 10]);
OLED_Display_String(y, x + 1 * 8, Number_String [Number / 10000 % 10]);
OLED_Display_String(y, x + 2 * 8, Number_String [Number / 1000 % 10]);
OLED_Display_String(y, x + 3 * 8, Number_String [Number / 100 % 10]);
OLED_Display_String(y, x + 4 * 8, Number_String [Number / 10 % 10]);
OLED_Display_String(y, x + 5 * 8, Number_String [Number % 10]);
}
}
void OLED_Display_Timer_Data(uchar y, uchar x, ulong Number)
{
uchar Number_String[10][2] = {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9"};
OLED_Display_String(y, x, Number_String[ Number / 10 % 10]);
OLED_Display_String(y, x + 8, Number_String[Number % 10]);
}
OLED 屏幕.h文件
#include<STC89C5xRC.H>
#include<intrins.h>
#ifndef __OLED_H__
#define __OLED_H__
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
#define OLED_CLK P20
#define OLED_MOS P21
#define OLED_DC P22
#define OLED_CS1 P23
#define Rom_OUT P24
#define Rom_CS P25
void Send_Command_To_OLED(int data1);
void Send_Data_To_OLED(int data1);
void Delay_Nms(int n_ms);
void Initial_OLED();
void Send_Address_To_OLED(uchar page, uchar column);
void OLED_Clear();
void OLED_OLED_Display_Graphic_16x16(uint page, uint column, uchar *dp);
void OLED_OLED_Display_Graphic_8x16(uint page, uchar column, uchar *dp);
void Send_Command_To_ROM( uchar datu );
uchar Get_data_From_ROM( );
void Get_N_Bytes_Data_From_ROM(uchar addrHigh, uchar addrMid, uchar addrLow, uchar *pBuff, uchar DataLen );
void OLED_Display_String(uchar y, uchar x, uchar *text);
void Display_GB2312_One_String(uchar y, uchar x, uchar *text);
void OLED_Display_Timer_Data(uchar y, uchar x, ulong Number);
void OLED_Display_Number(uchar y, uchar x, ulong Number);
#endif
|