精华内容
下载资源
问答
  • 今天我们先聊聊OLED屏幕那些次像素有趣的排列方式。    我们先回顾下面这张屏幕技术体系架构图:    屏幕技术对应屏幕结构关系图  我们今天的重点内容为倒数第二列内容的上半...
  • 用于0.96的四脚OLED屏幕,软件IIC协议,修改相关引脚输出即可。
  • 0.96寸的OLED 屏幕通过串口发送图片16位数据显示程序。 stm32单片机,usart1管脚,上位机通过串口助手调试发送1024位数据。 先通过取模软件取模,在复制到word中,去掉段落符,否则助手不会发送,而且还会使接收到...
  • stm32 f103c8t6 IIC 驱动oled屏幕 亲测有效 关注bilibili个人账号号 在b站公告免费获取百度网盘下载链接
  • STM32 OLED屏幕 显示测试程序,并且带编码器程序,编码器计算结果显示在屏幕上,有问题请联系我QQ1056247163
  • 七针OLED屏幕Hal库驱动显示函数,完整工程,使用的是正点原子的精英版测试的代码,可移植性强,已经单独用一个文件夹存放OLED的代码 本次的测试是1.3寸OLED屏幕
  • 使用stm32通过oled屏幕显示MPU6050的横滚角,俯仰角,航向角
  • HAL库OLED屏幕SPI

    2020-12-20 22:13:36
    可直接移植
  • 32直流电机测速OLED屏幕.rar
  • stm32f411 freertos 驱动oled屏幕读取ds3231显示时间温度, 主要是freertos的简单使用,欢迎下载
  • STM32F103C8T6 之下通过 cubeMX 配置硬件 i2c 输出到 0.96 寸 OLED 屏幕输出显示的样例和驱动的封装(基于 HAL)。 其他芯片一样可以使用,只要配置好引脚即可。 本驱动参考了硬石样例,与之不同的是,硬石是软件...
  • 点亮0.96OLED 屏幕 使用stm32rct6单片机控制
  • 使用stc51单片机驱动oled显示屏的c程序,适用于keil4开发。
  • 4X4键盘在STM32F103RCT6的泥人开发板上控制OLED显示屏
  • webee cc2530单片机测试中景园的OLED屏幕代码,由于市面上关于cc2530的代码太少,十分不方便,算是贡献一份力量吧
  • 主控采用STM32,通信方式为SPI,说明文档内包含接口定义和说明。亲测可用,如有管脚定义不同,可自行修改
  • STM32F103使用硬件IIC操作OLED屏幕,适用于各类OLED屏幕
  • 有机发光二极管 ##任务 使用 OLED 屏幕玩 Arduino。 语言/平台/工具 JavaScript 约翰尼五 OLED屏幕 阿杜诺
  • void OLED_Init(void) -- OLED屏初始化 * 6. void OLED_SetPos(unsigned char x, unsigned char y) -- 设置起始点坐标 * 7. void OLED_Fill(unsigned char fill_Data) -- 全屏填充 * 8. void OLED_CLS(void) -- ...
  • OLED 屏幕上显示时需要加载的楷体字体文件
  • OLED屏幕使用详解 大家可用于 课程设计 或 毕业设计 技术解答、毕设帮助、开题指导 print("Q 746876041") 2 前言 OLED屏的点亮使用的是模拟IIC功能实现 OLED屏为像素自发光,其尺寸多为128*64,表示横轴上有128个...


    1 简介

    Hi,大家好,这里是丹成学长,今天向大家介绍单片机如何使用OLED屏,并显示中文

    OLED屏幕使用详解

    大家可用于 课程设计 或 毕业设计

    技术解答、毕设帮助、开题指导
    print("Q 746876041") 
    

    2 前言

    OLED屏的点亮使用的是模拟IIC功能实现

    OLED屏为像素自发光,其尺寸多为128*64,表示横轴上有128个像素,纵轴上有64个像素。

    学长将提供使用软件取模的详细介绍,及编程部分代码和注释。

    3 字体取模方法

    3.1 取模软件使用介绍

    在这里插入图片描述
    1、汉字取模:
    在这里插入图片描述

    2、图片取模:ps -> 画图 -> 取模软件 -> c代码数组
    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    将保存到头文件的数组内容直接读取即可使用

    4 51代码

    部分关键代码

    #include <ioCC2530.h>
    #include <stdio.h>
    #include <string.h>
    #include "codetab.h"
    #define uchar unsigned char
    #define uint  unsigned int
    #define OLED_CMD  0    //写命令
    #define OLED_DATA 1    //写数据
    #define IIC_READ  0x1D      //定义读指令
    #define IIC_WRITE 0x1D      //定义写指令
    #define  u8 unsigned char
    #define SDA P0_6              //I2C 数据传送位
    #define SCL P0_7              //I2C 时钟传送位
    #define OLEDadd 0x78
    #define Max_Column    128
    #define Max_Row        64
    #define  u32 unsigned int
    #define iic_delay() Delay_1u(8)
    
    
    void Delay_1u(uint microSecs)
    {
      while(microSecs--)
      {
        /* 32 NOPs == 1 usecs*/
        asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop");
        asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop");
        asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop");
        asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop");
        asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop");
        asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop");
        asm("nop"); asm("nop");
      }
    }
    
    
    
    uchar ack_sign = 0;
    /*********************************************************************/
    /**************               I2C通信部分              ***************/
    /*********************************************************************/
    void iic_start()               //函数功能:I2C通信开始
    {
        SDA = 1;
        iic_delay();
        SCL = 1;
        iic_delay();
        SDA = 0;
        iic_delay();
    }
    
    void iic_stop()                //函数功能:I2C通信停止
    {
        SDA = 0;
        iic_delay();
        SCL = 1;
        iic_delay();
        SDA = 1;
        iic_delay();
    }
    
    void iic_ack()                 //函数功能:I2C通信查应答位
    {
        SDA = 1;
        SCL = 1;
        iic_delay();
        ack_sign = SDA;
        SCL = 0;
    }
    
    void iic_write_byte(uchar wdata)//函数功能:向I2C从机写入一个字节
    {
         uchar i,temp,temp1;
    
         temp1 = wdata;
    
         for (i = 0; i < 8; i++)
         {
            SCL = 0;
            iic_delay();
            temp = temp1;
            temp = temp&0x80;
            SDA = (temp == 0x80? 1: 0);
            iic_delay();
            SCL = 1;
            iic_delay();
            SCL = 0;
            iic_delay();
            temp1 <<= 1;
         }
    
    }
    
    void iic_write(uchar byte_add,uchar wdata)//函数功能:按地址写入一字节数据
    {
         uchar t;
      t = OLEDadd;
      iic_start();   //起始信号
      iic_write_byte(t);
      iic_ack();
      iic_write_byte(byte_add);//内部寄存器地址
      iic_ack();
      iic_write_byte(wdata);//内部寄存器数据
      iic_ack();
      iic_stop();
    }
    
    
    void OLED_WR_Byte(unsigned dat,unsigned cmd)
    {
        if(cmd)
                {
    
      // Write_IIC_Data(dat);
       iic_write(0x40,dat);
    
    
            }
        else {
        iic_write(0x00,dat);
    
        }
    
    
    }
    
    
    /********************************************
    // fill_Picture
    ********************************************/
    void fill_picture(unsigned char fill_Data)
    {
        unsigned char m,n;
        for(m=0;m<8;m++)
        {
            OLED_WR_Byte(0xb0+m,0);        //page0-page1
            OLED_WR_Byte(0x00,0);        //low column start address
            OLED_WR_Byte(0x10,0);        //high column start address
            for(n=0;n<128;n++)
                {
                    OLED_WR_Byte(fill_Data,1);
                }
        }
    }
    
    
    /***********************Delay****************************************/
    void Delay_50ms(unsigned int Del_50ms)
    {
        unsigned int m;
        for(;Del_50ms>0;Del_50ms--)
            for(m=6245;m>0;m--);
    }
    
    void Delay_1ms(unsigned int Del_1ms)
    {
        unsigned char j;
        while(Del_1ms--)
        {
            for(j=0;j<123;j++);
        }
    }
    
    //坐标设置
    
        void OLED_Set_Pos(unsigned char x, unsigned char y)
    {     OLED_WR_Byte(0xb0+y,OLED_CMD);
        OLED_WR_Byte(((x&0xf0)>>4)|0x10,OLED_CMD);
        OLED_WR_Byte((x&0x0f),OLED_CMD);
    }
    //开启OLED显示
    void OLED_Display_On(void)
    {
        OLED_WR_Byte(0X8D,OLED_CMD);  //SET DCDC命令
        OLED_WR_Byte(0X14,OLED_CMD);  //DCDC ON
        OLED_WR_Byte(0XAF,OLED_CMD);  //DISPLAY ON
    }
    //关闭OLED显示
    void OLED_Display_Off(void)
    {
        OLED_WR_Byte(0X8D,OLED_CMD);  //SET DCDC命令
        OLED_WR_Byte(0X10,OLED_CMD);  //DCDC OFF
        OLED_WR_Byte(0XAE,OLED_CMD);  //DISPLAY OFF
    }
    //清屏函数,清完屏,整个屏幕是黑色的!和没点亮一样!!!
    void OLED_Clear(void)
    {
        u8 i,n;
        for(i=0;i<8;i++)
        {
            OLED_WR_Byte (0xb0+i,OLED_CMD);    //设置页地址(0~7)
            OLED_WR_Byte (0x00,OLED_CMD);      //设置显示位置—列低地址
            OLED_WR_Byte (0x10,OLED_CMD);      //设置显示位置—列高地址
            for(n=0;n<128;n++)OLED_WR_Byte(0,OLED_DATA);
        } //更新显示
    }
    void OLED_On(void)
    {
        u8 i,n;
        for(i=0;i<8;i++)
        {
            OLED_WR_Byte (0xb0+i,OLED_CMD);    //设置页地址(0~7)
            OLED_WR_Byte (0x00,OLED_CMD);      //设置显示位置—列低地址
            OLED_WR_Byte (0x10,OLED_CMD);      //设置显示位置—列高地址
            for(n=0;n<128;n++)OLED_WR_Byte(1,OLED_DATA);
        } //更新显示
    }
    //在指定位置显示一个字符,包括部分字符
    //x:0~127
    //y:0~63
    //mode:0,反白显示;1,正常显示
    //size:选择字体 16/12
    void OLED_ShowChar(u8 x,u8 y,u8 chr,u8 Char_Size)
    {
        unsigned char c=0,i=0;
            c=chr-' ';//得到偏移后的值
            if(x>Max_Column-1){x=0;y=y+2;}
            if(Char_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);
                    for(i=0;i<6;i++)
                    OLED_WR_Byte(F6x8[c][i],OLED_DATA);
    
    }
    }
    //m^n函数
    u32 oled_pow(u8 m,u8 n)
    {
        u32 result=1;
        while(n--)result*=m;
        return result;
    }
    //显示2个数字
    //x,y :起点坐标
    //len :数字的位数
    //size:字体大小
    //mode:模式    0,填充模式;1,叠加模式
    //num:数值(0~4294967295);
    void OLED_ShowNum(u8 x,u8 y,u32 num,u8 len,u8 size2)
    {
        u8 t,temp;
        u8 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+(size2/2)*t,y,' ',size2);
                    continue;
                }else enshow=1;
    
            }
             OLED_ShowChar(x+(size2/2)*t,y,temp+'0',size2);
        }
    }
    //显示一个字符号串
    void OLED_ShowString(u8 x,u8 y,u8 *chr,u8 Char_Size)
    {
        unsigned char j=0;
        while (chr[j]!='\0')
        {        OLED_ShowChar(x,y,chr[j],Char_Size);
                x+=8;
            if(x>120){x=0;y+=2;}
                j++;
        }
    }
    
    /***********功能描述:显示显示BMP图片128×64起始点坐标(x,y),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);
            }
        }
    }
    
    //初始化SSD1306
    void OLED_Init(void)
    {
    
       //初始化
        P0SEL &= ~(1<<6); // P1_4 is GPIO
        P0SEL &= ~(1<<7); // P1_7 is GPIO
    
        P0DIR |= 1<<6; //output
        P0DIR |= 1<<7; //output
    
    
        OLED_WR_Byte(0xAE,OLED_CMD);//--display off
        OLED_WR_Byte(0x00,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
    
        OLED_WR_Byte(0xB0,OLED_CMD);//--set page address
    
        OLED_WR_Byte(0x81,OLED_CMD); // contract control
        OLED_WR_Byte(0xFF,OLED_CMD);//--128
        OLED_WR_Byte(0xA1,OLED_CMD);//set segment remap
    
    
        OLED_WR_Byte(0xA6,OLED_CMD);//--normal / reverse
        OLED_WR_Byte(0xA8,OLED_CMD);//--set multiplex ratio(1 to 64)
        OLED_WR_Byte(0x3F,OLED_CMD);//--1/32 duty
    
        OLED_WR_Byte(0xC8,OLED_CMD);//Com scan direction
        OLED_WR_Byte(0xD3,OLED_CMD);//-set display offset
        OLED_WR_Byte(0x00,OLED_CMD);//
    
        OLED_WR_Byte(0xD5,OLED_CMD);//set osc division
        OLED_WR_Byte(0x80,OLED_CMD);//
    
        OLED_WR_Byte(0xD8,OLED_CMD);//set area color mode off
        OLED_WR_Byte(0x05,OLED_CMD);//
    
        OLED_WR_Byte(0xD9,OLED_CMD);//Set Pre-Charge Period
        OLED_WR_Byte(0xF1,OLED_CMD);//
    
        OLED_WR_Byte(0xDA,OLED_CMD);//set com pin configuartion
        OLED_WR_Byte(0x12,OLED_CMD);//
    
        OLED_WR_Byte(0xDB,OLED_CMD);//set Vcomh
        OLED_WR_Byte(0x30,OLED_CMD);//
    
        OLED_WR_Byte(0x8D,OLED_CMD);//set charge pump enable
        OLED_WR_Byte(0x14,OLED_CMD);//
    
        OLED_WR_Byte(0xAF,OLED_CMD);//--turn on oled panel
    }
    

    5 最后

    技术解答、毕设帮助、开题指导
    print("Q 746876041") 
    

    单片机毕设项目大全:
    https://blog.csdn.net/huawei123444/article/details/119822845

    展开全文
  • 【OLED】OLED屏幕的基础知识

    千次阅读 多人点赞 2018-08-17 15:19:14
    单色屏幕的像素是一个像素就是一个发光二极管。OLED是”自发光”,像素本身就是光源,所以对比度极高,显示效果很犀利,绝无朦朦胧胧、拖泥带水之感,深受爱好者追捧,可惜当前技术所限制,无法大尺寸化,价格比TFT...

    OLED显示屏基础知识:
    显示屏的发光单元是有机聚合物发光二极管,即organic/polymer light emitting diode,简称OLED。单色屏幕的像素是一个像素就是一个发光二极管。OLED是”自发光”,像素本身就是光源,所以对比度极高,显示效果很犀利,绝无朦朦胧胧、拖泥带水之感,深受爱好者追捧,可惜当前技术所限制,无法大尺寸化,价格比TFT液晶屏高得多。
    OLED分为PMOLED、AMOLED两种,其中PMOLED为无源驱动,AMOLED为有源驱动。

    展开全文
  • 0.96寸OLED屏幕

    2021-07-02 08:57:04
    0.96寸蓝色OLED屏幕 下面是屏幕图片 2.OLED屏幕驱动方法说明 屏幕的话可以在那啥宝上买到大概10块钱,现在应该还没涨价吧。至于买IIC协议的还是SPI协议的就看单片机使用习惯了,个人还是喜欢SPI的,相比IIC讲SPI...
    	(题外话)为什么选择寄存器来实现,对于初学者而言我非常建议从寄存器配置开始,主要是因为搞单片机本来就是一项接近于底层硬件的工作,不要嫌麻烦。了解硬件外设工作原理和配置过程会对以后的调试有很大帮助。更容易理解库函数开发。
    

    1.硬件资源描述

    主控STM32F103RC
    通讯方式硬件SPI1 +DMA1(DMA可选)
    屏幕0.96寸蓝色OLED屏幕

    下面是屏幕图片
    在这里插入图片描述
    在这里插入图片描述
    2.OLED屏幕驱动方法说明
    屏幕的话可以在那啥宝上买到大概10块钱,现在应该还没涨价吧。至于买IIC协议的还是SPI协议的就看单片机使用习惯了,个人还是喜欢SPI的,相比IIC讲SPI传输速度更快点。至于NSS是接地还是硬件控制,看个人习惯,我选择的是硬件控制。

    	屏幕与单片机接线如下:
    
    或者
    D0
    SCK : PA5
    D1
    MOSI : PA7
    DC
    PA1
    RES
    PA3
    NSS
    PA4
    GND

    注意:VDD和GND千万不要搞反了不然10块钱白给(我就烧坏了一个)😂

    2.1:怎么和屏幕通讯并配置单片机的通讯

    • 下面这张图是OLED屏幕驱动芯片手册提供的SPI时序List itemCS# :通讯时一定要保持低电平。
      D/C# :就是命令模式选择信号低电平时SDIN(D1)的数据就是命令控制字节。
      SCLK :空闲电平高低无关,从这条时钟线可以看出屏幕是在上升沿锁存数据,下降沿允许数据变化。(这点很重要!)
      SDIN(D1) :8为数据高位在前。

    (第三行的时序就是最后两行的组合)

    • 单片机通讯配置
      在这里插入图片描述
      这张图来自STM32F1参考手册
      stm32f1可以将SPI配置成4种通讯时序。对比我们的屏幕,只能选择上升沿采样的两种方式。

    如下表:

    序号控制位描述
    1CPHA=1 CPOL=1空闲时高电平,第二个边沿采样(上升沿)
    2CPHA=0 CPOL=0空闲时低电平,第一个边沿采样(上升沿)

    下面的例程使用的是上表中序号2。
    stm32SPI1寄存器配置如下:

    void SPI1_Init(void)
    {
    	u16 spitest= 0;
    	
    	RCC->APB2ENR			|= 1<<2;				//IO端口A时钟开启
    	RCC->APB2ENR			|= 1<<0;				//辅助功能IO时钟开启
    	RCC->APB2ENR			|= 1<<12;				//SPI1时钟开启
    	GPIOA->CRL				&= 0x0F00FFFF;			//PA4配置清除(NSS)		PA5配置清除(SCK)		PA7配置清除(MOSI)
    	GPIOA->CRL				|= 0xB0BB0000;			//PA4复用功能推挽输出模式,输出模式,最大速度10MHz		PA5 & PA7复用功能推挽输出模式,输出模式,最大速度50MHz
    	
    	spitest						|= 1<<2;			//配置为主设备
    	spitest						|= 1<<9;			//软件从设备管理
    	spitest						|= 1<<8;			//NSS输出
    	spitest						|= 1<<15;			//选择“单线双向”模式
    	spitest						|= 1<<14;			//输出使能(只发模式)
    	spitest						&=~(1<<1);			//空闲状态时,SCK保持低电平
    	spitest						&=~(1<<0);			//数据采样从第一个时钟边沿开始
    	spitest						&=~(1<<11);			//使用8位数据帧格式进行发送/接收
    	spitest						&= 0xFFFFFFC7;		//波特率36Mbs= 4.5M/S
    	spitest						&=~(1<<7);			//先发送MSB
    	SPI1->CR1				   = spitest;
    	SPI1->CR2					|= 1<<1;			//TXDMAEN:发送缓冲区DMA使能
    	SPI1->CR1					|=1<<6;				//打开SPI设备
    }
    
    

    2.2:DMA
    stm32的DMA可是32的一大特色,优点在于它不需要CPU干预,只要DMA被触发就能直接对数据进行搬运。所以使用它可以节省CPU的工作时间用来处理其他任务,在一些大项目中这点尤为突出。详细的配置介绍请参考STM32F1参考手册,这块我就不多言了。直接上代码。

    (不想使用DMA的话可以将主函数注释掉的部分取消注释,并在屏幕初始化函数子函数内倒数第二行取消调用DMA函数)

    inline static void DMA_OLED_Init(void)
    {
    	RCC->AHBENR				 |=	1<<0;		//DMA1时钟开启
    	DMA1_Channel3->CPAR = (u32)(&(SPI1->DR));//CPAR:外设数据寄存器的基地址
    	DMA1_Channel3->CMAR = (u32)(OLED_SRAM);	//CMAR:存储器的基地址
    	DMA1_Channel3->CCR |= 0<<14;			//MEM2MEM:非存储器到存储器模式
    	DMA1_Channel3->CCR |= 0<<6;				//MINC:不执行外设地址增量操作
    	DMA1_Channel3->CCR |= 1<<7;				//MINC:存储器地址增量模式
    	DMA1_Channel3->CCR |= 1<<5;				//CIRC:循环模式
    	DMA1_Channel3->CCR |= 1<<4;				//DIR :从存储器读
    	DMA1_Channel3->CNDTR= 0x400;			//1024个字节
    	DMA1_Channel3->CCR |= 1<<0;				//EN  :通道开启
    
    }
    

    2.3:OLED屏幕的初始化及设置
    相关的控制命令在屏幕手册中都有,下面要注意的一点就是DC控制要注意时间问题。DC是由GPIO控制的,所以反转速度很快,数据发送相比DC要慢得多。倒数第四行的 Wait_us(10); 就是在调试过程中遇到的问题,从代码上看数据已经发送完成了然后再改变DC命令选择,貌似没问题。但是屏幕一直没反应,用逻辑分析仪抓取时序图后发现该问题,下面附图。例程代码已纠正放心复制。
    在这里插入图片描述
    图中时序自上而下分别是SCK,MISO,DC。明显看出数据还未发送结束DC已经改变。

    分析原因:子函数OLED_SendCmd(unsigned char)是判断发送区是否为空,然后条件式的装入。而硬件SPI则需等待上一个数据发送完成才会再处理刚送进来的数据,同样也需要时间。

    代码部分如下

    void OLED_Init(void) //初始化函数
    {
    	#define OLED_DC  	PA1
    	#define OLED_RES 	PA3
    	#define OLED_NSS 	PA4
    	#define OLED_D0  	PA5
    	#define OLED_D1  	PA7
    	
    	GPIOA->CRL				&= 0xFFFF0F0F;	//rs,dc
    	GPIOA->CRL				|= 0x00003030;	//
    	
    	OLED_RES = 0;			 //低电平复位
    	Wait_us(100);
    	OLED_RES = 1;			 //复位结束
    	OLED_DC	 = 0;			 //命令模式
    	Wait_us(100);
    
    	OLED_SendCmd(0xAE);//关闭显示
    	OLED_SendCmd(0xD5);//设置时钟分频因子,震荡频率
    	OLED_SendCmd(0xF0);//[3:0],分频因子;[7:4],震荡频率
    	OLED_SendCmd(0x81);//设置对比度
    	OLED_SendCmd(0x7F);//128
    	OLED_SendCmd(0x8D);//设置电荷泵开关
    	OLED_SendCmd(0x14);//开
    	OLED_SendCmd(0x20);//设置模式
    	OLED_SendCmd(0x00);//设置为水平地址模式
    	OLED_SendCmd(0xD3);//行偏移命令
    	OLED_SendCmd(0x2A);//校正参数
      	OLED_SendCmd(0x21);//设置列地址的起始和结束的位置
      	OLED_SendCmd(0x00);//0
      	OLED_SendCmd(0x7F);//127   
      	OLED_SendCmd(0x22);//设置页地址的起始和结束的位置
      	OLED_SendCmd(0x00);//0
     	OLED_SendCmd(0x07);//7
    	OLED_SendCmd(0xC8);//0xc9上下反置 0xc8正常
     	OLED_SendCmd(0xA1);//0xa0左右反置 0xa1正常
    	OLED_SendCmd(0xA4);//全局显示开启;0xa4正常,0xa5无视命令点亮全屏
    	OLED_SendCmd(0xA6);//设置显示方式;A7,反相显示;A6,正常显示	
    	OLED_SendCmd(0xAF);//开启显示
     	OLED_SendCmd(0x56);
    	Wait_us(10);//
    	OLED_DC	 = 1;			 //显示数据模式
    	DMA_OLED_Init();
    	Wait_us(10);//
    
    }
    
    

    OLED_SendCmd(0xA4);//全局显示开启;0xa4正常,0xa5无视命令点亮全屏
    这行代码在程序调试的时候可以将参数改为0xa5判断通讯是否正常。

    这个是命令发送函数
    OLED屏幕刷新一帧需要128*8个字节,每个字节的每一位控制屏幕的一个像素点(位的0或1表示亮灭),刚好是128 *64个位。

    static void OLED_SendCmd(unsigned char ctrl_data)
    {
    	unsigned char t=200;
    	while(! (SPI1->SR & 1<<1) )			//SPI1->SR & 1<<1=1:发送缓冲为空。
    	{
    		t--;
    		if(t<=0)
    			break;
    	}
    
    	SPI1->DR	= ctrl_data;
    }
    
    
    
    
    void OLED_Write(unsigned char ASII,unsigned char ye,unsigned char lie)
    {
    	char i;
    	for(i=0;i<6;i++)
    	{
    		OLED_SRAM[ye][lie+i]=F6X8[(ASII-32)*6+i];
    	}
    }
    
    

    这个是ASII字库,网上能找到太多了。

    const unsigned char F6X8[] =
    {
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ,   // sp
        0x00, 0x00, 0x00, 0x2f, 0x00, 0x00 ,   // !
        0x00, 0x00, 0x07, 0x00, 0x07, 0x00 ,   // "
        0x00, 0x14, 0x7f, 0x14, 0x7f, 0x14 ,   // #
        0x00, 0x24, 0x2a, 0x7f, 0x2a, 0x12 ,   // $
        0x00, 0x62, 0x64, 0x08, 0x13, 0x23 ,   // %
        0x00, 0x36, 0x49, 0x55, 0x22, 0x50 ,   // &
        0x00, 0x00, 0x05, 0x03, 0x00, 0x00 ,   // '
        0x00, 0x00, 0x1c, 0x22, 0x41, 0x00 ,   // (
        0x00, 0x00, 0x41, 0x22, 0x1c, 0x00 ,   // )
        0x00, 0x14, 0x08, 0x3E, 0x08, 0x14 ,   // *
        0x00, 0x08, 0x08, 0x3E, 0x08, 0x08 ,   // +
        0x00, 0x00, 0x00, 0xA0, 0x60, 0x00 ,   // ,
        0x00, 0x08, 0x08, 0x08, 0x08, 0x08 ,   // -
        0x00, 0x00, 0x60, 0x60, 0x00, 0x00 ,   // .
        0x00, 0x20, 0x10, 0x08, 0x04, 0x02 ,   // /
        0x00, 0x3E, 0x51, 0x49, 0x45, 0x3E ,   // 0				//30[16]48
        0x00, 0x00, 0x42, 0x7F, 0x40, 0x00 ,   // 1
        0x00, 0x42, 0x61, 0x51, 0x49, 0x46 ,   // 2
        0x00, 0x21, 0x41, 0x45, 0x4B, 0x31 ,   // 3
        0x00, 0x18, 0x14, 0x12, 0x7F, 0x10 ,   // 4
        0x00, 0x27, 0x45, 0x45, 0x45, 0x39 ,   // 5
        0x00, 0x3C, 0x4A, 0x49, 0x49, 0x30 ,   // 6
        0x00, 0x01, 0x71, 0x09, 0x05, 0x03 ,   // 7
        0x00, 0x36, 0x49, 0x49, 0x49, 0x36 ,   // 8
        0x00, 0x06, 0x49, 0x49, 0x29, 0x1E ,   // 9
        0x00, 0x00, 0x36, 0x36, 0x00, 0x00 ,   // :
        0x00, 0x00, 0x56, 0x36, 0x00, 0x00 ,   // ;
        0x00, 0x08, 0x14, 0x22, 0x41, 0x00 ,   // <
        0x00, 0x14, 0x14, 0x14, 0x14, 0x14 ,   // =
        0x00, 0x00, 0x41, 0x22, 0x14, 0x08 ,   // >
        0x00, 0x02, 0x01, 0x51, 0x09, 0x06 ,   // ?
        0x00, 0x32, 0x49, 0x59, 0x51, 0x3E ,   // @
        0x00, 0x7C, 0x12, 0x11, 0x12, 0x7C ,   // A
        0x00, 0x7F, 0x49, 0x49, 0x49, 0x36 ,   // B
        0x00, 0x3E, 0x41, 0x41, 0x41, 0x22 ,   // C
        0x00, 0x7F, 0x41, 0x41, 0x22, 0x1C ,   // D
        0x00, 0x7F, 0x49, 0x49, 0x49, 0x41 ,   // E
        0x00, 0x7F, 0x09, 0x09, 0x09, 0x01 ,   // F
        0x00, 0x3E, 0x41, 0x49, 0x49, 0x7A ,   // G
        0x00, 0x7F, 0x08, 0x08, 0x08, 0x7F ,   // H
        0x00, 0x00, 0x41, 0x7F, 0x41, 0x00 ,   // I
        0x00, 0x20, 0x40, 0x41, 0x3F, 0x01 ,   // J
        0x00, 0x7F, 0x08, 0x14, 0x22, 0x41 ,   // K
        0x00, 0x7F, 0x40, 0x40, 0x40, 0x40 ,   // L
        0x00, 0x7F, 0x02, 0x0C, 0x02, 0x7F ,   // M
        0x00, 0x7F, 0x04, 0x08, 0x10, 0x7F ,   // N
        0x00, 0x3E, 0x41, 0x41, 0x41, 0x3E ,   // O
        0x00, 0x7F, 0x09, 0x09, 0x09, 0x06 ,   // P
        0x00, 0x3E, 0x41, 0x51, 0x21, 0x5E ,   // Q
        0x00, 0x7F, 0x09, 0x19, 0x29, 0x46 ,   // R
        0x00, 0x46, 0x49, 0x49, 0x49, 0x31 ,   // S
        0x00, 0x01, 0x01, 0x7F, 0x01, 0x01 ,   // T
        0x00, 0x3F, 0x40, 0x40, 0x40, 0x3F ,   // U
        0x00, 0x1F, 0x20, 0x40, 0x20, 0x1F ,   // V
        0x00, 0x3F, 0x40, 0x38, 0x40, 0x3F ,   // W
        0x00, 0x63, 0x14, 0x08, 0x14, 0x63 ,   // X
        0x00, 0x07, 0x08, 0x70, 0x08, 0x07 ,   // Y
        0x00, 0x61, 0x51, 0x49, 0x45, 0x43 ,   // Z
        0x00, 0x00, 0x7F, 0x41, 0x41, 0x00 ,   // [
        0x00, 0x55, 0x2A, 0x55, 0x2A, 0x55 ,   // 55
        0x00, 0x00, 0x41, 0x41, 0x7F, 0x00 ,   // ]
        0x00, 0x04, 0x02, 0x01, 0x02, 0x04 ,   // ^
        0x00, 0x40, 0x40, 0x40, 0x40, 0x40 ,   // _
        0x00, 0x00, 0x01, 0x02, 0x04, 0x00 ,   // '
        0x00, 0x20, 0x54, 0x54, 0x54, 0x78 ,   // a
        0x00, 0x7F, 0x48, 0x44, 0x44, 0x38 ,   // b
        0x00, 0x38, 0x44, 0x44, 0x44, 0x20 ,   // c
        0x00, 0x38, 0x44, 0x44, 0x48, 0x7F ,   // d
        0x00, 0x38, 0x54, 0x54, 0x54, 0x18 ,   // e
        0x00, 0x08, 0x7E, 0x09, 0x01, 0x02 ,   // f
        0x00, 0x18, 0xA4, 0xA4, 0xA4, 0x7C ,   // g
        0x00, 0x7F, 0x08, 0x04, 0x04, 0x78 ,   // h
        0x00, 0x00, 0x44, 0x7D, 0x40, 0x00 ,   // i
        0x00, 0x40, 0x80, 0x84, 0x7D, 0x00 ,   // j
        0x00, 0x7F, 0x10, 0x28, 0x44, 0x00 ,   // k
        0x00, 0x00, 0x41, 0x7F, 0x40, 0x00 ,   // l
        0x00, 0x7C, 0x04, 0x18, 0x04, 0x78 ,   // m
        0x00, 0x7C, 0x08, 0x04, 0x04, 0x78 ,   // n
        0x00, 0x38, 0x44, 0x44, 0x44, 0x38 ,   // o
        0x00, 0xFC, 0x24, 0x24, 0x24, 0x18 ,   // p
        0x00, 0x18, 0x24, 0x24, 0x18, 0xFC ,   // q
        0x00, 0x7C, 0x08, 0x04, 0x04, 0x08 ,   // r
        0x00, 0x48, 0x54, 0x54, 0x54, 0x20 ,   // s
        0x00, 0x04, 0x3F, 0x44, 0x40, 0x20 ,   // t
        0x00, 0x3C, 0x40, 0x40, 0x20, 0x7C ,   // u
        0x00, 0x1C, 0x20, 0x40, 0x20, 0x1C ,   // v
        0x00, 0x3C, 0x40, 0x30, 0x40, 0x3C ,   // w
        0x00, 0x44, 0x28, 0x10, 0x28, 0x44 ,   // x
        0x00, 0x1C, 0xA0, 0xA0, 0xA0, 0x7C ,   // y
        0x00, 0x44, 0x64, 0x54, 0x4C, 0x44 ,   // z
        0x14, 0x14, 0x14, 0x14, 0x14, 0x14     // horiz lines
    };
    
    

    这个是用到的延时初始化函数和ms级延时函数

    inline void Wait_Init(void)
    {
    	SysTick->CTRL			&= (unsigned int)(~(1<<0));			//关闭SysTick定时器
    	SysTick->CTRL			&= (unsigned int)(~(1<<2));			//9MHz
    	SysTick->CTRL			&= (unsigned int)(~(1<<1));			//不产生下溢中断
    }
    void Wait_ms(unsigned int t)
    {
    #define ms_t 9000
    	SysTick->LOAD			 = ms_t;				//1ms定时
    	SysTick->VAL			 = 0;						//当前值清零
    	SysTick->CTRL			|= 1<<0;				//打开SysTick定时器
    	while(t)
    	{
    		if(SysTick->CTRL & 1<<16)				//判断下溢
    		{t--;}
    	}
    }
    
    

    下面是主函数
    注意:前面用到的子函数请做好声明

    unsigned char OLED_SRAM[8][128]; //图像储存
    extern const unsigned char F6X8[];
    
    int main()
    {
    	Wait_Init();//这里的延时函数我用的是SYSTICK
    	SPI1_Init();
    	OLED_Init();
    	OLED_Write('L',0,0);
    	OLED_Write('i',0,6);
    	OLED_Write('a',0,12);
    	OLED_Write('n',0,18);
    	OLED_Write('g',0,24);
    	while(1)
    	{
    //		for(j=0;j<8;j++)
    //		{
    //				for(i=0;i<128;i++)
    //					OLED_Write(OLED_SRAM[j][i]);
    //		}
    		
    	}
    }
    
    

    结果





    在这里插入图片描述

    如果有问题欢迎指正和讨论

    展开全文
  • 今天我们先聊聊OLED屏幕那些次像素有趣的排列方式。    我们先回顾下面这张屏幕技术体系架构图:    屏幕技术对应屏幕结构关系图  我们今天的重点内容为倒数第二列内容的上半...
  • 利用arduino板子在mixly编程,在0.96 OLED 屏幕上显示温湿度传感器所采集的数据。 利用arduino板子在mixly编程,在0.96 OLED 屏幕上显示温湿度传感器所采集的数据。
  • OLED 屏幕的使用

    千次阅读 2021-01-01 16:40:53
    #OLED 屏幕的使用(arduino) oled有两种接线方式:SPI和IIc,本文采用的OLED连接方式为SPI四线 使用的设备为:Arduino UNO 0.96寸 OLED-128X64 SPI 接口 oled的原理与LCD相同,点亮每个像素点组成图形. 对于特殊字符图形...

    OLED 屏幕的使用(arduino)

    oled有两种接线方式:SPI和IIc,本文采用的OLED连接方式为SPI四线
    使用的设备为:Arduino UNO 0.96寸 OLED-128X64 SPI 接口
    

    oled的原理与LCD相同,点亮每个像素点组成图形.
    对于特殊字符图形(如汉字)需要使用文字取模软件生成相应字模,以数组形式写入程序,最后扫描在oled上显示.

    取模软件:链接:https://pan.baidu.com/s/1vWB0sEvODR9X5cWlBBQArg 密码:sepr
    

    对于常用字符(数字,英文字母等)可以直接使用库函数,方便省事.
    U8glib是一个在ARM,C51,Arduino等常用MCU上都可以得到支持的图形绘制库,用途广泛,兼容性优秀,功能也十分强大,U8glib可以直接从arduino编译环境中的库管理下载

    U8glib显示字符/图形的常用三种方法

    drawStr 显示字符

    注意:使用drawStr函数之前,需要使用setFont函数来设置一下要画出的字符的显示字体

    1)方法定义
        u8g_uint_t U8GLIB::drawStr(u8g_uint_t x, u8g_uint_t y, const char *s)
    2)功能
        显示字符,使用前要使用setFont函数设置要显示字符的字体(详见七楼 设置)
        另外还有 drawStr90(); drawStr180(); drawStr270(); 使字符顺时针旋转响应的角度。
        //注意:使用drawStr函数之前,需要使用setFont函数来设置一下要画出的字符的显示字体。
    3)参数
         x:字符左下角的横坐标
         y:字符左下角的纵坐标
         *s:要显示的字符
    

    例子

    u8g.setFont(u8g_font_osb18);    //设置字体
    u8g.drawStr(0, 20, "ABC");      //画出字符在(0,20)的位置
    

    print 显示字符

    print()函数可以打印字符,字符串,变量值等。但是用之前需要用setPrintPos()来设置位置

    print(...)
    //参数为要打印的内容
    

    例子

    u8g.setPrintPos(0,15);          //设置位置
    u8g.print("Error Code: ");      //打印内容
    

    drawXBMP 打印位图

    1)方法定义
    	void U8GLIB::drawXBMP(u8g_uint_t x, u8g_uint_t y, u8g_uint_t w, u8g_uint_t h, const u8g_pgm_uint8_t *bitmap)
    2)功能
         此函数是一个显示一个位图的方法。
    3)参数
         x:位图左上角的横坐标
         y:位图左上角的纵坐标
         w:位图的宽
         h:位图的高
         *bitmap:位图对象
    

    例子

    const uint8_t rook_bitmap[] U8G_PROGMEM = {
      0x00,         // 00000000
      0x55,         // 01010101
      0x7f,         // 01111111
      0x3e,         // 00111110
      0x3e,         // 00111110
      0x3e,         // 00111110
      0x3e,         // 00111110
      0x7f          // 01111111
    };
    u8g.drawBitmapP(0,0, 1, 8, rook_bitmap);
    

    其他函数

    firstPage 图像显示
    nextPage
    drawPixe 点
    drawLine 线
    drawHLine 水平线
    drawVLine 垂直线
    drawTriangle 三角(实心)
    drawFrame 矩形框
    drawRFrame 圆角矩形框
    drawBox 矩形(实心)
    drawRBox 圆角矩形(实心)
    drawCircle 圆
    drawDisc 圆形(实心)
    drawEllipse 圆弧
    drawFilledEllipse 扇形(实心)
    drawStr 显示字符串
    print 输出
    drawBitmapP 画位图
    drawXMBP 画大尺寸位图
    getHeight 获得显示器高度
    getWidth 获得显示器宽度
    getStrWidth 获得字符串宽度
    setFont 设置字体
    setPrintPos 设置输出位置
    setColorIndex 设置显示与否
    setRot90 /180 /270 显示内容旋转
    setFontPosTop

    具体使用方法可参考

    常用函数使用方法
    u8glib库资料整理
    使用规格方法参考


    基本运行框架

    绘图过程,必须依照下面的框架执行,将绘图显示的代码,放在firstPage和nextPage组成的循环内执行。

      u8g.firstPage();  
      do {
    		// 此处放置显示代码
      } while( u8g.nextPage() );
    

    息屏方式

    u8g.drawStr(0,0, “”);
    ###位图数据制作方法
    打开软件 进行设置
    设置选项界面不能关闭!否则会恢复初始状态!

    输入汉字,选择字体和大小,点击生成字模,拷贝到程序即可


    硬件接线

    OLED屏arduino开发板
    GNDGND
    VCC3.3V 或 5V
    SCL /D010
    GNDGND
    SDA/D19
    RES13
    DC11
    CS12 七针模块有cs脚;直接连接就好了;如果是用六针的CS默认已经接地;不接就可以了

    显示Hello World

    #include <U8glib.h>
    
    #include "stdio.h"
    #include "stdlib.h"
    #include "U8glib.h"
    
    //U8GLIB_SH1106_128X64 u8g(U8G_I2C_OPT_NONE);        // I2C / TWI 
    U8GLIB_SSD1306_128X64 u8g(10, 9, 12, 11);  // SW SPI Com: SCL = 10, SDA = 9, CS = 12, DC = 11,RES=RESET
    
    void draw(void) 
    {
      u8g.setFont(u8g_font_osb18);//设置要显示字符的字体
      u8g.drawStr(0, 20, "Hello");//显示字符
      u8g.drawStr(0, 50, "World");
      u8g.setColorIndex(1);//显示对象为不透明
    }
    
    void setup(void)
    {
    
    }
    
    void loop(void) 
    {
      u8g.firstPage();  
      do {
        draw();
      } while( u8g.nextPage() );
    
    }
    
    

    效果

    在这里插入图片描述


    显示汉字

    #include "stdio.h"
    #include "stdlib.h"
    #include "U8glib.h"
    
    //U8GLIB_SH1106_128X64 u8g(U8G_I2C_OPT_NONE);        // I2C / TWI 
    U8GLIB_SSD1306_128X64 u8g(10, 9, 12, 11);  // SW SPI Com: SCL = 10, SDA = 9, CS = 12, DC = 11,RES=RESET
    
    static const unsigned char sudu[2][32] PROGMEM={
    {0x00,0x02,0x04,0x02,0xE8,0x3F,0x08,0x02,0xC0,0x1F,0x40,0x12,0x4F,0x12,0xC8,0x1F,
    0x08,0x07,0x88,0x0A,0x48,0x12,0x28,0x22,0x08,0x02,0x14,0x00,0xE2,0x7F,0x00,0x00},/*"速",0*/
    /* (16 X 16 , 宋体 )*/
    
    
    {0x80,0x00,0x00,0x01,0xFC,0x7F,0x44,0x04,0x44,0x04,0xFC,0x3F,0x44,0x04,0x44,0x04,
    0xC4,0x07,0x04,0x00,0xF4,0x0F,0x24,0x08,0x42,0x04,0x82,0x03,0x61,0x0C,0x1C,0x70},/*"度",1*/
    /* (16 X 16 , 宋体 )*/
    };
    void draw(void) {
    //画出速度16*16
     u8g.drawXBMP( 0, 0,16, 16, sudu[0]);
     u8g.drawXBMP( 16, 0,16, 16, sudu[1]);
    }
    
    void setup(void) {
    
    }
    
    void loop(void) {
    
      u8g.firstPage();  
      do {
        draw();
      } while( u8g.nextPage() );
    
    }
    
    

    效果

    在这里插入图片描述

    展开全文
  • OLED屏幕和LCD屏幕的区别与优劣

    千次阅读 多人点赞 2019-11-11 17:40:47
    随着科技越来越多的手机用上了OLED屏幕,大家也开始逐渐了解起来了手机的屏幕,这篇文章呢将会用最简单的语言和图片,告诉你OLED屏幕和LCD屏幕究竟有什么差别。 要知道OLED屏幕 和 LCD屏幕的区别,我们需要从运行...
  • STM32驱动0.96寸OLED屏幕

    2021-10-26 21:31:32
    引言 Organic Light Emitting Display,即有机发光显示器,在手机LCD上属于新崛起的种类,被誉为“梦幻显示器”。 OLED也被称之为第三代显示技术。...我们采用是四线的OLED屏幕,如图所示: 我们今天采用这个OLE
  • OLED 屏幕显示

    千次阅读 2020-02-05 21:39:20
    代码通过SPI与OLED 屏幕相连 OLED 简介: OLED,即有机发光二极管(OrganicLight-EmittingDiode),又称为有机电激光显示(OrganicElectroluminesenceDisplay,OELD)。OLED由于同时具备自发光,不需背光源、对比度.....
  • STM32F103C8T6-OLED屏幕显示含主要代码、参考程序、相关资料

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 7,438
精华内容 2,975
关键字:

oled屏幕