IIC协议--OLED

STM32 0.96寸0.91寸OLED IIC接口 0.96 OLED 的内存分布 0.96寸OLED的分辨率是12864,也就是由12864个格子组成,在其内部,被划分为: 8个页(PAGE),128个列(SEG) 每个页由纵向排布的8个格子组成,也就是128*(88)=12864 每一个格子表示一个bit的图像数据 OLED的地址和寄存器地址 既然是使用IIC进行通讯,就必须在写数据的时候依次发送OLED地址和寄存器地址 我们一般只向OLED写数据而不读数据,因此其地址为:01111000,也就是0x78 Co这一位一般是0 D/C#是数据和 阅读详情

IIC 协议: 

用于连接 微控制器 以及 外围设备

半双工:  同一时间 只能进行一个方向的 传输

特点: 
简单性 和 有效性:
由于 接口直接在组件上,因此IIC占用空间 非常小 -- 降低了互联成本 -- 总线的长度可达 25英尺,
并且能够以  10 Kbps/s 的最大传输速率支持40个组件 (对比  串口 20k/s)

多主控: 
任何可以进行发送 和 接收的设备都课程成为 主总线 -- 控制 信号的传输  和 时钟频率

构成:
IIC  串行总线 一般有两根信号线,一根双向的数据线 SDA, 一根 时钟线 SCL , 其时钟信号是由主控器产生
所有 接到 IIC 总线设备上的串行数据 SDA 都接到 总线的 SDA,各设备 的时钟线 SCL 接到总线的 SCL上
对于并联在一条总线上的每个 IC 都有唯一的地址

code:code用于声明存储在只读存储器中。code关键字通常与函数或程序的定义一起使用,也可以用来修饰常量,限制其只能存储在ROM中,从而节省了宝贵的RAM资源
=================================
 

第一个支持 IIC  协议的设备 --  OLED 显示屏 

延时函数 5us -- 什么都不做-- 压栈和出栈就耗时5us -- _nop_() -- 一次 5 us

OLED时序图

起始信号 和 终止信号

应答信号


OLED 的 起始信号

根据上图可得下面代码


void IIC_Start() //开始信号
{
  scl=1; 
    sda=1;
 _nop_();
 sda=0;
 _nop_();

}


OLED 的终止信号


void IIC_Stop()
{
 sda=0;
 scl=1;
 _nop_();
 sda=1;
_nop_();

}

应答信号:


定义:  发送器每发送一个信号 (8 bit),  就在脉冲9之间释放数据线,由接收器反馈一个应答信号。

应答信号为: 
低电平: 规定为有效应答位 (ACK),表示接收器 已经成功接收到了该字节
高电平: 规定为非应答位(NACK),一般表示没有接收成功

char IIC_ACK()
{
char flag;
sda =1; // 就在时钟脉冲 9 期间释放数据线 -- 高电平
_nop_();
scl=1; // 高电平状态读取
_nop_();
flag = sda;
_nop_();
scl=0; //读完后scl变成低电平
_nop_();
return flag;

}

=====================================


发送一个字节函数封装:

数据发送的时序注意: 
在高电平期间不允许发生 数据翻转 -- 否者 可能误判为起始信号 or 终止信号退出

低电平 -- 数据可以翻转

高电平 -- 只能传输数据


void IIC_Send_Byte(char dataSend)
{
    int i;
    for(i=0;i<8;++i){ 
    scl = 0; // scl 拉低,让 sda 做好数据准备
    sda = dataSend & 0x80; // SDA 获得数据最高位 1000 000
    _nop_(); // 发送数据建立准备时间
    scl=1;   // scl 拉高开始发送
    _nop_(); // 数据发送时间
    scl=0;   // 发送完毕就拉低
    _nop_(); // 
    dataSend <<= 1; //左移一位,让次高位切换为 最高位,下一次就轮到他的  
    }


}


=================================


OLED  写入指令和数据:


写命令 数据代码;


1.start()
2.写入 0x78  -- 从机地址
3.ACK
4.control byte: (0)(0)000000  -- 写入命令   (0)(1)000000  -- 写入数据
5.ACK
6.写入指令/数据
7.ACK
8.STOP


void Oled_Write_Cmd(char dataCmd)
{

//1.start()
    IIC_Start();
//2.写入 0x78 -- 从机地址
    IIC_Send_Byte(0x78);
//3.ACK
    IIC_ACK();
//4.control byte: (0)(0)000000  -- 写入命令   (0)(1)000000  -- 写入数据
        IIC_Send_Byte(0x00); //写入命令
//5.ACK
        IIC_ACK();

//6.写入指令/数据
    IIC_Send_Byte(dataCmd);
//7.ACK
        IIC_ACK();
//8.STOP
   IIC_Stop();

}

void Oled_Write_Data(char dataData)
{

//1.start()
    IIC_Start();
//2.写入 0x78 -- 从机地址
    IIC_Send_Byte(0x78);
//3.ACK
    IIC_ACK();
//4.control byte: (0)(0)000000  -- 写入命令   (0)(1)000000  -- 写入数据
        IIC_Send_Byte(0x01); //写入命令
//5.ACK
        IIC_ACK();

    //6.写入指令/数据
    IIC_Send_Byte(dataData);
//7.ACK
        IIC_ACK();
//8.STOP
   IIC_Stop();


}


===================================


如何在OLED 中 显示 一个点:

128 × 64 的点阵:

oled 的地址模式: 


128 列 和 怕个 0 ~~page 7:

页地址模式: (默认)
遍历完所有列后,自动调回第一列,还是那行
1.发送cmd 0x20 
2.发送cmd 0x02 -- 默认次模式  02 -- 0000 0010  -- 10 页寻址模式

水平地址模式: 
遍历完所有列后,自动换行 ,然后调回第一列

垂直地址模式:  -- 少用 -- 了解


================


oled初始化:


(01)display off (0xae)
(02)set low column address (0x00)
(03)set high column address (0x10)
(04)set start line address (0x40)
(05)set page address (0xb0)
(06)contract control (0x81)
(07)send 0xff (多字节指令)
(08)set segment remap (0xa1)
(09)set normal/reverse (0xa6)
(10)set multiplex ratio (1 to 64) (0xa8 )
(11)set duty 1/32 (0x3f)
(12)com scan direction (0xc8)
(13)set display offset (0xd3)
(14)send 0x00 
(15)set osc division (0xd5)
(16)send 0x80
(17)set area color mode off (0xd8)
(18)send 0x05
(19)set pre-charge period (0xd9)
(20)send 0xf1
(21)set com pin configuration (0xda)
(22)send 0x12
(23)set Vcomh (0xdb)
(24)send 0x30
(25)set charge pump enable (0x8d)
(26)send 0x14
(27)turn on oled panel(0xaf)

清屏函数:


void Oled_Clear()
{
    int i;
    int j;

    for(i-0;i<8;++i){
    //行 page0 ~ page7 
        Oled_Write_Cmd(0xB0+i);
    //每个page 从0列 开始
        Oled_Write_Cmd(0x00);
        Oled_Write_Cmd(0x10);
    //列 0 ~ 127 ,一次写入0 -- 默认情况下,每次写入数据,列地址自动偏移
        for(j=0;j<128;++j){
            Oled_Write_Data(0); //遍历完所有位置,实现清零
         }
     }
        

}


 注意 不要为了省空间把  ij定义 为char 类型 ,定义为int 类型才行,不让可能会出现数据丢失 or 雪花屏等现象
因为 char   -128 ~ 127  ++j 最后一次 j=128 会越界  so 可以使用 unsigned char 和 int 都行

===================================
每次都显示指定第一列
初始地址 低位 0x00 高位0x10


case1: 显示一个点,任何组成多个点就组成一行,并且通过cmd指定每次显示位置

#include "reg52.h"
#include "intrins.h"

sbit scl = P0^1;
sbit sda = P0^3;

void IIC_Start() //开始信号
{
  scl=1; 
    sda=1;
 _nop_();
 sda=0;
 _nop_();

}

void IIC_Stop()
{
 sda=0;
 scl=1;
 _nop_();
 sda=1;
_nop_();

}


char IIC_ACK()
{
char flag;
sda =1; // 就在时钟脉冲 9 期间释放数据线 -- 高电平
_nop_();
scl=1; // 高电平状态读取
_nop_();
flag = sda;
_nop_();
scl=0; //读完后scl变成低电平
_nop_();
return flag;

}


void IIC_Send_Byte(char dataSend)
{
    int i;
    for(i=0;i<8;++i){ 
    scl = 0; // scl 拉低,让 sda 做好数据准备
    sda = dataSend & 0x80; // SDA 获得数据最高位 1000 000
    _nop_(); // 发送数据建立准备时间
    scl=1;   // scl 拉高开始发送
    _nop_(); // 数据发送时间
    scl=0;   // 发送完毕就拉低
    _nop_(); // 
    dataSend <<= 1; //左移一位,让次高位切换为 最高位,下一次就轮到他的  
    }


}


void Oled_Write_Cmd(char dataCmd)
{

//1.start()
    IIC_Start();
//2.写入 0x78 -- 从机地址
    IIC_Send_Byte(0x78);
//3.ACK
    IIC_ACK();
//4.control byte: (0)(0)000000  -- 写入命令   (0)(1)000000  -- 写入数据
        IIC_Send_Byte(0x00); //写入命令
//5.ACK
        IIC_ACK();

//6.写入指令/数据
    IIC_Send_Byte(dataCmd);
//7.ACK
        IIC_ACK();
//8.STOP
   IIC_Stop();

}

void Oled_Write_Data(char dataData)
{

//1.start()
    IIC_Start();
//2.写入 0x78 -- 从机地址
    IIC_Send_Byte(0x78);
//3.ACK
    IIC_ACK();
//4.control byte: (0)(0)000000  -- 写入命令   (0)(1)000000  -- 写入数据
        IIC_Send_Byte(0x40); //写入命令
//5.ACK
        IIC_ACK();

    //6.写入指令/数据
    IIC_Send_Byte(dataData);
//7.ACK
        IIC_ACK();
//8.STOP
   IIC_Stop();


}


void Oled_Init()
{
    
    
    Oled_Write_Cmd(0xae);
    Oled_Write_Cmd(0x00);
    Oled_Write_Cmd(0x10);
    Oled_Write_Cmd(0x40);
    Oled_Write_Cmd(0xb0);
    Oled_Write_Cmd(0x81);
    Oled_Write_Cmd(0xff);
    Oled_Write_Cmd(0xa1);
    Oled_Write_Cmd(0xa6);
    Oled_Write_Cmd(0xa8);
    
    Oled_Write_Cmd(0x3f);
    Oled_Write_Cmd(0xc8);
    Oled_Write_Cmd(0xd3);
    Oled_Write_Cmd(0x00);
    Oled_Write_Cmd(0xd5);
    Oled_Write_Cmd(0x80);
    Oled_Write_Cmd(0xd8);
    Oled_Write_Cmd(0x05);
    Oled_Write_Cmd(0xd9);
    
    Oled_Write_Cmd(0xf1);
    Oled_Write_Cmd(0xda);
    Oled_Write_Cmd(0x12);
    Oled_Write_Cmd(0xdb);
    Oled_Write_Cmd(0x30);
    Oled_Write_Cmd(0x8d);
    Oled_Write_Cmd(0x14);    
    Oled_Write_Cmd(0xaf);
                        
    


}


void Oled_Clear()
{
    int i;
    int j;

    for(i-0;i<8;++i){
    //行 page0 ~ page7 
        Oled_Write_Cmd(0xB0+i);
    //每个page 从0列 开始
        Oled_Write_Cmd(0x00);
        Oled_Write_Cmd(0x10);
    //列 0 ~ 127 ,一次写入0 -- 默认情况下,每次写入数据,列地址自动偏移
        for(j=0;j<128;++j){
            Oled_Write_Data(0); //遍历完所有位置,实现清零
         }
     }
        

}


void main()
{
//1. oled 初始化
    Oled_Init(); 
    // 2. 选择一个位置
    //2.1确认页寻址模式:
    Oled_Write_Cmd(0x20);
    Oled_Write_Cmd(0x02);
    Oled_Clear();// 清屏
    //2.2选择PAGEO  -- 1011 0000 -- 0xB0
  Oled_Write_Cmd(0xB0); //选择 第一页
    
    //3.显示一行:
    Oled_Write_Cmd(0x00);
    Oled_Write_Cmd(0x10);
    Oled_Write_Data(0x08);
    Oled_Write_Data(0x08);
    Oled_Write_Data(0x08);
    Oled_Write_Data(0x08);
    Oled_Write_Data(0x08);
    Oled_Write_Data(0x08);
    Oled_Write_Data(0x08);
    Oled_Write_Data(0x08);
    Oled_Write_Data(0x08);
    
    
    Oled_Write_Cmd(0xB6);
    Oled_Write_Cmd(0x00);
    Oled_Write_Cmd(0x10);
    Oled_Write_Data(0x08);
    Oled_Write_Data(0x08);
    Oled_Write_Data(0x08);
    Oled_Write_Data(0x08);
    Oled_Write_Data(0x08);
    Oled_Write_Data(0x08);
    Oled_Write_Data(0x08);
    Oled_Write_Data(0x08);
    Oled_Write_Data(0x08);
    Oled_Write_Cmd(0x0f);
    Oled_Write_Cmd(0x17);
    Oled_Write_Data(0x08);
    
    Oled_Write_Cmd(0xB7);
    Oled_Write_Cmd(0x00);
    Oled_Write_Cmd(0x10);
    Oled_Write_Data(0x08);
    Oled_Write_Data(0x08);
    Oled_Write_Data(0x08);
    Oled_Write_Data(0x08);
    Oled_Write_Data(0x08);
    Oled_Write_Data(0x08);
    Oled_Write_Data(0x08);
    Oled_Write_Data(0x08);
    Oled_Write_Data(0x08);
    
    
    
    
    while(1);
}
=============================================
 

case2: OLED 显示一个字符A: -- 借助字模软件 -- 生成字符序列


#include "reg52.h"
#include "intrins.h"

sbit scl = P0^1;
sbit sda = P0^3;

void IIC_Start() //开始信号
{
  scl=1; 
    sda=1;
 _nop_();
 sda=0;
 _nop_();

}

void IIC_Stop()
{
 sda=0;
 scl=1;
 _nop_();
 sda=1;
_nop_();

}


char IIC_ACK()
{
char flag;
sda =1; // 就在时钟脉冲 9 期间释放数据线 -- 高电平
_nop_();
scl=1; // 高电平状态读取
_nop_();
flag = sda;
_nop_();
scl=0; //读完后scl变成低电平
_nop_();
return flag;

}


void IIC_Send_Byte(char dataSend)
{
    int i;
    for(i=0;i<8;++i){ 
    scl = 0; // scl 拉低,让 sda 做好数据准备
    sda = dataSend & 0x80; // SDA 获得数据最高位 1000 000
    _nop_(); // 发送数据建立准备时间
    scl=1;   // scl 拉高开始发送
    _nop_(); // 数据发送时间
    scl=0;   // 发送完毕就拉低
    _nop_(); // 
    dataSend <<= 1; //左移一位,让次高位切换为 最高位,下一次就轮到他的  
    }


}


void Oled_Write_Cmd(char dataCmd)
{

//1.start()
    IIC_Start();
//2.写入 0x78 -- 从机地址
    IIC_Send_Byte(0x78);
//3.ACK
    IIC_ACK();
//4.control byte: (0)(0)000000  -- 写入命令   (0)(1)000000  -- 写入数据
        IIC_Send_Byte(0x00); //写入命令
//5.ACK
        IIC_ACK();

//6.写入指令/数据
    IIC_Send_Byte(dataCmd);
//7.ACK
        IIC_ACK();
//8.STOP
   IIC_Stop();

}

void Oled_Write_Data(char dataData)
{

//1.start()
    IIC_Start();
//2.写入 0x78 -- 从机地址
    IIC_Send_Byte(0x78);
//3.ACK
    IIC_ACK();
//4.control byte: (0)(0)000000  -- 写入命令   (0)(1)000000  -- 写入数据
        IIC_Send_Byte(0x40); //写入命令
//5.ACK
        IIC_ACK();

    //6.写入指令/数据
    IIC_Send_Byte(dataData);
//7.ACK
        IIC_ACK();
//8.STOP
   IIC_Stop();


}


void Oled_Init()
{
    
    
    Oled_Write_Cmd(0xae);
    Oled_Write_Cmd(0x00);
    Oled_Write_Cmd(0x10);
    Oled_Write_Cmd(0x40);
    Oled_Write_Cmd(0xb0);
    Oled_Write_Cmd(0x81);
    Oled_Write_Cmd(0xff);
    Oled_Write_Cmd(0xa1);
    Oled_Write_Cmd(0xa6);
    Oled_Write_Cmd(0xa8);
    
    Oled_Write_Cmd(0x3f);
    Oled_Write_Cmd(0xc8);
    Oled_Write_Cmd(0xd3);
    Oled_Write_Cmd(0x00);
    Oled_Write_Cmd(0xd5);
    Oled_Write_Cmd(0x80);
    Oled_Write_Cmd(0xd8);
    Oled_Write_Cmd(0x05);
    Oled_Write_Cmd(0xd9);
    
    Oled_Write_Cmd(0xf1);
    Oled_Write_Cmd(0xda);
    Oled_Write_Cmd(0x12);
    Oled_Write_Cmd(0xdb);
    Oled_Write_Cmd(0x30);
    Oled_Write_Cmd(0x8d);
    Oled_Write_Cmd(0x14);    
    Oled_Write_Cmd(0xaf);
                        
    


}


void Oled_Clear()
{
    int i;
    int j;

    for(i-0;i<8;++i){
    //行 page0 ~ page7 
        Oled_Write_Cmd(0xB0+i);
    //每个page 从0列 开始
        Oled_Write_Cmd(0x00);
        Oled_Write_Cmd(0x10);
    //列 0 ~ 127 ,一次写入0 -- 默认情况下,每次写入数据,列地址自动偏移
        for(j=0;j<128;++j){
            Oled_Write_Data(0); //遍历完所有位置,实现清零
         }
     }
        

}

  /*--  文字:  A  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
//0x00,0x00,0xC0,0x38,0xE0,0x00,0x00,0x00,0x20,0x3C,0x23,0x02,0x02,0x27,0x38,0x20,
char A1[8]={0x00,0x00,0xC0,0x38,0xE0,0x00,0x00,0x00};
char A2[8]={0x20,0x3C,0x23,0x02,0x02,0x27,0x38,0x20};

void main()
{
    int i;
//1. oled 初始化
    Oled_Init(); 
    // 2. 选择一个位置
    //2.1确认页寻址模式:
    Oled_Write_Cmd(0x20);
    Oled_Write_Cmd(0x02);
    Oled_Clear();// 清屏
    //2.2选择PAGEO  -- 1011 0000 -- 0xB0
  Oled_Write_Cmd(0xB0); //选择 第一页
  // 控制在第一列输出
    Oled_Write_Cmd(0x00);
    Oled_Write_Cmd(0x10);
  
    for(i=0;i<8;++i){
   Oled_Write_Data(A1[i]);
  }

  Oled_Write_Cmd(0xB1); //选择 第一页
  // 控制在第一列输出
    Oled_Write_Cmd(0x00);
    Oled_Write_Cmd(0x10);
  
    for(i=0;i<8;++i){
   Oled_Write_Data(A2[i]);
  }

    

    
    while(1);
}
=====================
 

case 3 输出显示一行文字:


报错 too large 装不下 -- 加code 前缀

code:

code用于声明存储在只读存储器中。code关键字通常与函数或程序的定义一起使用,也可以用来修饰常量,限制其只能存储在ROM中,从而节省了宝贵的RAM资源
 

#include "reg52.h"
#include "intrins.h"

sbit scl = P0^1;
sbit sda = P0^3;

void IIC_Start() //开始信号
{
  scl=1; 
    sda=1;
 _nop_();
 sda=0;
 _nop_();

}

void IIC_Stop()
{
 sda=0;
 scl=1;
 _nop_();
 sda=1;
_nop_();

}


char IIC_ACK()
{
char flag;
sda =1; // 就在时钟脉冲 9 期间释放数据线 -- 高电平
_nop_();
scl=1; // 高电平状态读取
_nop_();
flag = sda;
_nop_();
scl=0; //读完后scl变成低电平
_nop_();
return flag;

}


void IIC_Send_Byte(char dataSend)
{
    int i;
    for(i=0;i<8;++i){ 
    scl = 0; // scl 拉低,让 sda 做好数据准备
    sda = dataSend & 0x80; // SDA 获得数据最高位 1000 000
    _nop_(); // 发送数据建立准备时间
    scl=1;   // scl 拉高开始发送
    _nop_(); // 数据发送时间
    scl=0;   // 发送完毕就拉低
    _nop_(); // 
    dataSend <<= 1; //左移一位,让次高位切换为 最高位,下一次就轮到他的  
    }


}


void Oled_Write_Cmd(char dataCmd)
{

//1.start()
    IIC_Start();
//2.写入 0x78 -- 从机地址
    IIC_Send_Byte(0x78);
//3.ACK
    IIC_ACK();
//4.control byte: (0)(0)000000  -- 写入命令   (0)(1)000000  -- 写入数据
        IIC_Send_Byte(0x00); //写入命令
//5.ACK
        IIC_ACK();

//6.写入指令/数据
    IIC_Send_Byte(dataCmd);
//7.ACK
        IIC_ACK();
//8.STOP
   IIC_Stop();

}

void Oled_Write_Data(char dataData)
{

//1.start()
    IIC_Start();
//2.写入 0x78 -- 从机地址
    IIC_Send_Byte(0x78);
//3.ACK
    IIC_ACK();
//4.control byte: (0)(0)000000  -- 写入命令   (0)(1)000000  -- 写入数据
        IIC_Send_Byte(0x40); //写入命令
//5.ACK
        IIC_ACK();

    //6.写入指令/数据
    IIC_Send_Byte(dataData);
//7.ACK
        IIC_ACK();
//8.STOP
   IIC_Stop();


}


void Oled_Init()
{
    
    
    Oled_Write_Cmd(0xae);
    Oled_Write_Cmd(0x00);
    Oled_Write_Cmd(0x10);
    Oled_Write_Cmd(0x40);
    Oled_Write_Cmd(0xb0);
    Oled_Write_Cmd(0x81);
    Oled_Write_Cmd(0xff);
    Oled_Write_Cmd(0xa1);
    Oled_Write_Cmd(0xa6);
    Oled_Write_Cmd(0xa8);
    
    Oled_Write_Cmd(0x3f);
    Oled_Write_Cmd(0xc8);
    Oled_Write_Cmd(0xd3);
    Oled_Write_Cmd(0x00);
    Oled_Write_Cmd(0xd5);
    Oled_Write_Cmd(0x80);
    Oled_Write_Cmd(0xd8);
    Oled_Write_Cmd(0x05);
    Oled_Write_Cmd(0xd9);
    
    Oled_Write_Cmd(0xf1);
    Oled_Write_Cmd(0xda);
    Oled_Write_Cmd(0x12);
    Oled_Write_Cmd(0xdb);
    Oled_Write_Cmd(0x30);
    Oled_Write_Cmd(0x8d);
    Oled_Write_Cmd(0x14);    
    Oled_Write_Cmd(0xaf);
                        
    


}


void Oled_Clear()
{
    int i;
    int j;

    for(i-0;i<8;++i){
    //行 page0 ~ page7 
        Oled_Write_Cmd(0xB0+i);
    //每个page 从0列 开始
        Oled_Write_Cmd(0x00);
        Oled_Write_Cmd(0x10);
    //列 0 ~ 127 ,一次写入0 -- 默认情况下,每次写入数据,列地址自动偏移
        for(j=0;j<128;++j){
            Oled_Write_Data(0); //遍历完所有位置,实现清零
         }
     }
        

}
/*--  文字:  梦  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
code char m1[16]={0x40,0x44,0x24,0x14,0x7F,0x94,0x24,0x00,0x24,0x14,0x7F,0x14,0x24,0x44,0x40,0x00};
code char m2[16]={0x00,0x80,0x88,0x84,0x42,0x45,0x29,0x11,0x11,0x09,0x05,0x03,0x00,0x00,0x00,0x00};

/*--  文字:  想  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
code char x1[16]={0x00,0x08,0x88,0x68,0xFF,0x48,0x88,0x00,0xFE,0x52,0x52,0x52,0xFE,0x00,0x00,0x00};
code char x2[16]={0x40,0x31,0x00,0x00,0x3B,0x40,0x40,0x44,0x5B,0x42,0x42,0x72,0x03,0x08,0x30,0x00};

/*--  文字:  菌  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
code char j1[16]= {0x02,0x02,0xF2,0x12,0x17,0x92,0x92,0x92,0x52,0x52,0x17,0x12,0xF2,0x02,0x02,0x00};
code char j2[16] ={0x00,0x00,0xFF,0x40,0x52,0x4A,0x46,0x7F,0x46,0x4A,0x52,0x40,0xFF,0x00,0x00,0x00};

/*--  文字:  加  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
code char jia1[16] ={0x10,0x10,0x10,0xFF,0x10,0x10,0xF0,0x00,0x00,0xF8,0x08,0x08,0x08,0xF8,0x00,0x00};
code char jia2[16]={0x80,0x40,0x30,0x0F,0x40,0x80,0x7F,0x00,0x00,0x7F,0x20,0x20,0x20,0x7F,0x00,0x00};

/*--  文字:  油  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
code char y1[16]={0x10,0x60,0x02,0x8C,0x00,0xF0,0x10,0x10,0x10,0xFF,0x10,0x10,0x10,0xF0,0x00,0x00};
code char y2[16]={0x04,0x04,0x7E,0x01,0x00,0xFF,0x42,0x42,0x42,0x7F,0x42,0x42,0x42,0xFF,0x00,0x00};

void main()
{
    unsigned int i;
//1. oled 初始化
    Oled_Init(); 
    // 2. 选择一个位置
    //2.1确认页寻址模式:
    Oled_Write_Cmd(0x20);
    Oled_Write_Cmd(0x02);
    Oled_Clear();// 清屏
    //2.2选择PAGEO  -- 1011 0000 -- 0xB0
  Oled_Write_Cmd(0xB0); //选择 第一页
  // 控制在第一列输出
    Oled_Write_Cmd(0x00);
    Oled_Write_Cmd(0x10);
  
    for(i=0;i<16;++i){
   Oled_Write_Data(m1[i]);
  }
      for(i=0;i<16;++i){
   Oled_Write_Data(x1[i]);
  }

        for(i=0;i<16;++i){
   Oled_Write_Data(j1[i]);
  }

        for(i=0;i<16;++i){
   Oled_Write_Data(jia1[i]);
  }

        for(i=0;i<16;++i){
   Oled_Write_Data(y1[i]);
  }

  Oled_Write_Cmd(0xB1); //选择 第一页
  // 控制在第一列输出
    Oled_Write_Cmd(0x00);
    Oled_Write_Cmd(0x10);
  
        for(i=0;i<16;++i){
   Oled_Write_Data(m2[i]);
  }
      for(i=0;i<16;++i){
   Oled_Write_Data(x2[i]);
  }

        for(i=0;i<16;++i){
   Oled_Write_Data(j2[i]);
  }

        for(i=0;i<16;++i){
   Oled_Write_Data(jia2[i]);
  }

        for(i=0;i<16;++i){
   Oled_Write_Data(y2[i]);
  }


    

    
    while(1);
}

===========================================


case4 oled 显示图片: 128 × 64

=============
#include "reg52.h"
#include "intrins.h"

sbit scl = P0^1;
sbit sda = P0^3;

void IIC_Start() //开始信号
{
  scl=1; 
    sda=1;
 _nop_();
 sda=0;
 _nop_();

}

void IIC_Stop()
{
 sda=0;
 scl=1;
 _nop_();
 sda=1;
_nop_();

}


char IIC_ACK()
{
char flag;
sda =1; // 就在时钟脉冲 9 期间释放数据线 -- 高电平
_nop_();
scl=1; // 高电平状态读取
_nop_();
flag = sda;
_nop_();
scl=0; //读完后scl变成低电平
_nop_();
return flag;

}


void IIC_Send_Byte(char dataSend)
{
    int i;
    for(i=0;i<8;++i){ 
    scl = 0; // scl 拉低,让 sda 做好数据准备
    sda = dataSend & 0x80; // SDA 获得数据最高位 1000 000
    _nop_(); // 发送数据建立准备时间
    scl=1;   // scl 拉高开始发送
    _nop_(); // 数据发送时间
    scl=0;   // 发送完毕就拉低
    _nop_(); // 
    dataSend <<= 1; //左移一位,让次高位切换为 最高位,下一次就轮到他的  
    }


}


void Oled_Write_Cmd(char dataCmd)
{

//1.start()
    IIC_Start();
//2.写入 0x78 -- 从机地址
    IIC_Send_Byte(0x78);
//3.ACK
    IIC_ACK();
//4.control byte: (0)(0)000000  -- 写入命令   (0)(1)000000  -- 写入数据
        IIC_Send_Byte(0x00); //写入命令
//5.ACK
        IIC_ACK();

//6.写入指令/数据
    IIC_Send_Byte(dataCmd);
//7.ACK
        IIC_ACK();
//8.STOP
   IIC_Stop();

}

void Oled_Write_Data(char dataData)
{

//1.start()
    IIC_Start();
//2.写入 0x78 -- 从机地址
    IIC_Send_Byte(0x78);
//3.ACK
    IIC_ACK();
//4.control byte: (0)(0)000000  -- 写入命令   (0)(1)000000  -- 写入数据
        IIC_Send_Byte(0x40); //写入命令
//5.ACK
        IIC_ACK();

    //6.写入指令/数据
    IIC_Send_Byte(dataData);
//7.ACK
        IIC_ACK();
//8.STOP
   IIC_Stop();


}


void Oled_Init()
{
    
    
    Oled_Write_Cmd(0xae);
    Oled_Write_Cmd(0x00);
    Oled_Write_Cmd(0x10);
    Oled_Write_Cmd(0x40);
    Oled_Write_Cmd(0xb0);
    Oled_Write_Cmd(0x81);
    Oled_Write_Cmd(0xff);
    Oled_Write_Cmd(0xa1);
    Oled_Write_Cmd(0xa6);
    Oled_Write_Cmd(0xa8);
    
    Oled_Write_Cmd(0x3f);
    Oled_Write_Cmd(0xc8);
    Oled_Write_Cmd(0xd3);
    Oled_Write_Cmd(0x00);
    Oled_Write_Cmd(0xd5);
    Oled_Write_Cmd(0x80);
    Oled_Write_Cmd(0xd8);
    Oled_Write_Cmd(0x05);
    Oled_Write_Cmd(0xd9);
    
    Oled_Write_Cmd(0xf1);
    Oled_Write_Cmd(0xda);
    Oled_Write_Cmd(0x12);
    Oled_Write_Cmd(0xdb);
    Oled_Write_Cmd(0x30);
    Oled_Write_Cmd(0x8d);
    Oled_Write_Cmd(0x14);    
    Oled_Write_Cmd(0xaf);
                        
    


}


code unsigned char bmpImager[]={

/*--  µ÷ÈëÁËÒ»·ùͼÏñ£ºC:\Users\31472\Desktop\mxjspng.bmp  --*/
/*--  ¿í¶Èx¸ß¶È=128x64  --*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0xE0,0xE0,0xE0,0xC0,0x80,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0xC0,0xC0,0x80,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x80,0x80,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x80,0xFC,0xFF,0x7F,0x07,0x01,0x03,0x0F,0x3F,0xFE,0xF8,0xE0,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xE0,0xF8,0xFF,0x3F,0x0F,0x0F,0x7F,0xFE,
0xF8,0xC0,0x00,0x80,0x80,0xC0,0xE0,0xE0,0xF0,0x78,0x38,0x3E,0x1F,0x0F,0x07,0x07,
0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x1F,0xFF,0xFF,0xF3,0x03,
0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x80,0xE0,0xF8,0xFF,0x3F,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x0F,0xFF,
0xFF,0xF8,0x80,0xE0,0xF0,0xFC,0x3E,0x1F,0x07,0x03,0x80,0xC0,0xC0,0xE0,0xF8,0x7D,
0x3F,0x1F,0x3F,0xFF,0xF3,0xE3,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0xFF,0xFF,0xC0,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,
0xFE,0x7F,0x0F,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x07,0x0F,0x1F,0x0F,0x01,0x00,0x00,0x00,0x00,0x03,0x07,0x07,0x07,0x03,0x00,0x00,
0x00,0x00,0x00,0x03,0x07,0x07,0x07,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0xFF,0xFF,0x03,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0xC0,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFC,0xFF,0x3F,0x07,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x03,0x07,0x0F,0x1E,0x3C,0x78,0xF0,0xE0,0xC0,
0xC0,0x80,0x80,0xC0,0xC0,0xE0,0xF0,0x70,0x3C,0x3E,0x1F,0x07,0x01,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,
0x03,0x03,0x03,0x03,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

};


void Oled_Show_Image(unsigned char *image)
{
    unsigned char i;
    unsigned int j;

    for(i-0;i<8;++i){
    //行 page0 ~ page7 
        Oled_Write_Cmd(0xB0+i);
    //每个page 从0列 开始
        Oled_Write_Cmd(0x00);
        Oled_Write_Cmd(0x10);
    //列 0 ~ 127 ,一次写入0 -- 默认情况下,每次写入数据,列地址自动偏移
        for(j=128*i;j<(128*(i+1));++j){
            Oled_Write_Data(image[j]); //遍历完所有位置,实现清零
         }
     }
        

}


void main()
{

//1. oled 初始化
    Oled_Init(); 
    // 2. 选择一个位置
    //2.1确认页寻址模式:
    Oled_Write_Cmd(0x20);
    Oled_Write_Cmd(0x02);
  Oled_Show_Image(bmpImager);


    

    
    while(1);
}


 

STM32基于IIC通信协议的OLED模块使用(详解) 本篇文章对IIC通信协议的原理做了总结,并在硬件IIC配置和软件模拟IIC上做了代码输出,由此来进行一个OLED屏幕的操作总结。本项实验的硬件组成有STM32F103C8T6芯片的开发板、OLED模块(0.96寸4针IIC接口OLED显示屏),时间用系统滴答定时器SysTick,主要模块配置是硬件IIC配置和软件模拟IIC配置。 实验简介 根据IIC通讯原理,来进行数据传输,进行一个OLED屏幕的显示,文字,图像。... 阅读详情

相关推荐

0.96OLED显示屏C51_IIC例程

iic总线只有两根双向信号线,一根是数据线SDA,一根是时钟线SCLiic总线是通过上拉电阻接正电源。当总线空闲时,两根线均为高电平当连接到总线的任一器件输出低电平,都将使总线的信号拉低,即各器件的SDA和SCL到是线“与”关系。

one goto one 的博客 3417

MPU6050和OLED的IIC器件地址区别

MPU6050 都说MPU6050的地址是0x68,拉高A0之后地址0x69。 这里两个地址都是没有移动过的。 在利用stm32HAL库函数时,我们要填的是右移了一位的地址,也就是0xD0或者0xD2。 OLED 都说OLED的地址是0x78,改了电阻之后是0x7a。 这里两个地址都是右移了的,实际上它的器件地址应该是0x3C和0x3D才是符合规范的。 但是用HAL库函数时,我们还是得填右移了的地址,也就是0x78或者0x7a。 器件地址不按规范给出,以及库函数竟然要求填右移之后的地址,

qq_43862401的博客 3922

STM32基于IIC协议的OLED模块的使用

本篇文章对使用IIC协议操作OLED屏幕进行了总结。通过IIC进行数据传输,操控OLED屏幕显示文字、图像。

weixin_37704787的博客 4085

0.96寸_OLED_屏幕_SSD1306_IIC通信_入门教程_指令详解_驱动介绍_笔记分享_初学者易懂

屏幕在横向分为8页{每页有8行},共8x8=64行,横向都是按照页来划分的;纵向就没那么多要求了,一共分为128列;此屏幕有3种寻址模式(寻址模式就是设置它显示图像区域的3种不同的方式)1、页寻址模式:每次显示指定的一行,显示完毕后如果不手动发送换页指令,会从这一页开头继续显示;搭配指令:1,设置页地址。2,设置列地址低位。3,设置列地址高位。2、水平寻址模式:从设置的起始地址出发,到达设置的终止地址后会重新回到设置的起始地址;搭配指令:1,设置为水平寻址模式。2,设置起始、终止页地址。

lH_hang7的博客 7336

C51—OLED屏幕(IIC协议)

IIC(Inter-Integrated Circuit)总线是一种由NXP(原PHILIPS)公司开发的两线式串行总线,用于连接微控制器及其外围设备。多用于主控制器和从器件间的主从通信,在小数据量场合使用,传输距离短,任意时刻只能有一个主机等特性。特点简单性和有效性由于接口直接在组件之上,因此IIC总线占用的空间非常小,减少了电路板的空间和芯片管脚的数量,降低了互联成本。总线的长度可高达25英尺,并且能够以10Kbps的最大传输速率支持40个组件多主控。

weixin_61226442的博客 2704

IIC协议初识及OLED写入指令、数据和显示的代码实现

IIC协议初识及OLED写入指令、数据和显示的代码实现;IIC协议起始和终止信号;应答信号;数据发送的时序;OLED写入指令和数据;OLED显示一个点及显示图片的代码

l_z_y_000的博客 4152

IIC 协议 和 OLED

IIC全程Inter-Integrated Circuit(集成电路总线),是一种两线式串行总线,用于连接微控制器及其外围设备,IIC属于。

mjmmm的博客 3598

51单片机用IIC协议实现OLED的显示

51单片机用IIC协议实现OLED的显示

m0_68038554的博客 3401

IIC协议——OLED屏幕

IIC全称Inter-Integrated Circuit (集成电路总线) 简称I2C是由PHILIPS公司在80年代开发的两线式串行总线,用于连接微控制器及其外围设备。IIC属于半双工同步通信方式简单性和有效性由于接口直接在组件之上,因此IIC总线占用的空间非常小,减少了电路板的空间和芯片管脚的数量,降低了互联成本。总线的长度可高达25英尺,并且能够以10Kbps的最大传输速率支持40个组件多主控(multimastering)其中任何能够进行发送和接收的设备都可以成为主总线。

m0_67794575的博客 4918

STM32中的IIC协议和OLED显示屏

本文对比分析了串口通信和I2C总线的主要特点。文章详细介绍了I2C总线的工作原理、时序特性及其在0.96寸OLED显示屏中的应用实现,包括硬件连接、初始化配置、数据传输和显示控制等关键代码实现。最后通过实验展示了如何在OLED上显示字符、汉字和图像等内容。

2403_90063112的博客 1810

IIC协议及Oled显示屏模块的使用

IIC协议及Oled显示屏模块的使用

weixin_46899589的博客 1237

IIC协议与OLED

1、

lzh201864031的博客 4695

stm32的IIC协议以及IIC通信驱动OLED屏幕

这里是直接根据写入的汉字,然后在hz_index[]数组中遍历寻找,所以你要想输出汉字,得现在hz[]和hz_index[]数组中补充。如果在hz_index[]数组中找到了对应的汉字,那就对应地在hz[]数组中找到字节,输出,完成OLED的汉字显示。I2C器件一般采用开漏结构与总线相连,所以I2C_SCL和I2C_SDA均需接上拉电阻,也正因此,当总线空闲时,这两条线路都处于高电平状态,当连到总线上的任一器件输出低电平,都将使总线拉低。汉字是16*16的形式。我用的是四引脚的,用的是IIC通信驱动。

m0_53573725的博客 2921

16.IIC 协议 和 OLED

IIC全称集成电路总线是由PHILIPS公司在80年代开发的两线式串行总线,用于连接微控制器及其外围设备。IIC属于半双工同步通信方式通信允许数据在两个方向上同时传输,它在能力上相当于两个单工通讯方式的结合。

shion1114的博客 1300

多元相关性分析_PAST:最简便易用的统计学分析软件教程目录

欢迎来到PAST的世界!本教程并不是将PAST的所有功能均进行详细介绍,而只是挑选与生物、医学、微生物研究相关的统计学分析内容进行讲述。根据PAST内各项分析的标签分类,将该教程具体设置如下:PAST软件介绍PAST的基本信息数据的输入和修改数据的转换和标准化图像绘制 (Plot标签)点线图和直方图散点图条形图和箱须图饼图堆叠条形图三元相图气泡图单变量统计学分析 (Univariate标...

weixin_39605706的博客 3156

matlab电偶极子源码,电偶极子的MATLAB场模拟

电偶极子周围电场电势分布的MATLAB三维模拟Matlab可以用于模拟四维场的效果,本文以电偶极子的电场和电势场为例展示MATLAB在该方面领域的应用。摘要电偶极子由一个正电荷和一个负电荷组成,其电场和空间电势分布与单电荷相比具有一些重要的特性。本文将给出电场和电势场的近似表达式。这两个量的精确表达式是复杂的,不太常用,因此 MATLAB 被采用来操作精确值和绘制三维分布的远区域, 近区域和一侧区...

weixin_35135480的博客 3150

51单片机之手撸IIC协议,并点亮oled

这里只是写录学习IIC协议遇到的问题,不会对IIC作过多的解释。有兴真的话可以看这篇文章-。

TSC1235的专栏 3万+

【安全加固】应对Sweet32攻击:TLS/SSL协议3DES漏洞深度解析与修复指南

本文深度解析了CVE-2016-2183(Sweet32攻击)漏洞,该漏洞利用TLS/SSL协议中3DES加密算法的64位块大小缺陷,通过大量数据流量实施“生日攻击”导致信息泄露。文章提供了从原理分析、系统排查到跨平台修复的完整指南,重点指导如何在Windows、Linux服务器及网络设备中禁用不安全的3DES密码套件,并采用AES-GCM等更安全的加密方式,以彻底修复此TLS/SSL漏洞。

weixin_29230649的博客 586

Cubmax IIC协议 OLED

一、背景 IIC(Inter-Integrated Circuit)其实是IICBus简称,所以中文应该叫集成电路总线,它是一种串行通信总线,使用多主从架构,由飞利浦公司在1980年代为了让主版、嵌入式系统或手机以连接低速周边设备而发展。I²C的正确读法为“I平方C”("I-squared-C"),而“I二C”("I-two-C")则是另一种错误但被广泛使用的读法。自2006年10月1日起,使用I²C协议已经不需要支付专利付费,但制造商仍然需要付费以获取I²C从属设备地址。

weixin_49462706的博客 879

Linux单独编译设备树,开发者分享 | Petalinux 工程中设备树的介绍

本文来自XILINX嵌入式产品应用工程师 Terry Ni设备树是 Petalinux kernel 的关键组件,接下来以 2020.1 版本为例,为大家介绍一下在Xilinx Petalinux 工程中的设备树是如何产生,配置以及修改的。Petalinux 工程中设备树的位置当我们创建了一个 petalinux 工程后(以zcu102为例),在编译的时候,会自动生成对应的设备树文件。这些设备树的...

weixin_28877107的博客 2594

uniapp:在map地图组件上添加控件,在地图上添加浮层展示自定义按钮或元素,uniApp如何在Map组件地图上添加悬浮在上面的图标/图片(全平台兼容安卓苹果app、H5网页、微信小程序、nvue)

uni-app的map添加控件问题,uniapp实现地图展示控件,uniapp小程序如何在map组件上增加按钮,uni-app,h5移动端网页,微信小程序,支付宝小程序,Android安卓,苹果ios,app,nvue,Uniapp腾讯地图添加控件,uniapp百度地图添加控件,地图上展示控件并可以点击,在地图上展示控件信息,uniapp map地图怎么向地图上增加工具栏,使用cover-view将控件在地图上展示,解决uniapp map上添加浮层无法显示问题,不显示怎么办,css样式不生效,地图等最高层

✅ 精选推荐文章 3230

STM32-OLED IIC协议(一)

STM32-OLED-IIC协议(一) IIC通信简介 IIC就不详细展开说明,我也不太完全明白。 IIC通信是串行同步全双工。 起始信号S: SCL 为高电平时, SDA 由高电平向低电平跳变,开始传送数据。 终止信号P: SCL 为高电平时, SDA 由低电平向高电平跳变,结束传送数据。 应答信号:每次传输8bit(1字节)数据后,必须要有的响应信号,由接收方来发出 在SCK为高时(一个脉冲内),将SDA拉低。 非应答信号:在SCK为高时(一个脉冲内),将SDA置高。 数据格式 1.(写一字节)as

sxm123z的博客 5253

注意力机制模块:CA(坐标注意力)二次创新:融合深度可分离卷积,打造 CADS 模块

本文提出CADS模块,将坐标注意力(CA)与深度可分离卷积(DSC)深度融合,优化移动端AI部署效率。通过重构CA的计算范式,用深度卷积替代传统1×1卷积,在保持精度的同时显著降低计算开销。文章深入分析了CA的计算瓶颈和DSC的实际效率问题,详细阐述了CADS的设计原理与PyTorch实现,并提供了多组性能对比数据。该模块可直接应用于YOLO、UNet等主流模型,为移动端AI部署提供高效解决方案。

ZXSXJ的博客 96

用51单片机IIC协议OLED显示汉字

IIC协议:(IIC全称Inter-Integrated Circuit (集成电路总线)) 由PHILIPS公司在80年代开发的两线式串行总线,用于连接微控制器及其外围设备。IIC属于半双工同步通信方式。 IIC串行总线一般有两根信号线,一根是双向的数据线SDA,另一根是时钟线SCL,其时钟信号是由主控器件产生。所有接到IIC总线设备上的串行数据SDA都接到总线的SDA上,各设备的时钟线SCL接到总线的SCL上。对于并联在一条总线上的每个IC都有唯一的地址。

weixin_54076783的博客 6156

【YOLO系列】YOLOv4详解:模型结构、损失函数、训练方法及代码实现

摘要:YOLOv4在目标检测领域实现了精度与速度的平衡,通过CSPDarknet53骨干网络、SPP+PANet特征融合及CIoU损失函数等创新,在MS COCO数据集达到65.7% AP50,V100显卡实现62FPS实时检测。核心优化包括Mosaic数据增强、自对抗训练和解耦头结构,显著提升小目标检测和遮挡场景鲁棒性。代码实现采用CSP模块和SPP多尺度池化,兼顾计算效率与检测性能,为工业落地提供高效解决方案。(149字)

一碗白开水一 1358

DataX对接数据如何在ODS加密脱敏数据(插件开发)

datax对接mysql数据,对姓名只保留姓,名变成**。对这种简单的脱敏,可以不用修改datax源码,直接在配置文件上实现。

大模型大数据攻城狮的专栏 994
上一篇: C51- 4G 与 LCD
下一篇: DHT11 - 温湿度传感器
mx_jun
博客等级 码龄5年 1605粉丝 148原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值