一.OLED的简单说明
0.96寸七针OLED:
CS:OLED片选信号;
RST(RES):硬复位OLED;
DC(RS):命令/数据标志(0,读写命令;1,读写数据)。
接线如下:D0,D1分别接SPI_CLK,SPI_MOSI
二.Cubemx的配置
三.根据时序图写驱动程序及自定义显示程序
驱动程序:
- void OLED_WR_Byte(uint8_t dat,uint8_t cmd)
- {
- if(cmd)
- {
- OLED_DC_Set();//命令/数据标志位置为1,则表示传送的是命令字节
- }
-
- else
- OLED_DC_Clr();//命令/数据标志位置为0,则表示传送的是数据字节
- OLED_CS_Clr();//片选信号为低,表示选中OLED
- HAL_SPI_Transmit_DMA(&hspi2,&dat,1);//oled.c文件唯一修改的地方,这里是利用了hal库提供的SPI传送函数
- OLED_CS_Set();
- OLED_DC_Set();
- }
- void OLED_Set_Pos(unsigned char x, unsigned char y)
- {
- OLED_WR_Byte(0xb0+y,OLED_CMD);
- OLED_WR_Byte((((x+2)&0xf0)>>4)|0x10,OLED_CMD);
- OLED_WR_Byte(((x+2)&0x0f),OLED_CMD);
- }
- //开启OLED显示
- void OLED_Display_On(void)
- {
- OLED_WR_Byte(0X8D,OLED_CMD); //设置电荷泵命令字
- OLED_WR_Byte(0X14,OLED_CMD); //开启电荷泵
- OLED_WR_Byte(0XAF,OLED_CMD); //DISPLAY ON
- }
- //关闭OLED显示
- void OLED_Display_Off(void)
- {
- OLED_WR_Byte(0X8D,OLED_CMD); //设置电荷泵命令字
- OLED_WR_Byte(0X10,OLED_CMD); //关闭电荷泵
- OLED_WR_Byte(0XAE,OLED_CMD); //DISPLAY OFF
- }
- //清屏函数,清完后整个屏幕都是黑色的,没有一点光亮
- void OLED_Clear(void)
- {
- uint8_t i,n;
- for(i=0;i<8;i++)
- {
- OLED_WR_Byte (0xb0+i,OLED_CMD); //设置页地址
- OLED_WR_Byte (0x02,OLED_CMD); //设置起始列低地址
- OLED_WR_Byte (0x10,OLED_CMD); //设置起始列高地址
- for(n=0;n<128;n++)OLED_WR_Byte(0,OLED_DATA);
- } //更新显示
- }
复制代码
用户自定义:
- //在指定位置显示一个字符,包括部分字符
- //x:0~127
- //y:0~6
- //mode:0,反白显示;1,正常显示
- //size:选择字体大小 16/12
- void OLED_ShowChar(uint8_t x,uint8_t y,uint8_t chr)
- {
- unsigned char c=0,i=0;
- c=chr-' ';//得到偏移后的值
- if(x>Max_Column-1){x=0;y=y+2;}
- if(SIZE ==16)
- {
- OLED_Set_Pos(x,y);
- for(i=0;i<8;i++)
- OLED_WR_Byte(F8X16[c*16+i],OLED_DATA);
- OLED_Set_Pos(x,y+1);
- for(i=0;i<8;i++)
- OLED_WR_Byte(F8X16[c*16+i+8],OLED_DATA);
- }
- else {
- OLED_Set_Pos(x,y+1);
- for(i=0;i<6;i++)
- OLED_WR_Byte(F6x8[c]<i>,OLED_DATA);
-
- }
- }
- //m^n函数
- uint32_t oled_pow(uint8_t m,uint8_t n)
- {
- uint32_t result=1;
- while(n--)result*=m;
- return result;
- }
- //显示两个数字
- //x,y :起点坐标
- //len :数字的位数
- //size:字体大小
- //mode:0:填充模式;1:叠加模式
- //num:数值(0~4294967295);
- void OLED_ShowNum(uint8_t x,uint8_t y,uint32_t num,uint8_t len,uint8_t size)
- {
- uint8_t t,temp;
- uint8_t enshow=0;
- for(t=0;t<len;t++)
- {
- temp=(num/oled_pow(10,len-t-1))%10;
- if(enshow==0&&t<(len-1))
- {
- if(temp==0)
- {
- OLED_ShowChar(x+(size/2)*t,y,' ');
- continue;
- }else enshow=1;
-
- }
- OLED_ShowChar(x+(size/2)*t,y,temp+'0');
- }
- }
- //显示一个字符串
- void OLED_ShowString(uint8_t x,uint8_t y,uint8_t *chr)
- {
- unsigned char j=0;
- while (chr[j]!='\0')
- { OLED_ShowChar(x,y,chr[j]);
- x+=8;
- if(x>120){x=0;y+=2;}
- j++;
- }
- }
- //显示汉字
- void OLED_ShowCHinese(uint8_t x,uint8_t y,uint8_t no)
- {
- uint8_t t,adder=0;
- OLED_Set_Pos(x,y);
- for(t=0;t<16;t++)
- {
- OLED_WR_Byte(Hzk[2*no][t],OLED_DATA);
- adder+=1;
- }
- OLED_Set_Pos(x,y+1);
- for(t=0;t<16;t++)
- {
- OLED_WR_Byte(Hzk[2*no+1][t],OLED_DATA);
- adder+=1;
- }
- }
- /*显示BMP图片。x的范围为0~127,y的页得的范围0~7*/
- void OLED_DrawBMP(unsigned char x0, unsigned char y0,unsigned char x1, unsigned char y1,unsigned char BMP[])
- {
- unsigned int j=0;
- unsigned char x,y;
- if(y1%8==0) y=y1/8;
- else y=y1/8+1;
- for(y=y0;y<y1;y++)
- {
- OLED_Set_Pos(x0,y);
- for(x=x0;x<x1;x++)
- {
- OLED_WR_Byte(BMP[j++],OLED_DATA);
- }
- }
- }
- //-------------------------------------------------------------------------------------------------------------------
- // @brief 输出单个数字
- // @param void
- // @return
- // @since v1.0
- // Sample usage:
- //-------------------------------------------------------------------------------------------------------------------
- void oled_hexascii(uint16_t hex,int8_t * Print)
- {
- uint8_t hexcheck ;
- uint8_t TEMP ;
- TEMP = 6 ;
- Print[TEMP ]='\0';
- while(TEMP)
- {
- TEMP -- ;
- hexcheck = hex%10 ;
- hex /=10 ;
- Print[TEMP ] = hexcheck + 0x30 ;
- }
- }
- //-------------------------------------------------------------------------------------------------------------------
- // @brief OLED显示字符串(6*8字体)
- // @param x x轴坐标设置0-127
- // @param y y轴坐标设置0-7
- // @param ch[] 字符串
- // @return void
- // @since v1.0
- // Sample usage:
- //-------------------------------------------------------------------------------------------------------------------
- void oled_p6x8str(uint8_t x,uint8_t y,const int8_t ch[])
- {
- uint8_t c=0,i=0,j=0;
- while (ch[j]!='\0')
- {
- c =ch[j]-32;
- if(x>126){x=0;y++;}
- OLED_Set_Pos(x,y);
- for(i=0;i<6;i++) OLED_WR_Byte(oled_6x8[c]<i>,OLED_DATA);
- x+=6;
- j++;
- }
- }
- //-------------------------------------------------------------------------------------------------------------------
- // @brief OLED显示有符号数(6*8字体)
- // @param x x轴坐标设置0-127
- // @param y y轴坐标设置0-7
- // @param num 有符号数
- // @return void
- // @since v1.0
- // Sample usage:
- //-------------------------------------------------------------------------------------------------------------------
- void oled_int16(uint8_t x, uint8_t y, int16_t num)
- {
- int8_t ch[7];
- if(num<0) {num = -num;oled_p6x8str(x, y, "-");}
- else oled_p6x8str(x, y, " ");
- x+=6;
- oled_hexascii(num,ch);
- oled_p6x8str(x, y, &ch[1]); //显示数字 6*8字体
- }
- float fabs(float num)
- {
- if (num >= 0)
- {
- num = num;
- }
- else
- {
- num = -num;
- }
- return num;
- }
- //显示9位字符,最高位正负,三位整数,第五位小数点,后四位小数部分
- //x,y :起点坐标
- //len :数字的位数
- //size:字体大小
- void OLED_Showdecimal(uint8_t x,uint8_t y,float num,uint8_t len,uint8_t size2)
- {
- uint8_t t,temp,len1,temp1;
- float temp2;
- uint8_t enshow=0;
- if(num < 0)
- {
- OLED_ShowChar(x,y,'0'-3);
- // OLED_ShowChar(x,y,'0'- 3,size2);
- num =fabs(num);
- }
- else
- OLED_ShowChar(x,y,' ');//第一位显示符号
- temp1 = (int)temp;
- temp2 = num - temp1;
- len1 = len - 6;//len1为整数部分位数,若显示数位需要扩展,修改该行
- OLED_ShowChar(x + size2/2*4,y,'0'- 2);//浮点数的第5位显示小数点
- x = x + size2/2;
- for(t=0;t<len1;t++)//整数部分的显示
- {
- temp=(int)((num/oled_pow(10,len1-t-1)))%10;
- if(enshow==0&&t<(len1-1))
- {
- if(temp==0)
- {
- OLED_ShowChar(x+(size2/2)*t,y,' ');
- continue;
- }else enshow=1;
-
- }
- OLED_ShowChar(x+(size2/2)*t,y,temp+'0');
- }
- OLED_ShowChar(x+(size2/2)*4,y,((int)(temp2*10)%10) + '0'); //小数第一位
- OLED_ShowChar(x+(size2/2)*5,y,((int)(temp2*100)%10) + '0'); //小数第2位
- OLED_ShowChar(x+(size2/2)*6,y,((int)(temp2*1000)%10) + '0'); //小数第3位
- OLED_ShowChar(x+(size2/2)*7,y,((int)(temp2*10000)%10) + '0'); //小数第4位
- }
- //初始化SSD1306
- void OLED_Init(void)
- {
-
- OLED_RST_Clr();
- HAL_Delay(200);
- OLED_RST_Set();
-
- OLED_WR_Byte(0xAE,OLED_CMD);//--turn off oled panel
- OLED_WR_Byte(0x02,OLED_CMD);//---set low column address
- OLED_WR_Byte(0x10,OLED_CMD);//---set high column address
- OLED_WR_Byte(0x40,OLED_CMD);//--set start line address Set Mapping RAM Display Start Line (0x00~0x3F)
- OLED_WR_Byte(0x81,OLED_CMD);//--set contrast control register
- OLED_WR_Byte(0xCF,OLED_CMD); // Set SEG Output Current Brightness
- OLED_WR_Byte(0xA1,OLED_CMD);//--Set SEG/Column Mapping 0Xa0左右反置 0Xa1正常
- OLED_WR_Byte(0xC8,OLED_CMD);//Set COM/Row Scan Direction 0Xc0上下反置 0Xc8正常
- OLED_WR_Byte(0xA6,OLED_CMD);//--set normal display
- OLED_WR_Byte(0xA8,OLED_CMD);//--set multiplex ratio(1 to 64)
- OLED_WR_Byte(0x3f,OLED_CMD);//--1/64 duty
- OLED_WR_Byte(0xD3,OLED_CMD);//-set display offset Shift Mapping RAM Counter (0x00~0x3F)
- OLED_WR_Byte(0x00,OLED_CMD);//-not offset
- OLED_WR_Byte(0xd5,OLED_CMD);//--set display clock divide ratio/oscillator frequency
- OLED_WR_Byte(0x80,OLED_CMD);//--set divide ratio, Set Clock as 100 Frames/Sec
- OLED_WR_Byte(0xD9,OLED_CMD);//--set pre-charge period
- OLED_WR_Byte(0xF1,OLED_CMD);//Set Pre-Charge as 15 Clocks & Discharge as 1 Clock
- OLED_WR_Byte(0xDA,OLED_CMD);//--set com pins hardware configuration
- OLED_WR_Byte(0x12,OLED_CMD);
- OLED_WR_Byte(0xDB,OLED_CMD);//--set vcomh
- OLED_WR_Byte(0x40,OLED_CMD);//Set VCOM Deselect Level
- OLED_WR_Byte(0x20,OLED_CMD);//-Set Page Addressing Mode (0x00/0x01/0x02)
- OLED_WR_Byte(0x02,OLED_CMD);//
- OLED_WR_Byte(0x8D,OLED_CMD);//--set Charge Pump enable/disable
- OLED_WR_Byte(0x14,OLED_CMD);//--set(0x10) disable
- OLED_WR_Byte(0xA4,OLED_CMD);// Disable Entire Display On (0xa4/0xa5)
- OLED_WR_Byte(0xA6,OLED_CMD);// Disable Inverse Display On (0xa6/a7)
- OLED_WR_Byte(0xAF,OLED_CMD);//--turn on oled panel
-
- OLED_WR_Byte(0xAF,OLED_CMD); /*display ON*/
- OLED_Clear();
- }
- </i></i>
复制代码
|