外国网站代理,音乐网站建设,高端网站建设找哪个公司,贵阳网站seo公司一、I2C
I2C时序#xff1a;时钟线SCL高电平下#xff1a;SDA由高变低代表启动信号#xff0c;开始发送数据#xff1b;SCL高电平时#xff0c;数据稳定#xff0c;数据可以被读走#xff0c;开始进行读操作#xff0c;SCL低电平时#xff0c;数据发生改变#xff1…一、I2C
I2C时序时钟线SCL高电平下SDA由高变低代表启动信号开始发送数据SCL高电平时数据稳定数据可以被读走开始进行读操作SCL低电平时数据发生改变每发送一个字节的数据都会产生应答信号时钟线SCL低电平下SDA由低变高代表传输数据结束 初始化 P6数据线SDA P7时钟线SCL选用P6和P7两根引脚并给他们置为低电平 分别输出数据线和时钟线 开始信号在空闲状态下先将时钟线置为低电平输出0数据线置位高电平再根据开始信号的触发条件SCL高电平时SDA由高变低最后再拉低SCL增加可靠性和准确行 停止信号SDA由低变高原理同开始信号大差不差 ACK应答信号假应答
发送一个字节
发送一个字节时钟线拉低时发送数据拉高读取数据
void i2c_Send_Byte(char data)
{int i0;for(i7;i0;i--)//循环发送8位数据{i2c_SCL(0);//时钟线拉低i2c_SDA(data (0x1i));//发送数据i2c_SCL(1);//时钟线拉高让接受方接收数据i2c_SCL(0);//时钟线拉低}
}发送多个字节
void i2c_Send_Bytes(int *p,int len)
{int i,j;for(j0;jlen;j){for(i7;i0;i--){i2c_SCL(0);//时钟线拉低i2c_SDA(p[j] (0x1i));i2c_SCL(1);//时钟线拉高让接受方接收数据i2c_SCL(0);//时钟线拉低}i2c_Ack();//一个字节写完过后需要有应答信号}
}二、oled
数据格式 在执行到Control Byte写命令或者写数据是根据D\C为0时命令1时数据根据数据格式写
oled的初始化需要用到IIC引脚的配置随后先将oled关闭最后再打开中间根据数据手册而写
清空函数防止有外部因素的影响
void Oled_clear(void)
{int page;//页int seg;//列for(page0;page8;page)//按页遍历{for(seg0;seg128;seg)//每一页的每一列{Oled_Write_cmd(0xB0page);//页地址Oled_Write_cmd(0x00(seg 0xf));//设置seg列的低地址Oled_Write_cmd(0x10((seg4)0xf));//设置seg列的高地址Oled_Write_data(0x0);//清屏}}
}每一页有8行
设置行 低位与高位 显示数据32列需要使用4页32-64防止数据的覆盖
unsigned char buff[8][32]{
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xE0,0x3C,0x18,0x08,0x00,0x00,0x00,0x00,0xFC,0xF8,0x08,0x00,0x00,0x00,0x00,0x80,0xC0,0xE0,0x60,0x40,0x00,0x00,0x00,0x00},
{0x00,0x00,0x20,0x10,0x08,0x04,0x03,0xFF,0xFF,0x01,0x00,0x40,0x40,0x20,0x20,0x10,0xFF,0xFF,0x08,0x0C,0x06,0x02,0x03,0x01,0x00,0x00,0x00,0x00,0xF8,0x00,0x00,0x00},
{0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x4F,0x47,0x40,0x40,0x40,0x40,0x40,0x40,0xFC,0xFC,0x43,0x43,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x63,0x63,0x41,0x00,0x00},
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},{0x00,0x00,0x00,0x00,0x08,0x10,0x70,0xE0,0x00,0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0xFC,0xFC,0x48,0x40,0x40,0x40,0x40,0x40,0x60,0x60,0x40,0x00,0x00,0x00},
{0x00,0x04,0x0C,0x18,0x78,0x30,0x00,0x80,0x78,0x24,0x20,0x20,0xA2,0x22,0x22,0x22,0x22,0x22,0x3F,0x3F,0x22,0x22,0x22,0x22,0x23,0xA3,0x22,0x30,0x30,0x20,0x00,0x00},
{0x00,0x40,0x40,0xC0,0xC0,0xE0,0x7C,0x03,0x00,0x00,0x00,0x00,0xFF,0xFF,0x91,0x91,0x91,0x91,0x91,0x91,0x91,0x91,0x91,0x91,0x91,0xFF,0xFF,0x01,0x00,0x00,0x00,0x00},
{0x00,0x00,0x00,0x00,0x3F,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x10,0x30,0x70,0x3F,0x1F,0x00,0x00,0x00,0x00,0x00}};void Oled_Display(void)
{int page;//页int seg;//列for(page0;page4;page)//按页遍历{for(seg0;seg32;seg)//每一页的每一列{Oled_Write_cmd(0xB0page);//页地址Oled_Write_cmd(0x00(seg 0xf));//设置seg列的低地址Oled_Write_cmd(0x10((seg4)0xf));//设置seg列的高地址Oled_Write_data(buff[page][seg]);//显示数据}}for(page0;page4;page)//按页遍历{for(seg32;seg64;seg)//每一页的每一列{Oled_Write_cmd(0xB0page);//页地址Oled_Write_cmd(0x00(seg 0xf));//设置seg列的低地址Oled_Write_cmd(0x10((seg4)0xf));//设置seg列的高地址Oled_Write_data(buff[page4][seg-32]);//显示数据//当seg从 32 开始计数时通过seg - 32可以将其转换为从 0 开始的索引//这样就能正确地从buff数组中获取与当前 OLED 页面内列位置相对应的数据}}
}