更新
This commit is contained in:
		| @@ -3,13 +3,15 @@ | ||||
| * 联系:321640253@qq.com | ||||
| * 描述:抽象硬件OLED屏幕,只需要实现指定的抽象函数,即可使用 | ||||
| * 使用:1、根据配置区,在抽象实现区按照要求实现对应函数 | ||||
| *@版本:v0.1.0 | ||||
| */ | ||||
|  | ||||
| #include "AbsDrive_OLED.h" | ||||
| #include "AbsDriveOledFont.h" | ||||
|  | ||||
| /**************************抽象实现区************************************/ | ||||
| /**************************抽象实现区(BEGIN)************************************/ | ||||
|  | ||||
| #if (defined ABSDrive_4SPI)||(defined ABSDrive_3SPI)||(defined ABSDrive_HardIIC)||(defined ABSDrive_SoftIIC) | ||||
| /*抽象函数:写字节 | ||||
| *要求1:实现一个写入多个字节的函数 | ||||
| *要求2:返回一个AbsDriveOLED_STATE类型的状态 | ||||
| @@ -18,20 +20,38 @@ | ||||
| */ | ||||
| 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 | ||||
| /*抽象函数:延时函数 | ||||
| @@ -45,7 +65,7 @@ static void AbsOledDelay(u32 t){ | ||||
| } | ||||
| #endif  | ||||
|  | ||||
| /**************************抽象实现区************************************/ | ||||
| /**************************抽象实现区(END)**************************************/ | ||||
|  | ||||
|  | ||||
|  | ||||
| @@ -61,7 +81,7 @@ u8 ABS_OLED_GRAM[ABS_OLED_WIDTH][ABS_OLED_PAGE_SIZE];			//定义显存 | ||||
| */ | ||||
| AbsDriveOLED_STATE AbsOledWriteCMD(u8 ABScmd){ | ||||
| 	#ifdef ABSDrive_4SPI | ||||
| 	HAL_GPIO_WritePin(oled_cs_GPIO_Port, oled_cs_Pin, GPIO_PIN_RESET); | ||||
| 	AbsDriveOLED_DC(0); | ||||
| 	if(AbsOledWriteByte(&ABScmd,1)==ABS_OLED_OK)return ABS_OLED_OK; | ||||
| 	#endif | ||||
| 	 | ||||
| @@ -69,6 +89,13 @@ AbsDriveOLED_STATE AbsOledWriteCMD(u8 ABScmd){ | ||||
| 	 | ||||
| 	#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; | ||||
| } | ||||
|  | ||||
| @@ -80,7 +107,7 @@ AbsDriveOLED_STATE AbsOledWriteCMD(u8 ABScmd){ | ||||
| */ | ||||
| AbsDriveOLED_STATE AbsOledWriteDATA(u8 ABSdata){ | ||||
| 	#ifdef ABSDrive_4SPI | ||||
| 	HAL_GPIO_WritePin(oled_cs_GPIO_Port, oled_cs_Pin, GPIO_PIN_SET); | ||||
| 	AbsDriveOLED_DC(1); | ||||
| 	if(AbsOledWriteByte(&ABSdata,1)==ABS_OLED_OK)return ABS_OLED_OK; | ||||
| 	#endif | ||||
| 	 | ||||
| @@ -88,6 +115,12 @@ AbsDriveOLED_STATE AbsOledWriteDATA(u8 ABSdata){ | ||||
| 	 | ||||
| 	#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; | ||||
| } | ||||
|  | ||||
| @@ -110,7 +143,7 @@ void ABS_OLED_Refresh(void) | ||||
| } | ||||
|  | ||||
|  | ||||
| void OLED_ColorTurn(u8 i) | ||||
| void ABS_OLED_ColorTurn(u8 i) | ||||
| { | ||||
| 	if(i==0) | ||||
| 		{ | ||||
| @@ -123,7 +156,7 @@ void OLED_ColorTurn(u8 i) | ||||
| } | ||||
|  | ||||
|  | ||||
| void OLED_DisplayTurn(u8 i) | ||||
| void ABS_OLED_DisplayTurn(u8 i) | ||||
| { | ||||
| 	if(i==0) | ||||
| 		{ | ||||
| @@ -138,7 +171,7 @@ void OLED_DisplayTurn(u8 i) | ||||
| } | ||||
|  | ||||
|  | ||||
| void OLED_DisPlay_On(void) | ||||
| void ABS_OLED_DisPlay_On(void) | ||||
| { | ||||
| 	AbsOledWriteCMD(0x8D); | ||||
| 	AbsOledWriteCMD(0x14); | ||||
| @@ -146,7 +179,7 @@ void OLED_DisPlay_On(void) | ||||
| } | ||||
|  | ||||
|  | ||||
| void OLED_DisPlay_Off(void) | ||||
| void ABS_OLED_DisPlay_Off(void) | ||||
| { | ||||
| 	AbsOledWriteCMD(0x8D); | ||||
| 	AbsOledWriteCMD(0x10); | ||||
| @@ -155,8 +188,10 @@ void OLED_DisPlay_Off(void) | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| void OLED_Clear(void) | ||||
| /*函数:ABS_OLED_Clear | ||||
| **描述:清空屏幕显存并刷新屏幕 | ||||
| */ | ||||
| void ABS_OLED_Clear(void) | ||||
| { | ||||
| 	u8 i,n; | ||||
| 	for(i=0;i<8;i++) | ||||
| @@ -169,17 +204,20 @@ void OLED_Clear(void) | ||||
| 	ABS_OLED_Refresh(); | ||||
| } | ||||
|  | ||||
| //<2F><><EFBFBD><EFBFBD>  | ||||
| //x:0~127 | ||||
| //y:0~63 | ||||
| //t:1 <20><><EFBFBD> 0,<2C><><EFBFBD>	 | ||||
| void OLED_DrawPoint(u8 x,u8 y,u8 t) | ||||
|  | ||||
| /*函数: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(t){ABS_OLED_GRAM[x][i]|=n;} | ||||
| 	if(mode){ABS_OLED_GRAM[x][i]|=n;} | ||||
| 	else | ||||
| 	{ | ||||
| 		ABS_OLED_GRAM[x][i]=~ABS_OLED_GRAM[x][i]; | ||||
| @@ -188,29 +226,34 @@ void OLED_DrawPoint(u8 x,u8 y,u8 t) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| //<2F><><EFBFBD><EFBFBD> | ||||
| //x1,y1:<3A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> | ||||
| //x2,y2:<3A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> | ||||
| void OLED_DrawLine(u8 x1,u8 y1,u8 x2,u8 y2,u8 mode) | ||||
| /*函数: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; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>  | ||||
| 	delta_x=x2-x1;  | ||||
| 	delta_y=y2-y1; | ||||
| 	uRow=x1;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> | ||||
| 	uRow=x1; | ||||
| 	uCol=y1; | ||||
| 	if(delta_x>0)incx=1; //<2F><><EFBFBD>õ<EFBFBD><C3B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>  | ||||
| 	else if (delta_x==0)incx=0;//<2F><>ֱ<EFBFBD><D6B1>  | ||||
| 	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;//ˮƽ<CBAE><C6BD>  | ||||
| 	else if (delta_y==0)incy=0; | ||||
| 	else {incy=-1;delta_y=-delta_x;} | ||||
| 	if(delta_x>delta_y)distance=delta_x; //ѡȡ<D1A1><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>  | ||||
| 	if(delta_x>delta_y)distance=delta_x; | ||||
| 	else distance=delta_y; | ||||
| 	for(t=0;t<distance+1;t++) | ||||
| 	{ | ||||
| 		OLED_DrawPoint(uRow,uCol,mode);//<2F><><EFBFBD><EFBFBD> | ||||
| 		ABS_OLED_DrawPoint(uRow,uCol,mode); | ||||
| 		xerr+=delta_x; | ||||
| 		yerr+=delta_y; | ||||
| 		if(xerr>distance) | ||||
| @@ -225,27 +268,31 @@ void OLED_DrawLine(u8 x1,u8 y1,u8 x2,u8 y2,u8 mode) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| //x,y:Բ<><D4B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD> | ||||
| //r:Բ<>İ뾶 | ||||
| void OLED_DrawCircle(u8 x,u8 y,u8 r) | ||||
| /*函数: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)       | ||||
|     { | ||||
|         OLED_DrawPoint(x + a, y - b,1); | ||||
|         OLED_DrawPoint(x - a, y - b,1); | ||||
|         OLED_DrawPoint(x - a, y + b,1); | ||||
|         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 + a, y + b,1); | ||||
|   | ||||
|         OLED_DrawPoint(x + b, y + a,1); | ||||
|         OLED_DrawPoint(x + b, y - a,1); | ||||
|         OLED_DrawPoint(x - b, y - a,1); | ||||
|         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); | ||||
|         ABS_OLED_DrawPoint(x - b, y + a,1); | ||||
|          | ||||
|         a++; | ||||
|         num = (a * a + b * b) - r*r;//<2F><><EFBFBD>㻭<EFBFBD>ĵ<EFBFBD><C4B5><EFBFBD>Բ<EFBFBD>ĵľ<C4B5><C4BE><EFBFBD> | ||||
|         num = (a * a + b * b) - r*r; | ||||
|         if(num > 0) | ||||
|         { | ||||
|             b--; | ||||
| @@ -254,35 +301,36 @@ void OLED_DrawCircle(u8 x,u8 y,u8 r) | ||||
|     } | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
| //<2F><>ָ<EFBFBD><D6B8>λ<EFBFBD><CEBB><EFBFBD><EFBFBD>ʾһ<CABE><D2BB><EFBFBD>ַ<EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD> | ||||
| //x:0~127 | ||||
| //y:0~63 | ||||
| //size1:ѡ<><D1A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 6x8/6x12/8x16/12x24 | ||||
| //mode:0,<2C><>ɫ<EFBFBD><C9AB>ʾ;1,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ | ||||
| void OLED_ShowChar(u8 x,u8 y,u8 chr,u8 size1,u8 mode) | ||||
| /*函数: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);  //<2F>õ<EFBFBD><C3B5><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ռ<EFBFBD><D5BC><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD> | ||||
| 	chr1=chr-' ';  //<2F><><EFBFBD><EFBFBD>ƫ<EFBFBD>ƺ<EFBFBD><C6BA>ֵ | ||||
| 	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];} //<2F><><EFBFBD><EFBFBD>0806<30><36><EFBFBD><EFBFBD> | ||||
| 			  {temp=asc2_0806[chr1][i];}  | ||||
| 		else if(size1==12) | ||||
|         {temp=asc2_1206[chr1][i];} //<EFBFBD><EFBFBD><EFBFBD><EFBFBD>1206<EFBFBD><EFBFBD><EFBFBD><EFBFBD> | ||||
|         {temp=asc2_1206[chr1][i];} //12*06大小 | ||||
| 		else if(size1==16) | ||||
|         {temp=asc2_1608[chr1][i];} //<EFBFBD><EFBFBD><EFBFBD><EFBFBD>1608<EFBFBD><EFBFBD><EFBFBD><EFBFBD> | ||||
|         {temp=asc2_1608[chr1][i];} //16*08大小 | ||||
| 		else if(size1==24) | ||||
|         {temp=asc2_2412[chr1][i];} //<EFBFBD><EFBFBD><EFBFBD><EFBFBD>2412<EFBFBD><EFBFBD><EFBFBD><EFBFBD> | ||||
|         {temp=asc2_2412[chr1][i];} //24*12大小 | ||||
| 		else return; | ||||
| 		for(m=0;m<8;m++) | ||||
| 		{ | ||||
| 			if(temp&0x01)OLED_DrawPoint(x,y,mode); | ||||
| 			else OLED_DrawPoint(x,y,!mode); | ||||
| 			if(temp&0x01)ABS_OLED_DrawPoint(x,y,mode); | ||||
| 			else ABS_OLED_DrawPoint(x,y,!mode); | ||||
| 			temp>>=1; | ||||
| 			y++; | ||||
| 		} | ||||
| @@ -293,25 +341,31 @@ void OLED_ShowChar(u8 x,u8 y,u8 chr,u8 size1,u8 mode) | ||||
|   } | ||||
| } | ||||
|  | ||||
|  | ||||
| //<2F><>ʾ<EFBFBD>ַ<EFBFBD><D6B7><EFBFBD> | ||||
| //x,y:<3A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>   | ||||
| //size1:<3A><><EFBFBD><EFBFBD><EFBFBD>С  | ||||
| //*chr:<3A>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>ַ  | ||||
| //mode:0,<2C><>ɫ<EFBFBD><C9AB>ʾ;1,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ | ||||
| void OLED_ShowString(u8 x,u8 y,u8 *chr,u8 size1,u8 mode) | ||||
| /*函数: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<='~'))//<2F>ж<EFBFBD><D0B6>Dz<EFBFBD><C7B2>ǷǷ<C7B7><C7B7>ַ<EFBFBD>! | ||||
| 	while((*chr>=' ')&&(*chr<='~')) | ||||
| 	{ | ||||
| 		OLED_ShowChar(x,y,*chr,size1,mode); | ||||
| 		ABS_OLED_ShowChar(x,y,*chr,size1,mode); | ||||
| 		if(size1==8)x+=6; | ||||
| 		else x+=size1/2; | ||||
| 		chr++; | ||||
|   } | ||||
| } | ||||
|  | ||||
| //m^n | ||||
| u32 OLED_Pow(u8 m,u8 n) | ||||
| /*函数:ABS_OLED_Pow | ||||
| **描述:内部函数,用于求次方 | ||||
| **参数1:m:底数 | ||||
| **参数2:n:指数 | ||||
| */ | ||||
| static u32 ABS_OLED_Pow(u8 m,u8 n) | ||||
| { | ||||
| 	u32 result=1; | ||||
| 	while(n--) | ||||
| @@ -321,54 +375,61 @@ u32 OLED_Pow(u8 m,u8 n) | ||||
| 	return result; | ||||
| } | ||||
|  | ||||
| //<2F><>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD> | ||||
| //x,y :<3A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> | ||||
| //num :Ҫ<><D2AA>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD><EFBFBD><EFBFBD> | ||||
| //len :<3A><><EFBFBD>ֵ<EFBFBD>λ<EFBFBD><CEBB> | ||||
| //size:<3A><><EFBFBD><EFBFBD><EFBFBD>С | ||||
| //mode:0,<2C><>ɫ<EFBFBD><C9AB>ʾ;1,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ | ||||
| void OLED_ShowNum(u8 x,u8 y,u32 num,u8 len,u8 size1,u8 mode) | ||||
| /*函数: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/OLED_Pow(10,len-t-1))%10; | ||||
| 		temp=(num/ABS_OLED_Pow(10,len-t-1))%10; | ||||
| 			if(temp==0) | ||||
| 			{ | ||||
| 				OLED_ShowChar(x+(size1/2+m)*t,y,'0',size1,mode); | ||||
| 				ABS_OLED_ShowChar(x+(size1/2+m)*t,y,'0',size1,mode); | ||||
|       } | ||||
| 			else  | ||||
| 			{ | ||||
| 			  OLED_ShowChar(x+(size1/2+m)*t,y,temp+'0',size1,mode); | ||||
| 			  ABS_OLED_ShowChar(x+(size1/2+m)*t,y,temp+'0',size1,mode); | ||||
| 			} | ||||
|   } | ||||
| } | ||||
|  | ||||
| //<2F><>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD> | ||||
| //x,y:<3A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> | ||||
| //num:<3A><><EFBFBD>ֶ<EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD><EFBFBD> | ||||
| //mode:0,<2C><>ɫ<EFBFBD><C9AB>ʾ;1,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ | ||||
| void OLED_ShowChinese(u8 x,u8 y,u8 num,u8 size1,u8 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;  //<2F>õ<EFBFBD><C3B5><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ռ<EFBFBD><D5BC><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD> | ||||
| 	u16 i,size3=(size1/8+((size1%8)?1:0))*size1;   | ||||
| 	for(i=0;i<size3;i++) | ||||
| 	{ | ||||
| 		if(size1==16) | ||||
| 				{temp=Hzk1[num][i];}//<2F><><EFBFBD><EFBFBD>16*16<31><36><EFBFBD><EFBFBD> | ||||
| 				{temp=Hzk1[num][i];} | ||||
| 		else if(size1==24) | ||||
| 				{temp=Hzk2[num][i];}//<2F><><EFBFBD><EFBFBD>24*24<32><34><EFBFBD><EFBFBD> | ||||
| 				{temp=Hzk2[num][i];} | ||||
| 		else if(size1==32)        | ||||
| 				{temp=Hzk3[num][i];}//<2F><><EFBFBD><EFBFBD>32*32<33><32><EFBFBD><EFBFBD> | ||||
| 				{temp=Hzk3[num][i];} | ||||
| 		else if(size1==64) | ||||
| 				{temp=Hzk4[num][i];}//<2F><><EFBFBD><EFBFBD>64*64<36><34><EFBFBD><EFBFBD> | ||||
| 				{temp=Hzk4[num][i];} | ||||
| 		else return; | ||||
| 		for(m=0;m<8;m++) | ||||
| 		{ | ||||
| 			if(temp&0x01)OLED_DrawPoint(x,y,mode); | ||||
| 			else OLED_DrawPoint(x,y,!mode); | ||||
| 			if(temp&0x01)ABS_OLED_DrawPoint(x,y,mode); | ||||
| 			else ABS_OLED_DrawPoint(x,y,!mode); | ||||
| 			temp>>=1; | ||||
| 			y++; | ||||
| 		} | ||||
| @@ -379,22 +440,25 @@ void OLED_ShowChinese(u8 x,u8 y,u8 num,u8 size1,u8 mode) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| //num <20><>ʾ<EFBFBD><CABE><EFBFBD>ֵĸ<D6B5><C4B8><EFBFBD> | ||||
| //space ÿһ<C3BF><D2BB><EFBFBD><EFBFBD>ʾ<EFBFBD>ļ<EFBFBD><C4BC> | ||||
| //mode:0,<2C><>ɫ<EFBFBD><C9AB>ʾ;1,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ | ||||
| void OLED_ScrollDisplay(u8 num,u8 space,u8 mode) | ||||
| /*函数: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) | ||||
| 		{ | ||||
| 	    OLED_ShowChinese(128,24,t,16,mode); //д<><D0B4>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD>ֱ<EFBFBD><D6B1><EFBFBD><EFBFBD><EFBFBD>ABS_OLED_GRAM[][]<5D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> | ||||
| 	    ABS_OLED_ShowChinese(128,24,t,16,mode);  | ||||
| 			t++; | ||||
| 		} | ||||
| 		if(t==num) | ||||
| 			{ | ||||
| 				for(r=0;r<16*space;r++)      //<2F><>ʾ<EFBFBD><CABE><EFBFBD> | ||||
| 				for(r=0;r<16*space;r++) | ||||
| 				 { | ||||
| 					for(i=1;i<144;i++) | ||||
| 						{ | ||||
| @@ -409,7 +473,7 @@ void OLED_ScrollDisplay(u8 num,u8 space,u8 mode) | ||||
|       } | ||||
| 		m++; | ||||
| 		if(m==16){m=0;} | ||||
| 		for(i=1;i<144;i++)   //ʵ<><CAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD> | ||||
| 		for(i=1;i<144;i++)  | ||||
| 		{ | ||||
| 			for(n=0;n<8;n++) | ||||
| 			{ | ||||
| @@ -420,11 +484,16 @@ void OLED_ScrollDisplay(u8 num,u8 space,u8 mode) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| //x,y<><79><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> | ||||
| //sizex,sizey,ͼƬ<CDBC><C6AC><EFBFBD><EFBFBD> | ||||
| //BMP[]<5D><>Ҫд<D2AA><D0B4><EFBFBD>ͼƬ<CDBC><C6AC><EFBFBD><EFBFBD> | ||||
| //mode:0,<2C><>ɫ<EFBFBD><C9AB>ʾ;1,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ | ||||
| void OLED_ShowPicture(u8 x,u8 y,u8 sizex,u8 sizey,u8 BMP[],u8 mode) | ||||
| /*函数: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; | ||||
| @@ -438,8 +507,8 @@ void OLED_ShowPicture(u8 x,u8 y,u8 sizex,u8 sizey,u8 BMP[],u8 mode) | ||||
| 				j++; | ||||
| 				for(m=0;m<8;m++) | ||||
| 				{ | ||||
| 					if(temp&0x01)OLED_DrawPoint(x,y,mode); | ||||
| 					else OLED_DrawPoint(x,y,!mode); | ||||
| 					if(temp&0x01)ABS_OLED_DrawPoint(x,y,mode); | ||||
| 					else ABS_OLED_DrawPoint(x,y,!mode); | ||||
| 					temp>>=1; | ||||
| 					y++; | ||||
| 				} | ||||
| @@ -464,7 +533,7 @@ void ABS_OLED_Init(void) | ||||
| 		#endif | ||||
| 	 | ||||
| 		#ifdef Enable_ABS_OLED_Delay | ||||
| 		AbsOledDelay(3);			//延时 | ||||
| 		AbsOledDelay(10);			//延时 | ||||
| 		#endif | ||||
| 	 | ||||
| 		#ifdef Enable_ABS_OLED_RES | ||||
| @@ -501,6 +570,23 @@ void ABS_OLED_Init(void) | ||||
|     AbsOledWriteCMD(0x8D); //--set DC-DC enable | ||||
|     AbsOledWriteCMD(0x14); // | ||||
|     AbsOledWriteCMD(CMD_ON_OLED); //--turn on SSD1306 panel | ||||
| 		OLED_Clear(); | ||||
| 		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; | ||||
| } | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user