打印
[其他ST产品]

STM32外设系列—OLED

[复制链接]
楼主: rzjvv
手机看帖
扫描二维码
随时随地手机跟帖
21
rzjvv|  楼主 | 2023-7-30 00:53 | 只看该作者 |只看大图 回帖奖励 |倒序浏览
显示一串字符串函数如下
/*
*==============================================================================
*函数名称:Med_Oled_ShowString
*函数功能:显示一串字符串
*输入参数:x:横坐标;y:纵坐标;chr:要显示的字符串;Char_Size:大小(8/16)
*返回值:无
*备  注:无
*==============================================================================
*/
void Med_Oled_ShowString(u8 x,u8 y,u8 *chr,u8 Char_Size)
{
        while (*chr!='\0')
        {
                Med_Oled_ShowChar(x,y,*chr,Char_Size);
                x+=8;
                if(x>120)
                {
                        x=0;
                        y+=2;
                }
                chr++;
        }
}

使用特权

评论回复
22
rzjvv|  楼主 | 2023-7-30 00:53 | 只看该作者
需要显示一串字符串时,添加下面程序
Med_Oled_ShowString(2,6,"ertu-20230621",8);   // 在OLED上显示字符串

使用特权

评论回复
23
rzjvv|  楼主 | 2023-7-30 00:53 | 只看该作者
4.2.3 OLED显示图片
下面提供了显示图片的函数
/*
*==============================================================================
*函数名称:Med_Oled_DrawBMP
*函数功能:显示一张BMP图片
*输入参数:x0:起始横坐标;y:起始纵坐标;x1:终止横坐标;y1:终止纵坐标;
            BMP[]:要显示的图片
*返回值:无
*备  注:无
*==============================================================================
*/
void Med_Oled_DrawBMP(u8 x0, u8 y0, u8 x1, u8 y1,u8 BMP[])
{        
u32 j=0;
u8 x,y;
  
  if (y1%8==0)
        {
                y = y1 / 8;   
        }   
  else
        {
                y = y1 / 8 + 1;
        }
        for (y = y0;y < y1;y ++)
        {
                Med_Oled_Set_Pos(x0,y);
    for(x = x0;x < x1;x ++)
            {      
                    OLED_WR_Byte(BMP[j++],OLED_DATA);                   
            }
        }
}

使用特权

评论回复
24
rzjvv|  楼主 | 2023-7-30 00:54 | 只看该作者
下面是图片取模后的存储文件,其中标注了取模软件,以及取模时的配置
#ifndef __BMP_H
#define __BMP_H

// 图片取模时,首先将图片另存为.bmp格式
// 用Image2Lcd软件取模
// 扫描模式设置为数据水平,字节垂直
// 输出灰度为单色
// 40*40
// 只勾选字节内像素数据反序
unsigned char BMP1[] =
{ /* 0X22,0X01,0X28,0X00,0X28,0X00, */
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X80,
0XC0,0X60,0X30,0X10,0X10,0X30,0X20,0X20,0X20,0X00,0X40,0X40,0X40,0X40,0X00,0X00,
0X80,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0XC0,0X60,0X30,0X18,0X0C,0X06,0X03,0X01,0X08,0X04,0X02,0X12,0X02,0X04,0X24,0X24,
0X24,0X20,0X08,0X08,0X28,0X10,0X00,0X00,0X80,0X40,0X71,0X09,0XC7,0X00,0X00,0X00,
0X00,0X00,0X00,0XE0,0X18,0X04,0X82,0X40,0X00,0X80,0X80,0X80,0X80,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0XC0,0X60,0X30,0X18,0X8C,0X44,0X11,
0X08,0X87,0X60,0X30,0X0F,0X00,0X00,0X00,0X00,0X00,0X00,0X0F,0X20,0X43,0X44,0X00,
0X90,0X90,0X90,0X20,0X20,0X20,0X41,0X41,0X03,0X82,0X82,0X80,0X84,0X04,0X04,0X42,
0X21,0X10,0X84,0X06,0X23,0X10,0X08,0X02,0X01,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X01,0X00,0X02,0X02,
0X02,0X02,0X00,0X04,0X04,0X0C,0X08,0X0C,0X06,0X03,0X01,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,};

#endif

使用特权

评论回复
25
rzjvv|  楼主 | 2023-7-30 00:54 | 只看该作者
主程序中添加如下程序,最终显示结果如下
Med_Oled_DrawBMP(10,1,50,6,BMP1);   // 显示图片

使用特权

评论回复
26
rzjvv|  楼主 | 2023-7-30 00:54 | 只看该作者

使用特权

评论回复
27
rzjvv|  楼主 | 2023-7-30 00:54 | 只看该作者
五、OLED画点/画线
使用OLED时,也常用到画点或者画线,这里给出画点和画线的函数。
/*
*==============================================================================
*函数名称:Med_Oled_Refresh_Gram
*函数功能:更新缓存显示内容
*输入参数:无
*返回值:无
*备  注:无
*==============================================================================
*/
u8 OLED_GRAM[128][8];
void Med_Oled_Refresh_Gram(void)
{
   u8 i,n;
   for(i=0;i<8;i++)
   {
     OLED_WR_Byte (0xb0+i,OLED_CMD);
     OLED_WR_Byte (0x00,OLED_CMD);
     OLED_WR_Byte (0x10,OLED_CMD);
                 for(n=0;n<128;n++)
                 OLED_WR_Byte(OLED_GRAM[n][i],OLED_DATA);
  }
}
/*
*==============================================================================
*函数名称:Med_Oled_DrawPoint
*函数功能:画点
*输入参数:x:横坐标;y:纵坐标;t:清除(0)/填充(1)
*返回值:无
*备  注:无
*==============================================================================
*/
void Med_Oled_DrawPoint(u8 x,u8 y,u8 t)
{
        u8 pos,bx,temp=0;

        if(x>127||y>63) return;
        pos=(y)/8;
        bx=y%8;
        temp=1<<(bx);
        if(t)
                OLED_GRAM[x][pos]|=temp;                //第bx位,置1,其他位值不变
        else
                OLED_GRAM[x][pos]&=~temp;                //第bx位,置0,其他位值不变
        
        // 更新缓存
        Med_Oled_Refresh_Gram();       
}
/*
*==============================================================================
*函数名称:Med_Oled_DrawLine
*函数功能:画线
*输入参数:x1:起始点横坐标;y1:起始点纵坐标;x2:结束点横坐标;
            y2:结束点纵坐标;x:0~128;y:0~64
*返回值:无
*备  注:无
*==============================================================================
*/
void Med_Oled_DrawLine(u8 x1, u8 y1, u8 x2,u8 y2)
{
        unsigned int 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_y;}
        if( delta_x>delta_y)distance=delta_x; //选取基本增量坐标轴
        else distance=delta_y;
        for(t=0;t<=distance+1;t++ )//画线输出
        {  
                Med_Oled_DrawPoint(uRow,uCol,1);//画点
                xerr+=delta_x ;
                yerr+=delta_y ;
                if(xerr>distance)
                {
                        xerr-=distance;
                        uRow+=incx;
                }
                if(yerr>distance)
                {
                        yerr-=distance;
                        uCol+=incy;
                }
        }
}

使用特权

评论回复
28
rzjvv|  楼主 | 2023-7-30 00:54 | 只看该作者
main函数添加如下代码
Med_Oled_DrawPoint(10,20,1);   // 画点
Med_Oled_DrawLine(0,30,100,30);   // 画线

使用特权

评论回复
29
rzjvv|  楼主 | 2023-7-30 00:54 | 只看该作者
显示内容如下

使用特权

评论回复
30
maqianqu| | 2023-9-9 17:25 | 只看该作者
怎么用stm32cubemx配置oled显示的参数

使用特权

评论回复
31
earlmax| | 2023-9-9 20:10 | 只看该作者
OLED在观看舒适度上的巨大优势。刷新频率60Hz就足够了。

使用特权

评论回复
32
cashrwood| | 2023-9-9 20:23 | 只看该作者
OLED模块不与5.0V接口兼容,所以请在使用的时候一定要小心,不要直接接到5V电源上,否则可能烧坏模块。

使用特权

评论回复
33
loutin| | 2023-9-9 20:56 | 只看该作者
根据OLED显示器的接口类型选择适当的STM32引脚作为通信接口。常见的OLED接口有SPI和I2C。确保将STM32的引脚和OLED的引脚正确连接,并在软件中配置正确的接口类型。

使用特权

评论回复
34
yorkbarney| | 2023-9-9 21:31 | 只看该作者
stm32驱动oled 不管是SPI还是IIC为啥都是模拟的

使用特权

评论回复
35
beacherblack| | 2023-9-9 21:43 | 只看该作者
在选择STM32型号时,应考虑其RAM、Flash和处理能力是否足够满足 需求。

使用特权

评论回复
36
Henryko| | 2023-9-11 22:19 | 只看该作者
第一次用时候直接搞不懂位置应该放在哪

使用特权

评论回复
37
plsbackup| | 2023-9-12 16:40 | 只看该作者
oled屏幕突然开始闪烁              

使用特权

评论回复
38
wangdezhi| | 2023-9-12 16:48 | 只看该作者
怎样控制oled 循环显示              

使用特权

评论回复
39
1988020566| | 2023-9-12 18:33 | 只看该作者
OLED一般采用SPI或者I2C接口进行通信

使用特权

评论回复
40
jimmhu| | 2023-9-12 20:12 | 只看该作者
stm32f407与四针oled怎么连接

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则