更改目录
This commit is contained in:
		
							
								
								
									
										594
									
								
								硬件驱动/OLED显示屏/AbsDrive_OLED.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										594
									
								
								硬件驱动/OLED显示屏/AbsDrive_OLED.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,594 @@ | ||||
| /*文件:AbsDrive_OLED.c | ||||
| *	作者:你遇了我 | ||||
| * 联系:321640253@qq.com | ||||
| * 描述:抽象硬件OLED屏幕,只需要实现指定的抽象函数,即可使用 | ||||
| * 使用:1、根据配置区,在抽象实现区按照要求实现对应函数 | ||||
| *@版本:v0.1.0 | ||||
| */ | ||||
|  | ||||
| #include "AbsDrive_OLED.h" | ||||
| #include "AbsDriveOledFont.h" | ||||
|  | ||||
| #if (ABSDrive_OLED_ON) | ||||
| /**************************抽象实现区(BEGIN)************************************/ | ||||
|  | ||||
| #if (defined ABSDrive_4SPI)||(defined ABSDrive_3SPI)||(defined ABSDrive_HardIIC)||(defined ABSDrive_SoftIIC) | ||||
| /*抽象函数:写字节 | ||||
| *要求1:实现一个写入多个字节的函数 | ||||
| *要求2:返回一个AbsDriveOLED_STATE类型的状态 | ||||
| *参数1:_data:写入的数据,一个u8指针类型 | ||||
| *参数2:_size:写入多少个字节 | ||||
| */ | ||||
| static AbsDriveOLED_STATE AbsOledWriteByte(u8 *_data,u8 _size){ | ||||
| 	/********************请实现抽象写字节函数********************/ | ||||
| 	HAL_I2C_Master_Transmit(&hi2c1,ABS_OLED_ADDR,_data,_size,1000); | ||||
| 	/********************请实现抽象写字节函数********************/ | ||||
| 	return ABS_OLED_OK; | ||||
| } | ||||
| #endif | ||||
|  | ||||
|  | ||||
| #ifdef Enable_ABS_OLED_RES | ||||
| /*抽象函数:复位信号函数 | ||||
| *要求1:根据电平值设置复位引脚电平 | ||||
| *参数1:electrical_level:电平值,1、高电平;0、低电平 | ||||
| */ | ||||
| static void AbsDriveOLED_RES(u8 electrical_level){ | ||||
| 	/********************请实现抽象复位信号函数********************/ | ||||
| 	if(electrical_level)HAL_GPIO_WritePin(OLED_RES_GPIO_Port,OLED_RES_Pin,GPIO_PIN_SET); | ||||
| 	else HAL_GPIO_WritePin(OLED_RES_GPIO_Port,OLED_RES_Pin,GPIO_PIN_RESET); | ||||
| 	/********************请实现抽象复位信号函数********************/ | ||||
| } | ||||
| #endif | ||||
|  | ||||
| #ifdef Enable_ABS_OLED_DC | ||||
| /*抽象函数:DC命令信号函数 | ||||
| *要求1:根据电平值设置DC引脚电平 | ||||
| *参数1:electrical_level:电平值,1、高电平;0、低电平 | ||||
| */ | ||||
| static void AbsDriveOLED_DC(u8 electrical_level){ | ||||
| 	/********************请实现抽象DC命令信号函数********************/ | ||||
| 	if(electrical_level)HAL_GPIO_WritePin(OLED_DC_GPIO_Port,OLED_DC_Pin,GPIO_PIN_SET); | ||||
| 	else HAL_GPIO_WritePin(OLED_DC_GPIO_Port,OLED_DC_Pin,GPIO_PIN_RESET); | ||||
| 	/********************请实现抽象DC命令信号函数********************/ | ||||
| } | ||||
| #endif | ||||
|  | ||||
| #ifdef Enable_ABS_OLED_Delay | ||||
| /*抽象函数:延时函数 | ||||
| *要求1:实现延时函数、 | ||||
| *参数1:t:延时时间 | ||||
| */ | ||||
| static void AbsOledDelay(u32 t){ | ||||
| 	/********************请实现抽象延时函数********************/ | ||||
| 	while(t--){}	//默认循环while(t--){},可重写 | ||||
| 	/********************请实现抽象延时函数********************/ | ||||
| } | ||||
| #endif  | ||||
|  | ||||
| /**************************抽象实现区(END)**************************************/ | ||||
|  | ||||
|  | ||||
|  | ||||
| /*----------------------------------------------分割线(以下内容非开发人员切勿改动)---------------------------------------------------------*/ | ||||
|  | ||||
| u8 ABS_OLED_GRAM[ABS_OLED_WIDTH][ABS_OLED_PAGE_SIZE];			//定义显存 | ||||
|  | ||||
| /* | ||||
| *函数:AbsOledWriteCMD | ||||
| *功能:写OLED命令 | ||||
| *参数:ABScmd:命令 | ||||
| *返回值:AbsDriveOLED_STATE状态 | ||||
| */ | ||||
| AbsDriveOLED_STATE AbsOledWriteCMD(u8 ABScmd){ | ||||
| 	#ifdef ABSDrive_4SPI | ||||
| 	AbsDriveOLED_DC(0); | ||||
| 	if(AbsOledWriteByte(&ABScmd,1)==ABS_OLED_OK)return ABS_OLED_OK; | ||||
| 	#endif | ||||
| 	 | ||||
| 	#ifdef ABSDrive_3SPI | ||||
| 	 | ||||
| 	#endif | ||||
| 	 | ||||
| 	#if (defined ABSDrive_HardIIC)||(defined ABSDrive_SoftIIC) | ||||
| 	u8 pdata[2]; | ||||
| 	pdata[0]=0x00; | ||||
| 	pdata[1]=ABScmd; | ||||
| 	AbsOledWriteByte(pdata,2); | ||||
| 	#endif | ||||
| 	 | ||||
| 	return ABS_OLED_ERROR; | ||||
| } | ||||
|  | ||||
| /* | ||||
| *函数:AbsOledWriteDATA | ||||
| *功能:写OLED数据 | ||||
| *参数:ABScmd:OLED数据 | ||||
| *返回值:AbsDriveOLED_STATE状态 | ||||
| */ | ||||
| AbsDriveOLED_STATE AbsOledWriteDATA(u8 ABSdata){ | ||||
| 	#ifdef ABSDrive_4SPI | ||||
| 	AbsDriveOLED_DC(1); | ||||
| 	if(AbsOledWriteByte(&ABSdata,1)==ABS_OLED_OK)return ABS_OLED_OK; | ||||
| 	#endif | ||||
| 	 | ||||
| 	#ifdef ABSDrive_3SPI | ||||
| 	 | ||||
| 	#endif | ||||
| 	 | ||||
| 	#if (defined ABSDrive_HardIIC)||(defined ABSDrive_SoftIIC) | ||||
| 	u8 pdata[2]; | ||||
| 	pdata[0]=0x40; | ||||
| 	pdata[1]=ABSdata; | ||||
| 	AbsOledWriteByte(pdata,2); | ||||
| 	#endif | ||||
| 	return ABS_OLED_ERROR; | ||||
| } | ||||
|  | ||||
|  | ||||
| /* | ||||
| *函数:ABS_OLED_Refresh | ||||
| *描述:刷新OLED显存 | ||||
| */ | ||||
| void ABS_OLED_Refresh(void) | ||||
| { | ||||
| 	u8 i,n; | ||||
| 	for(i=0;i<ABS_OLED_PAGE_SIZE;i++) | ||||
| 	{ | ||||
| 		AbsOledWriteCMD(0xB0+i);  | ||||
| 		AbsOledWriteCMD(0x00);   | ||||
| 		AbsOledWriteCMD(0x10);   | ||||
| 		 | ||||
| 		for(n=0;n<ABS_OLED_WIDTH;n++)AbsOledWriteDATA(ABS_OLED_GRAM[n][i]); | ||||
|   } | ||||
| } | ||||
|  | ||||
|  | ||||
| void ABS_OLED_ColorTurn(u8 i) | ||||
| { | ||||
| 	if(i==0) | ||||
| 		{ | ||||
| 			AbsOledWriteCMD(0xA6); | ||||
| 		} | ||||
| 	if(i==1) | ||||
| 		{ | ||||
| 			AbsOledWriteCMD(0xA7); | ||||
| 		} | ||||
| } | ||||
|  | ||||
|  | ||||
| void ABS_OLED_DisplayTurn(u8 i) | ||||
| { | ||||
| 	if(i==0) | ||||
| 		{ | ||||
| 			AbsOledWriteCMD(0xC8); | ||||
| 			AbsOledWriteCMD(0xA1); | ||||
| 		} | ||||
| 	if(i==1) | ||||
| 		{ | ||||
| 			AbsOledWriteCMD(0xC0); | ||||
| 			AbsOledWriteCMD(0xA0); | ||||
| 		} | ||||
| } | ||||
|  | ||||
|  | ||||
| void ABS_OLED_DisPlay_On(void) | ||||
| { | ||||
| 	AbsOledWriteCMD(0x8D); | ||||
| 	AbsOledWriteCMD(0x14); | ||||
| 	AbsOledWriteCMD(0xAF); | ||||
| } | ||||
|  | ||||
|  | ||||
| void ABS_OLED_DisPlay_Off(void) | ||||
| { | ||||
| 	AbsOledWriteCMD(0x8D); | ||||
| 	AbsOledWriteCMD(0x10); | ||||
| 	AbsOledWriteCMD(0xAE); | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
| /*函数:ABS_OLED_Clear | ||||
| **描述:清空屏幕显存并刷新屏幕 | ||||
| */ | ||||
| void ABS_OLED_Clear(void) | ||||
| { | ||||
| 	u8 i,n; | ||||
| 	for(i=0;i<8;i++) | ||||
| 	{ | ||||
| 	   for(n=0;n<128;n++) | ||||
| 			{ | ||||
| 			 ABS_OLED_GRAM[n][i]=0; | ||||
| 			} | ||||
|   } | ||||
| 	ABS_OLED_Refresh(); | ||||
| } | ||||
|  | ||||
|  | ||||
| /*函数:ABS_OLED_DrawPoint | ||||
| **描述:按照坐标绘制一个点 | ||||
| **参数1:x:x坐标	取值返回小于ABS_OLED_WIDTH | ||||
| **参数2:y:y坐标	取值返回小于ABS_OLED_HEIGHT | ||||
| **参数3:mode:绘制模式,1:填充;0:清空  | ||||
| */ | ||||
| void ABS_OLED_DrawPoint(u8 x,u8 y,u8 mode) | ||||
| { | ||||
| 	u8 i,m,n; | ||||
| 	i=y/8; | ||||
| 	m=y%8; | ||||
| 	n=1<<m; | ||||
| 	if(mode){ABS_OLED_GRAM[x][i]|=n;} | ||||
| 	else | ||||
| 	{ | ||||
| 		ABS_OLED_GRAM[x][i]=~ABS_OLED_GRAM[x][i]; | ||||
| 		ABS_OLED_GRAM[x][i]|=n; | ||||
| 		ABS_OLED_GRAM[x][i]=~ABS_OLED_GRAM[x][i]; | ||||
| 	} | ||||
| } | ||||
|  | ||||
| /*函数:ABS_OLED_DrawLine | ||||
| **描述:按照起始坐标和结束坐标绘制直线 | ||||
| **参数1:x1:起始x坐标	取值返回小于ABS_OLED_WIDTH | ||||
| **参数2:y1:起始y坐标	取值返回小于ABS_OLED_HEIGHT | ||||
| **参数3:x2:结束x坐标	取值返回小于ABS_OLED_WIDTH | ||||
| **参数4:y2:结束y坐标	取值返回小于ABS_OLED_HEIGHT | ||||
| **参数5:mode:绘制模式,1:填充;0:清空  | ||||
| */ | ||||
| void ABS_OLED_DrawLine(u8 x1,u8 y1,u8 x2,u8 y2,u8 mode) | ||||
| { | ||||
| 	u16 t;  | ||||
| 	int xerr=0,yerr=0,delta_x,delta_y,distance; | ||||
| 	int incx,incy,uRow,uCol; | ||||
| 	delta_x=x2-x1;  | ||||
| 	delta_y=y2-y1; | ||||
| 	uRow=x1; | ||||
| 	uCol=y1; | ||||
| 	if(delta_x>0)incx=1;  | ||||
| 	else if (delta_x==0)incx=0; | ||||
| 	else {incx=-1;delta_x=-delta_x;} | ||||
| 	if(delta_y>0)incy=1; | ||||
| 	else if (delta_y==0)incy=0; | ||||
| 	else {incy=-1;delta_y=-delta_x;} | ||||
| 	if(delta_x>delta_y)distance=delta_x; | ||||
| 	else distance=delta_y; | ||||
| 	for(t=0;t<distance+1;t++) | ||||
| 	{ | ||||
| 		ABS_OLED_DrawPoint(uRow,uCol,mode); | ||||
| 		xerr+=delta_x; | ||||
| 		yerr+=delta_y; | ||||
| 		if(xerr>distance) | ||||
| 		{ | ||||
| 			xerr-=distance; | ||||
| 			uRow+=incx; | ||||
| 		} | ||||
| 		if(yerr>distance) | ||||
| 		{ | ||||
| 			yerr-=distance; | ||||
| 			uCol+=incy; | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| /*函数:ABS_OLED_DrawCircle | ||||
| **描述:按照中心坐标绘制半径r的圆 | ||||
| **参数1:x:中心x坐标	取值返回小于ABS_OLED_WIDTH | ||||
| **参数2:y:中心y坐标	取值返回小于ABS_OLED_HEIGHT | ||||
| **参数3:mode:绘制模式,1:填充;0:清空  | ||||
| */ | ||||
| void ABS_OLED_DrawCircle(u8 x,u8 y,u8 r) | ||||
| { | ||||
| 	int a, b,num; | ||||
|     a = 0; | ||||
|     b = r; | ||||
|     while(2 * b * b >= r * r)       | ||||
|     { | ||||
|         ABS_OLED_DrawPoint(x + a, y - b,1); | ||||
|         ABS_OLED_DrawPoint(x - a, y - b,1); | ||||
|         ABS_OLED_DrawPoint(x - a, y + b,1); | ||||
|         ABS_OLED_DrawPoint(x + a, y + b,1); | ||||
|   | ||||
|         ABS_OLED_DrawPoint(x + b, y + a,1); | ||||
|         ABS_OLED_DrawPoint(x + b, y - a,1); | ||||
|         ABS_OLED_DrawPoint(x - b, y - a,1); | ||||
|         ABS_OLED_DrawPoint(x - b, y + a,1); | ||||
|          | ||||
|         a++; | ||||
|         num = (a * a + b * b) - r*r; | ||||
|         if(num > 0) | ||||
|         { | ||||
|             b--; | ||||
|             a--; | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| /*函数:ABS_OLED_ShowChar | ||||
| **描述:在指定位置打印字符 | ||||
| **参数1:x1:起始x坐标	取值返回小于ABS_OLED_WIDTH | ||||
| **参数2:y1:起始y坐标	取值返回小于ABS_OLED_HEIGHT | ||||
| **参数3:chr:需要打印的字符 | ||||
| **参数4:sizel:打印字符的字体大小。字库有8*6、12*6、16*8、24*12 | ||||
| **参数5:mode:打印模式,1:正常显示 ;0:反向显示 | ||||
| */ | ||||
| void ABS_OLED_ShowChar(u8 x,u8 y,u8 chr,u8 size1,u8 mode) | ||||
| { | ||||
| 	u8 i,m,temp,size2,chr1; | ||||
| 	u8 x0=x,y0=y; | ||||
| 	if(size1==8)size2=6; | ||||
| 	else size2=(size1/8+((size1%8)?1:0))*(size1/2);   | ||||
| 	chr1=chr-' ';   | ||||
| 	for(i=0;i<size2;i++) | ||||
| 	{ | ||||
| 		if(size1==8) | ||||
| 			  {temp=asc2_0806[chr1][i];}  | ||||
| 		else if(size1==12) | ||||
|         {temp=asc2_1206[chr1][i];} //12*06大小 | ||||
| 		else if(size1==16) | ||||
|         {temp=asc2_1608[chr1][i];} //16*08大小 | ||||
| 		else if(size1==24) | ||||
|         {temp=asc2_2412[chr1][i];} //24*12大小 | ||||
| 		else return; | ||||
| 		for(m=0;m<8;m++) | ||||
| 		{ | ||||
| 			if(temp&0x01)ABS_OLED_DrawPoint(x,y,mode); | ||||
| 			else ABS_OLED_DrawPoint(x,y,!mode); | ||||
| 			temp>>=1; | ||||
| 			y++; | ||||
| 		} | ||||
| 		x++; | ||||
| 		if((size1!=8)&&((x-x0)==size1/2)) | ||||
| 		{x=x0;y0=y0+8;} | ||||
| 		y=y0; | ||||
|   } | ||||
| } | ||||
|  | ||||
| /*函数:ABS_OLED_ShowString | ||||
| **描述:在指定位置打印字符串 | ||||
| **参数1:x1:起始x坐标	取值返回小于ABS_OLED_WIDTH | ||||
| **参数2:y1:起始y坐标	取值返回小于ABS_OLED_HEIGHT | ||||
| **参数3:chr:需要打印的字符 | ||||
| **参数4:sizel:打印字符的字体大小。字库有8*6、12*6、16*8、24*12 | ||||
| **参数5:mode:打印模式,1:正常显示 ;0:反向显示 | ||||
| */ | ||||
| void ABS_OLED_ShowString(u8 x,u8 y,char *chr,u8 size1,u8 mode) | ||||
| { | ||||
| 	while((*chr>=' ')&&(*chr<='~')) | ||||
| 	{ | ||||
| 		ABS_OLED_ShowChar(x,y,*chr,size1,mode); | ||||
| 		if(size1==8)x+=6; | ||||
| 		else x+=size1/2; | ||||
| 		chr++; | ||||
|   } | ||||
| } | ||||
|  | ||||
| /*函数:ABS_OLED_Pow | ||||
| **描述:内部函数,用于求次方 | ||||
| **参数1:m:底数 | ||||
| **参数2:n:指数 | ||||
| */ | ||||
| static u32 ABS_OLED_Pow(u8 m,u8 n) | ||||
| { | ||||
| 	u32 result=1; | ||||
| 	while(n--) | ||||
| 	{ | ||||
| 	  result*=m; | ||||
| 	} | ||||
| 	return result; | ||||
| } | ||||
|  | ||||
| /*函数:ABS_OLED_ShowNum | ||||
| **描述:在指定位置打印数字 | ||||
| **参数1:x1:起始x坐标	取值返回小于ABS_OLED_WIDTH | ||||
| **参数2:y1:起始y坐标	取值返回小于ABS_OLED_HEIGHT | ||||
| **参数3:num:需要打印的数字 | ||||
| **参数3:len:数字长度,几位数 | ||||
| **参数5:sizel:打印字符的字体大小。字库有8*6、12*6、16*8、24*12 | ||||
| **参数6:mode:打印模式,1:正常显示 ;0:反向显示 | ||||
| **/ | ||||
| void ABS_OLED_ShowNum(u8 x,u8 y,u32 num,u8 len,u8 size1,u8 mode) | ||||
| { | ||||
| 	u8 t,temp,m=0; | ||||
| 	if(size1==8)m=2; | ||||
| 	for(t=0;t<len;t++) | ||||
| 	{ | ||||
| 		temp=(num/ABS_OLED_Pow(10,len-t-1))%10; | ||||
| 			if(temp==0) | ||||
| 			{ | ||||
| 				ABS_OLED_ShowChar(x+(size1/2+m)*t,y,'0',size1,mode); | ||||
|       } | ||||
| 			else  | ||||
| 			{ | ||||
| 			  ABS_OLED_ShowChar(x+(size1/2+m)*t,y,temp+'0',size1,mode); | ||||
| 			} | ||||
|   } | ||||
| } | ||||
|  | ||||
| /*函数:ABS_OLED_ShowChinese | ||||
| **描述:在指定位置打印中文字符 | ||||
| **参数1:x1:起始x坐标	取值返回小于ABS_OLED_WIDTH | ||||
| **参数2:y1:起始y坐标	取值返回小于ABS_OLED_HEIGHT | ||||
| **参数3:num:在中文字库数组中的索引 | ||||
| **参数4:sizel:打印字符的字体大小。字库有16*16、32*32、64*64 | ||||
| **参数6:mode:打印模式,1:正常显示 ;0:反向显示 | ||||
| **/ | ||||
| void ABS_OLED_ShowChinese(u8 x,u8 y,u8 num,u8 size1,u8 mode) | ||||
| { | ||||
| 	u8 m,temp; | ||||
| 	u8 x0=x,y0=y; | ||||
| 	u16 i,size3=(size1/8+((size1%8)?1:0))*size1;   | ||||
| 	for(i=0;i<size3;i++) | ||||
| 	{ | ||||
| 		if(size1==16) | ||||
| 				{temp=Hzk1[num][i];} | ||||
| 		else if(size1==24) | ||||
| 				{temp=Hzk2[num][i];} | ||||
| 		else if(size1==32)        | ||||
| 				{temp=Hzk3[num][i];} | ||||
| 		else if(size1==64) | ||||
| 				{temp=Hzk4[num][i];} | ||||
| 		else return; | ||||
| 		for(m=0;m<8;m++) | ||||
| 		{ | ||||
| 			if(temp&0x01)ABS_OLED_DrawPoint(x,y,mode); | ||||
| 			else ABS_OLED_DrawPoint(x,y,!mode); | ||||
| 			temp>>=1; | ||||
| 			y++; | ||||
| 		} | ||||
| 		x++; | ||||
| 		if((x-x0)==size1) | ||||
| 		{x=x0;y0=y0+8;} | ||||
| 		y=y0; | ||||
| 	} | ||||
| } | ||||
|  | ||||
| /*函数:ABS_OLED_ScrollDisplay | ||||
| **描述:滚动显示中文字符 | ||||
| **参数1:num:显示汉字个数 | ||||
| **参数2:space:每遍显示的间隔 | ||||
| **参数3:mode:打印模式,1:正常显示 ;0:反向显示 | ||||
| **/ | ||||
| void ABS_OLED_ScrollDisplay(u8 num,u8 space,u8 mode) | ||||
| { | ||||
| 	u8 i,n,t=0,m=0,r; | ||||
| 	while(1) | ||||
| 	{ | ||||
| 		if(m==0) | ||||
| 		{ | ||||
| 	    ABS_OLED_ShowChinese(128,24,t,16,mode);  | ||||
| 			t++; | ||||
| 		} | ||||
| 		if(t==num) | ||||
| 			{ | ||||
| 				for(r=0;r<16*space;r++) | ||||
| 				 { | ||||
| 					for(i=1;i<144;i++) | ||||
| 						{ | ||||
| 							for(n=0;n<8;n++) | ||||
| 							{ | ||||
| 								ABS_OLED_GRAM[i-1][n]=ABS_OLED_GRAM[i][n]; | ||||
| 							} | ||||
| 						} | ||||
|            ABS_OLED_Refresh(); | ||||
| 				 } | ||||
|         t=0; | ||||
|       } | ||||
| 		m++; | ||||
| 		if(m==16){m=0;} | ||||
| 		for(i=1;i<144;i++)  | ||||
| 		{ | ||||
| 			for(n=0;n<8;n++) | ||||
| 			{ | ||||
| 				ABS_OLED_GRAM[i-1][n]=ABS_OLED_GRAM[i][n]; | ||||
| 			} | ||||
| 		} | ||||
| 		ABS_OLED_Refresh(); | ||||
| 	} | ||||
| } | ||||
|  | ||||
| /*函数:ABS_OLED_ShowPicture | ||||
| **描述:显示图片 | ||||
| **参数1:x1:起始x坐标	取值返回小于ABS_OLED_WIDTH | ||||
| **参数2:y1:起始y坐标	取值返回小于ABS_OLED_HEIGHT | ||||
| **参数3:sizex:图片的长 | ||||
| **参数4:sizey:图片的高 | ||||
| **参数5:BMP[]:要写入的图片数组 | ||||
| **参数6:mode:打印模式,1:正常显示 ;0:反向显示 | ||||
| **/ | ||||
| void ABS_OLED_ShowPicture(u8 x,u8 y,u8 sizex,u8 sizey,u8 BMP[],u8 mode) | ||||
| { | ||||
| 	u16 j=0; | ||||
| 	u8 i,n,temp,m; | ||||
| 	u8 x0=x,y0=y; | ||||
| 	sizey=sizey/8+((sizey%8)?1:0); | ||||
| 	for(n=0;n<sizey;n++) | ||||
| 	{ | ||||
| 		 for(i=0;i<sizex;i++) | ||||
| 		 { | ||||
| 				temp=BMP[j]; | ||||
| 				j++; | ||||
| 				for(m=0;m<8;m++) | ||||
| 				{ | ||||
| 					if(temp&0x01)ABS_OLED_DrawPoint(x,y,mode); | ||||
| 					else ABS_OLED_DrawPoint(x,y,!mode); | ||||
| 					temp>>=1; | ||||
| 					y++; | ||||
| 				} | ||||
| 				x++; | ||||
| 				if((x-x0)==sizex) | ||||
| 				{ | ||||
| 					x=x0; | ||||
| 					y0=y0+8; | ||||
| 				} | ||||
| 				y=y0; | ||||
|      } | ||||
| 	 } | ||||
| } | ||||
| /* | ||||
| *函数:ABS_OLED_Init | ||||
| *功能:初始化OLED | ||||
| */ | ||||
| void ABS_OLED_Init(void) | ||||
| {		 | ||||
| 		#ifdef Enable_ABS_OLED_RES | ||||
| 		AbsDriveOLED_RES(0);	//复位 | ||||
| 		#endif | ||||
| 	 | ||||
| 		#ifdef Enable_ABS_OLED_Delay | ||||
| 		AbsOledDelay(10);			//延时 | ||||
| 		#endif | ||||
| 	 | ||||
| 		#ifdef Enable_ABS_OLED_RES | ||||
| 		AbsDriveOLED_RES(1);	//启用正常工作 | ||||
| 		#endif | ||||
| 	 | ||||
|     AbsOledWriteCMD(CMD_OFF_OLED); 											//关闭OLED屏幕、单次命令 | ||||
| 	 | ||||
|     AbsOledWriteCMD(CMD_Memory_Addr_Mode_OLED); 				//设置内存寻址模式;连续命令 | ||||
|     AbsOledWriteCMD(0x10); 															//00,水平寻址模式;01、垂直寻址模式;10、页面寻址模式(重置);11、无效 | ||||
| 	 | ||||
|     AbsOledWriteCMD(0xB0); //Set Page Start Address for Page Addressing Mode,0-7 | ||||
|     AbsOledWriteCMD(0xC8); //Set COM Output Scan Direction | ||||
|     AbsOledWriteCMD(CMD_LColAddr_OLED); //---set low column address | ||||
|     AbsOledWriteCMD(CMD_HColAddr_OLED); //---set high column address | ||||
|     AbsOledWriteCMD(0x40); //--set start line address | ||||
|     AbsOledWriteCMD(CMD_Set_Contrast_Control_OLED); //--set contrast control register | ||||
|     AbsOledWriteCMD(0xFF); | ||||
|     AbsOledWriteCMD(0xA1); //--set segment re-map 0 to 127 | ||||
|     AbsOledWriteCMD(CMD_Normal_display_OLED); //--set normal display | ||||
|     AbsOledWriteCMD(0xA8); //--set multiplex ratio(1 to 64) | ||||
|     AbsOledWriteCMD(0x3F); // | ||||
|     AbsOledWriteCMD(CMD_EntireDisplay_OLED); //0xa4,Output follows RAM content;0xa5,Output ignores RAM content | ||||
|     AbsOledWriteCMD(0xD3); //-set display offset | ||||
|     AbsOledWriteCMD(CMD_LColAddr_OLED); //-not offset | ||||
|     AbsOledWriteCMD(0xD5); //--set display clock divide ratio/oscillator frequency | ||||
|     AbsOledWriteCMD(0xF0); //--set divide ratio | ||||
|     AbsOledWriteCMD(0xD9); //--set pre-charge period | ||||
|     AbsOledWriteCMD(0x22); // | ||||
|     AbsOledWriteCMD(0xDA); //--set com pins hardware configuration | ||||
|     AbsOledWriteCMD(0x12); | ||||
|     AbsOledWriteCMD(0xDB); //--set vcomh | ||||
|     AbsOledWriteCMD(CMD_Memory_Addr_Mode_OLED); //0x20,0.77xVcc | ||||
|     AbsOledWriteCMD(0x8D); //--set DC-DC enable | ||||
|     AbsOledWriteCMD(0x14); // | ||||
|     AbsOledWriteCMD(CMD_ON_OLED); //--turn on SSD1306 panel | ||||
| 		ABS_OLED_Clear(); | ||||
| } | ||||
|  | ||||
|  | ||||
| ABS_OLED_Drive Create_OLED(void){ | ||||
| 	ABS_OLED_Drive drive; | ||||
| 	drive.Clear = ABS_OLED_Clear; | ||||
| 	drive.Refresh=ABS_OLED_Refresh; | ||||
| 	 | ||||
| 	drive.DrawPoint=ABS_OLED_DrawPoint; | ||||
| 	drive.DrawLine=ABS_OLED_DrawLine; | ||||
| 	drive.DrawCircle=ABS_OLED_DrawCircle; | ||||
| 	drive.ShowString=ABS_OLED_ShowString; | ||||
| 	drive.ShowChinese=ABS_OLED_ShowChinese; | ||||
| 	drive.ShowNum=ABS_OLED_ShowNum; | ||||
| 	drive.ShowImage=ABS_OLED_ShowPicture; | ||||
| 	ABS_OLED_Init(); | ||||
| 	return drive; | ||||
| } | ||||
|  | ||||
| #endif | ||||
		Reference in New Issue
	
	Block a user