commit 5d73792f31612e680e1ab49ea61cd64a3e1fcdf5 Author: wangko <321640253@qq.com> Date: Mon Oct 2 03:43:21 2023 +0800 init diff --git a/OLED显示屏/AbsDrive_OLED.c b/OLED显示屏/AbsDrive_OLED.c new file mode 100644 index 0000000..3a2abb5 --- /dev/null +++ b/OLED显示屏/AbsDrive_OLED.c @@ -0,0 +1,474 @@ +#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(); +} + diff --git a/OLED显示屏/AbsDrive_OLED.h b/OLED显示屏/AbsDrive_OLED.h new file mode 100644 index 0000000..53357d0 --- /dev/null +++ b/OLED显示屏/AbsDrive_OLED.h @@ -0,0 +1,112 @@ +/*文件:AbsDrive_OLED.h +* 作者:你遇了我 +* 联系:321640253@qq.com +* 描述:抽象硬件OLED屏幕,只需要实现指定的抽象函数,即可使用 +* 使用:1、在配置区选择配置 + 2、按照配置到AbsDrive_OLED.c实现抽象函数 +*/ + +#ifndef __ABS_DRIVE_OLED_H +#define __ABS_DRIVE_OLED_H + +#include "stdlib.h" +#include "stdint.h" +#include "spi.h" +#include "gpio.h" +#include "main.h" + + +/**************************配置区***************************/ +/*----1、选择驱动芯片----*/ +/* +根据你的OLED屏幕选择其中一种 +目前支持SSD1306、SSD1315 +*/ +#define ABS_SSD1306 +//#define ABS_SSD1315 + + +/*----2、选择你实现的通信方式----*/ +/*根据你所实现的抽象函数的方式选择:4线SPI、3线SPI、软件IIC、硬件IIC +*/ +#define ABSDrive_4SPI +//#define ABSDrive_3SPI +//#define ABSDrive_SoftIIC +//#define ABSDrive_HardIIC + +/*----3、是否启动延时函数----*/ +/*不需要延时函数时可以注释掉*/ +#define Enable_ABS_Delay + + +/**************************配置区***************************/ + + +#define OLED_RES_Clr() HAL_GPIO_WritePin(oled_res_GPIO_Port,oled_res_Pin,GPIO_PIN_RESET)//RES +#define OLED_RES_Set() HAL_GPIO_WritePin(oled_res_GPIO_Port,oled_res_Pin,GPIO_PIN_SET) + + +#define OLED_CMD 0 +#define OLED_DATA 1 + +/*************************数据定义区*****************************/ + +#define u8 uint8_t +#define u16 uint16_t +#define u32 uint32_t + +/* +*OLED的状态 +*/ +typedef enum _OLED_STATE{ + ABS_OLED_OK =0x00U, //状态正确 + ABS_OLED_ERROR =0x01U, //状态异常 +} AbsDriveOLED_STATE; +/*************************数据定义区*****************************/ + +/***********************命令区*****************************/ +#if (defined ABS_SSD1306)||(defined ABS_SSD1315) +//设置类 +//-------基本命令-------------- + #define CMD_OFF_OLED 0xAE //关闭OLED屏幕 + #define CMD_ON_OLED 0xAF //打开OLED屏幕 + #define CMD_EntireDisplay_OLED 0xA4 //整个屏幕显示(按照GRAM内容) + #define CMD_EntireDisplayOnRAM_OLED 0xA5 //整个屏幕显示(忽视GRAM内容全部亮起) + #define CMD_Normal_display_OLED 0xA6 //正常显示 + #define CMD_Inverse_display_OLED 0xA7 //反向显示 + #define CMD_Set_Contrast_Control_OLED 0x81 //设置对比度 + +//-------寻址设置命令---------- + #define CMD_LColAddr_OLED 0x00 //设置列地址开始的起始地址,低位寻址,次命令仅适用于页寻址模式 + #define CMD_HColAddr_OLED 0x10 //设置列地址开始的起始地址,高位寻址,次命令仅适用于页寻址模式 + #define CMD_Memory_Addr_Mode_OLED 0x20 //设置内存寻址模式,A[1,0],00b水平寻址,01b垂直寻址,11b重置寻址模式 + #define CMD_SetColumnAddr_OLED 0x21 //设置列开始和结束地址 + +#endif + +void OLED_ClearPoint(u8 x,u8 y); +void OLED_ColorTurn(u8 i); +void OLED_DisplayTurn(u8 i); +void I2C_Start(void); +void I2C_Stop(void); +void I2C_WaitAck(void); +//void Send_Byte(u8 dat); +//void OLED_WR_Byte(u8 dat,u8 mode); +void OLED_DisPlay_On(void); +void OLED_DisPlay_Off(void); +void OLED_Refresh(void); +void OLED_Clear(void); +void OLED_DrawPoint(u8 x,u8 y,u8 t); +void OLED_DrawLine(u8 x1,u8 y1,u8 x2,u8 y2,u8 mode); +void OLED_DrawCircle(u8 x,u8 y,u8 r); +void OLED_ShowChar(u8 x,u8 y,u8 chr,u8 size1,u8 mode); +void OLED_ShowChar6x8(u8 x,u8 y,u8 chr,u8 mode); +void OLED_ShowString(u8 x,u8 y,u8 *chr,u8 size1,u8 mode); +void OLED_ShowNum(u8 x,u8 y,u32 num,u8 len,u8 size1,u8 mode); +void OLED_ShowChinese(u8 x,u8 y,u8 num,u8 size1,u8 mode); +void OLED_ScrollDisplay(u8 num,u8 space,u8 mode); +void OLED_ShowPicture(u8 x,u8 y,u8 sizex,u8 sizey,u8 BMP[],u8 mode); +void ABS_OLED_Init(void); + +#endif //__ABS_DRIVE_OLED_H + diff --git a/OLED显示屏/README.md b/OLED显示屏/README.md new file mode 100644 index 0000000..e69de29 diff --git a/README.md b/README.md new file mode 100644 index 0000000..e69de29