IIC总线连接6050和oled的keil程序
时间: 2023-07-14 18:14:28 浏览: 89
stc51单片机驱动OLED 屏幕程序
以下是基于Keil开发环境的IIC总线连接6050和OLED的示例程序:
```c
#include <reg51.h>
#include <intrins.h>
#define SCL P1_5
#define SDA P1_4
sbit OLED_SCL = P2^0; // OLED SCL引脚
sbit OLED_SDA = P2^1; // OLED SDA引脚
void delay(unsigned int n) // 延时函数
{
unsigned int i,j;
for(i=0;i<n;i++)
for(j=0;j<110;j++);
}
void IIC_Start() // IIC起始信号
{
SDA = 1;
SCL = 1;
_nop_();
_nop_();
_nop_();
SDA = 0;
_nop_();
_nop_();
_nop_();
SCL = 0;
}
void IIC_Stop() // IIC停止信号
{
SDA = 0;
SCL = 1;
_nop_();
_nop_();
_nop_();
SDA = 1;
}
void IIC_WriteByte(unsigned char dat) // 向IIC总线写入一个字节
{
unsigned char i;
for(i=0;i<8;i++)
{
if(dat & 0x80)
SDA = 1;
else
SDA = 0;
dat <<= 1;
SCL = 1;
_nop_();
_nop_();
_nop_();
SCL = 0;
}
SDA = 1;
SCL = 1;
_nop_();
_nop_();
_nop_();
SCL = 0;
}
unsigned char IIC_ReadByte() // 从IIC总线读取一个字节
{
unsigned char i,dat = 0;
for(i=0;i<8;i++)
{
SDA = 1;
SCL = 1;
_nop_();
_nop_();
_nop_();
dat <<= 1;
if(SDA)
dat |= 0x01;
SCL = 0;
}
SDA = 1;
SCL = 1;
_nop_();
_nop_();
_nop_();
SCL = 0;
return dat;
}
void OLED_WriteCmd(unsigned char cmd) // OLED写命令
{
IIC_Start();
IIC_WriteByte(0x78); // OLED地址+写命令
IIC_WriteByte(0x00); // 写命令
IIC_WriteByte(cmd);
IIC_Stop();
}
void OLED_WriteData(unsigned char dat) // OLED写数据
{
IIC_Start();
IIC_WriteByte(0x78); // OLED地址+写命令
IIC_WriteByte(0x40); // 写数据
IIC_WriteByte(dat);
IIC_Stop();
}
void OLED_Init() // OLED初始化
{
OLED_WriteCmd(0xAE); // 关闭显示
OLED_WriteCmd(0x20); // 设置内存地址模式
OLED_WriteCmd(0x10); // 垂直寻址模式
OLED_WriteCmd(0xb0); // 设置页地址
OLED_WriteCmd(0xc8); // 设置列地址
OLED_WriteCmd(0x00); // 设置起始列地址
OLED_WriteCmd(0x10); // 设置高位列地址
OLED_WriteCmd(0x40); // 设置起始行地址
OLED_WriteCmd(0x81); // 对比度设置
OLED_WriteCmd(0xff); // 对比度值
OLED_WriteCmd(0xa1); // 设置段重映射
OLED_WriteCmd(0xa6); // 正常显示
OLED_WriteCmd(0xa8); // 多路复用设置
OLED_WriteCmd(0x3f); // 多路复用值
OLED_WriteCmd(0xa4); // 全局显示开启
OLED_WriteCmd(0xd3); // 显示偏移
OLED_WriteCmd(0x00); // 显示偏移值
OLED_WriteCmd(0xd5); // 显示时钟分频
OLED_WriteCmd(0xf0); // 显示时钟分频值
OLED_WriteCmd(0xd9); // 设置预充电周期
OLED_WriteCmd(0x22); // 预充电周期值
OLED_WriteCmd(0xda); // 设置COM硬件配置
OLED_WriteCmd(0x12); // COM硬件配置值
OLED_WriteCmd(0xdb); // 设置VCOMH
OLED_WriteCmd(0x20); // VCOMH值
OLED_WriteCmd(0x8d); // 设置电荷泵
OLED_WriteCmd(0x14); // 电荷泵值
OLED_WriteCmd(0xaf); // 开启显示
}
void MPU6050_Init() // MPU6050初始化
{
IIC_Start();
IIC_WriteByte(0xD0); // MPU6050地址+写命令
IIC_WriteByte(0x6B); // PWR_MGMT_1寄存器地址
IIC_WriteByte(0x00); // 复位MPU6050
IIC_Stop();
}
void main()
{
unsigned char i;
OLED_Init(); // OLED初始化
MPU6050_Init(); // MPU6050初始化
while(1)
{
OLED_WriteCmd(0xb0); // 页地址0~7循环显示
for(i=0;i<8;i++)
{
OLED_WriteCmd(0xb0+i); // 设置页地址
OLED_WriteCmd(0x00); // 设置列地址低位
OLED_WriteCmd(0x10); // 设置列地址高位
OLED_WriteData('M'); // 在OLED上显示'M'
OLED_WriteData('P'); // 在OLED上显示'P'
OLED_WriteData('U'); // 在OLED上显示'U'
OLED_WriteData('6'); // 在OLED上显示'6'
OLED_WriteData('0'); // 在OLED上显示'0'
OLED_WriteData('5'); // 在OLED上显示'5'
OLED_WriteData('0'); // 在OLED上显示'0'
OLED_WriteData(' '); // 在OLED上显示' '
}
delay(1000); // 延时1秒
}
}
```
在该示例程序中,使用了两个函数分别用于向IIC总线写入一个字节和从IIC总线读取一个字节。同时,还使用了OLED_WriteCmd()和OLED_WriteData()函数分别用于向OLED写入命令和数据。在主函数中,先进行OLED和MPU6050的初始化,然后循环显示MPU6050的地址,最后延时1秒。其中,MPU6050的地址为0x68,可以通过更改IIC_WriteByte()和IIC_ReadByte()函数中的地址实现连接其他IIC设备。
阅读全文