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

📄 ssd1303.h

📁 LOED 驱动程序 在ARM7上实现OLED的驱动
💻 H
字号:
#ifndef  _SSD1303_H_
#define  _SSD1303_H_
#include<intrins.h>

#define PAR	   //定义为并行模式,如不是,注释掉即可
#ifdef PAR
//	#define demo   //因为demo板数据要反向,定义这个宏来把数据反向的代码编译进去,如硬件一一对应则注释掉即可,
#endif
//以下为接口定义,用户根据自己的板子自行定义

extern unsigned char code num[10][16];
#ifdef PAR
	#define DAT P1
	sbit R_D=P2^7;
	sbit W_R=P2^6;
	sbit DC=P2^5;
	sbit RES=P2^4;
	sbit CS=P2^2;
#else
	sbit CLK=P1^7;
	sbit DATA=P1^6;
	sbit DC=P2^5;
	sbit RES=P2^4;
	sbit CS=P2^2;
#endif
//****************************主要操作函数************************************
void WriteCommand(unsigned com);		//写命令程序
void WriteData(unsigned dat);			//写数据程序
void esbusini(void);					//初始化总线程序
void ini_oled(void);            		//OLED初始化
void ini_dis(void);						//显示初始化(清除缓冲区)

#ifdef demo
sbit A_0=ACC^0;//方便位操作
sbit A_1=ACC^1;
sbit A_2=ACC^2;
sbit A_3=ACC^3;
sbit A_4=ACC^4;
sbit A_5=ACC^5;
sbit A_6=ACC^6;
sbit A_7=ACC^7;

sbit B_0=B^0;//方便位操作
sbit B_1=B^1;
sbit B_2=B^2;
sbit B_3=B^3;
sbit B_4=B^4;
sbit B_5=B^5;
sbit B_6=B^6;
sbit B_7=B^7;

unsigned char SetData(unsigned char DataByte)//转换并设置P0口的数据,如接口一直可不需此函数
{
	ACC=DataByte;
	B_0=A_7;
	B_1=A_6;
	B_2=A_5;
	B_3=A_4;
	B_4=A_3;
	B_5=A_2;
	B_6=A_1;
	B_7=A_0;
	return B;
}
#endif
/**************************实现函数********************************************
*函数原型:		WriteCommand(unsigned com);
*功  能:		写指令到OLED显示屏。
*******************************************************************************/
void WriteCommand(unsigned com)
{
	#ifdef PAR
		CS=1;
		DC=0;
		W_R=0;	
		R_D=1;
		CS=0;
	#ifdef demo
		DAT=SetData(com);
	#else
		DAT=com;
	#endif	
		CS=1;
	#else
		unsigned char i;
		CS=1;
		DC=0;
		CS=0;
		for(i=0x80;i>0;i>>1)
			{
				CLK=0;
				DATA=com&i;
				CLK=1;
			}
		CS=1;
	#endif	
}
/**************************实现函数********************************************
*函数原型:		void WriteData(unsigned dat);
*功  能:		写数据到oled显示屏。
*******************************************************************************/
void WriteData(unsigned dat)
{
	#ifdef PAR
	CS=1;
	DC=1;	
	W_R=0;
	R_D=1;
	CS=0;
	#ifdef demo
		DAT=SetData(dat);
	#else
		DAT=dat;
	#endif
	CS=1;
	#else
		unsigned char i;
		CS=1;
		DC=1;
		CS=0;
		for(i=0x80;i>0;i>>1)
			{
				CLK=0;
				DATA=dat&i;
				CLK=1;
			}
		CS=1;
	#endif
}
/**************************实现函数********************************************
*函数原型:		void esbusini(void);
*功  能:		总线初始化。
*******************************************************************************/
void esbusini(void)
{
	unsigned char i=100;
	while(--i)_nop_();//延时5uS以上
	RES=1;
	RES=0;
	while(--i)_nop_();//延时5uS以上
	RES=1;
}
/**************************实现函数********************************************
*函数原型:		void ini_dis(void);
*功  能:		显示初始化。
*******************************************************************************/
void ini_dis(void)
{
	unsigned char i,j;
	for(i=0;i<8;i++)
	{
		WriteCommand (0xb0+i);    //设置显示位置—行
		WriteCommand (0x02);      //设置显示位置—列低地址
		WriteCommand (0x10);      //设置显示位置—列高地址
		for(j=0;j<128;j++)
			WriteData(0x00);        //屏幕显示,全亮
	}
}
/**************************实现函数********************************************
*函数原型:		void ini_oled(void);
*功  能:		oled显示的准备工作。
*******************************************************************************/
void ini_oled(void)
{
	esbusini();
	/*************************************************
	// SSD1303 Initialization Command
	*************************************************/
	// Lower Column Address
	WriteCommand(0x00); /* Set Lower Column Address */
	// High Column Address
	WriteCommand(0x10); /* Set Higher Column Address*/
	// Display Start Line
	WriteCommand(0x40); /* Set Display Start Line */
	// Contrast Control Register
	WriteCommand(0x81); /* Set Contrast Control */
	WriteCommand(0x2f); /* 0 ~ 255 0x1f*/
	// Re-map
	WriteCommand(0xA1); /* [A0]:column address 0 is map 
	to SEG0 , [A1]: columnaddress 131 is map to SEG0*/ 
	// Entire Display ON/OFF
	WriteCommand(0xA4); /* A4=ON */
	// Normal or Inverse Display
	WriteCommand(0XA6); /* Normal Display*/
	// Multiplex Ratio
	WriteCommand(0xA8); /* Set Multiplex Ratio */
	WriteCommand(0x3f); /* Set to 36 Mux*/
	// Set DC-DC
	WriteCommand(0xAD); /* Set DC-DC */
	WriteCommand(0x8A); /* 8B=ON, 8A=Off */
	// Display ON/OFF
	WriteCommand(0xAE); /* AF=ON , AE=OFF*/
	// Display Offset
	WriteCommand(0xD3); /* Set Display Offset */
	WriteCommand(0x00); /* No offset */
	// Display Clock Divide
	WriteCommand(0xD5); /* Set Clock Divide */
	WriteCommand(0x20); /* Set to 80Hz */
	// Area Color Mode
	WriteCommand(0xD8); /* Set Area Color On or Off*/
	WriteCommand(0x00); /* Mono Mode */
	// COM Pins Hardware Configuration
	WriteCommand(0xDA); /* Set Pins HardwareConfiguration */
	WriteCommand(0x12);
	// VCOMH
	WriteCommand(0xDB); /* Set VCOMH */
	WriteCommand(0x00);
	// VP
	WriteCommand(0xD9); /* Set VP */
	WriteCommand(0x22); /* P1=2 , P2=2 */
	WriteCommand(0xc0);//配置成标准应用
	ini_dis();
}
/*******************************function************************************************************/
//*******************显示X,Y坐标处的一个字符。一行可以显示16个字符。X为0到15,Y为0到3**************
void disc(unsigned char X,unsigned char Y,unsigned char * c)
{
	unsigned char n;
	WriteCommand (0xb7-(Y<<1));
	if(X%2)
		WriteCommand (0x08);
	else
		WriteCommand (0x00);
	WriteCommand (0x10+(X>>1));
	for(n=0;n<=15;n+=2)
		WriteData(*(c+n));

	WriteCommand (0xb7-(Y<<1)-1);
	if(X%2)
		WriteCommand (0x08);
	else
		WriteCommand (0x00);
	WriteCommand (0x10+(X>>1));
	for(n=1;n<=15;n+=2)
		WriteData(*(c+n));
}
// X  is 0 to 7
void dish(unsigned char X,unsigned char Y,unsigned char * h)
{
	unsigned char n;
	WriteCommand (0xb7-(Y<<1));
	if(X%2)
		WriteCommand (0x08);
	else
		WriteCommand (0x00);
	WriteCommand (0x10+(X>>1));
	for(n=0;n<=31;n+=2)
		WriteData(*(h+n));

	WriteCommand (0xb7-(Y<<1)-1);
	if(X%2)
		WriteCommand (0x08);
	else
		WriteCommand (0x00);
	WriteCommand (0x10+(X>>1));
	for(n=1;n<=31;n+=2)
		WriteData(*(h+n));
}
void disn(unsigned char X,unsigned char Y,unsigned char n)
{
	unsigned char m;
	WriteCommand (0xb7-(Y<<1));
	if(X%2)
		WriteCommand (0x08);
	else
		WriteCommand (0x00);
	WriteCommand (0x10+(X>>1));
	for(m=0;m<=15;m+=2)
		WriteData(*(num[n]+m));                     

	WriteCommand (0xb7-(Y<<1)-1);
	if(X%2)
		WriteCommand (0x08);
	else
		WriteCommand (0x00);
	WriteCommand (0x10+(X>>1));
	for(m=1;m<=15;m+=2)
		WriteData(*(num[n]+m));
}
#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -