⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 oled_function.c

📁 用msp430控制的OLED显示程序
💻 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 + -