#include "AbsDrive_OLED.h" #include "oledfont.h" u8 OLED_GRAM[144][8]; /**************************抽象实现************************************/ /*抽象函数:写字节 *要求1:实现一个写入多个字节的函数 *要求2:返回一个AbsDriveOLED_STATE类型的状态 *参数1:_data:写入的数据,一个u8指针类型 *参数2:_size:写入多少个字节 */ static AbsDriveOLED_STATE AbsOledWriteByte(u8 *_data,u8 _size){ /********************请实现抽象写字节函数********************/ if(HAL_SPI_Transmit(&hspi2,_data,_size,1000)==HAL_OK)return ABS_OLED_OK;else return ABS_OLED_ERROR; /********************请实现抽象写字节函数********************/ return ABS_OLED_OK; } #ifdef Enable_ABS_Delay //启用延时函数时可以实现其内容 /*抽象函数:延时函数 *要求1:实现延时函数、 *参数1:t:延时时间 */ static void AbsOledDelay(u32 t){ /********************请实现抽象延时函数********************/ while(t--){} //默认循环while(t--){},可重写 /********************请实现抽象延时函数********************/ } #endif /**************************抽象实现************************************/ /* *函数:AbsOledWriteCMD *功能:写OLED命令 *参数:ABScmd:命令 *返回值:AbsDriveOLED_STATE状态 */ AbsDriveOLED_STATE AbsOledWriteCMD(u8 ABScmd){ #ifdef ABSDrive_4SPI HAL_GPIO_WritePin(oled_cs_GPIO_Port, oled_cs_Pin, GPIO_PIN_RESET); if(AbsOledWriteByte(&ABScmd,1)==ABS_OLED_OK)return ABS_OLED_OK; #endif #ifdef ABSDrive_3SPI #endif return ABS_OLED_ERROR; } /* *函数:AbsOledWriteDATA *功能:写OLED数据 *参数:ABScmd:OLED数据 *返回值:AbsDriveOLED_STATE状态 */ AbsDriveOLED_STATE AbsOledWriteDATA(u8 ABSdata){ #ifdef ABSDrive_4SPI HAL_GPIO_WritePin(oled_cs_GPIO_Port, oled_cs_Pin, GPIO_PIN_SET); if(AbsOledWriteByte(&ABSdata,1)==ABS_OLED_OK)return ABS_OLED_OK; #endif #ifdef ABSDrive_3SPI #endif return ABS_OLED_ERROR; } void OLED_ColorTurn(u8 i) { if(i==0) { AbsOledWriteCMD(0xA6); } if(i==1) { AbsOledWriteCMD(0xA7); } } void OLED_DisplayTurn(u8 i) { if(i==0) { AbsOledWriteCMD(0xC8); AbsOledWriteCMD(0xA1); } if(i==1) { AbsOledWriteCMD(0xC0); AbsOledWriteCMD(0xA0); } } void OLED_DisPlay_On(void) { AbsOledWriteCMD(0x8D); AbsOledWriteCMD(0x14); AbsOledWriteCMD(0xAF); } void OLED_DisPlay_Off(void) { AbsOledWriteCMD(0x8D); AbsOledWriteCMD(0x10); AbsOledWriteCMD(0xAE); } /* *函数:OLED_Refresh *描述:刷新OLED */ void OLED_Refresh(void) { u8 i,n; for(i=0;i<8;i++) { AbsOledWriteCMD(0xB0+i); AbsOledWriteCMD(0x00); AbsOledWriteCMD(0x10); for(n=0;n<128;n++)AbsOledWriteDATA(OLED_GRAM[n][i]); } } void OLED_Clear(void) { u8 i,n; for(i=0;i<8;i++) { for(n=0;n<128;n++) { OLED_GRAM[n][i]=0; } } OLED_Refresh(); } //���� //x:0~127 //y:0~63 //t:1 ��� 0,��� void OLED_DrawPoint(u8 x,u8 y,u8 t) { u8 i,m,n; i=y/8; m=y%8; n=1<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;tdistance) { xerr-=distance; uRow+=incx; } if(yerr>distance) { yerr-=distance; uCol+=incy; } } } //x,y:Բ������ //r:Բ�İ뾶 void 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); 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); a++; num = (a * a + b * b) - r*r;//���㻭�ĵ���Բ�ĵľ��� if(num > 0) { b--; a--; } } } //��ָ��λ����ʾһ���ַ�,���������ַ� //x:0~127 //y:0~63 //size1:ѡ������ 6x8/6x12/8x16/12x24 //mode:0,��ɫ��ʾ;1,������ʾ void 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>=1; y++; } x++; if((size1!=8)&&((x-x0)==size1/2)) {x=x0;y0=y0+8;} y=y0; } } //��ʾ�ַ��� //x,y:������� //size1:�����С //*chr:�ַ�����ʼ��ַ //mode:0,��ɫ��ʾ;1,������ʾ void OLED_ShowString(u8 x,u8 y,u8 *chr,u8 size1,u8 mode) { while((*chr>=' ')&&(*chr<='~'))//�ж��Dz��ǷǷ��ַ�! { 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) { u32 result=1; while(n--) { result*=m; } return result; } //��ʾ���� //x,y :������� //num :Ҫ��ʾ������ //len :���ֵ�λ�� //size:�����С //mode:0,��ɫ��ʾ;1,������ʾ void 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>=1; y++; } x++; if((x-x0)==size1) {x=x0;y0=y0+8;} y=y0; } } //num ��ʾ���ֵĸ��� //space ÿһ����ʾ�ļ�� //mode:0,��ɫ��ʾ;1,������ʾ void 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); //д��һ�����ֱ�����OLED_GRAM[][]������ t++; } if(t==num) { for(r=0;r<16*space;r++) //��ʾ��� { for(i=1;i<144;i++) { for(n=0;n<8;n++) { OLED_GRAM[i-1][n]=OLED_GRAM[i][n]; } } OLED_Refresh(); } t=0; } m++; if(m==16){m=0;} for(i=1;i<144;i++) //ʵ������ { for(n=0;n<8;n++) { OLED_GRAM[i-1][n]=OLED_GRAM[i][n]; } } OLED_Refresh(); } } //x,y��������� //sizex,sizey,ͼƬ���� //BMP[]��Ҫд���ͼƬ���� //mode:0,��ɫ��ʾ;1,������ʾ void 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>=1; y++; } x++; if((x-x0)==sizex) { x=x0; y0=y0+8; } y=y0; } } } /* *函数:ABS_OLED_Init *功能:初始化OLED */ void ABS_OLED_Init(void) { OLED_RES_Clr(); #ifdef Enable_ABS_Delay AbsOledDelay(3); #endif OLED_RES_Set(); AbsOledWriteCMD(CMD_OFF_OLED); //关闭OLED屏幕 AbsOledWriteCMD(CMD_Memory_Addr_Mode_OLED); //设置内存寻址模式,下一条命令设置值 AbsOledWriteCMD(0x10); //低2位的值[---- --**]: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 OLED_Clear(); }