总结:如果您的显示模块未读取协议,请先继续阅读下一篇文章。 协议很好。 现在,让我们进入正题。 通过使用宏向寄存器地址写入数据,可以控制发送设备地址的读写。 定义方法的通用地址为: 如果这不起作用,请尝试传递一个寄存器参数。 按照手册编写发送命令。
OLED 显示模块
如果您还没有看到 I2C 协议,请继续阅读下面的内容。 本文
I2C 协议
现在开始进入正题
1. 将数据字节写入 OLED 寄存器地址,以便 I2C 可以将其发送到 OLED 设备。 地址 + 读写控制 (w - 0, r - 1) #define OLED_I2C_WR 0 使用宏定义方式 #define OLED_I2C_RD 1 通常 OLED 地址为 0x78。 如果不行就试试0x7A,传入参数addr,这是一个寄存器参数。 根据OLED手册,0x00-写入命令寄存器,0x40-写入数据寄存器。 每次发送数据时,I2C 都必须提供正确的响应。 0 是正确的响应。 要查看该函数的具体实现,请前往I2C协议。 如果 OLED 设备没有正确响应,请使用 goto 无条件传输语句停止 I2C 协议。 谨慎使用 goto 语句。 void I2C_WriteByte(uint8_t addr,uint8_t data){i2c_Start();//打开协议//0x78转换为二进制0111 1110或之前的值0 | 1、表示该地址最后一位可以读取或写入 控制命令 i2c_SendByte(OLED_ADDRESS|OLED_I2C_WR);//发送发送地址和读写控制命令 if (i2c_WaitAck() != 0){goto cmd_fail;}i2c_SendByte(addr);//如果为0x00或数据则发送相应寄存器发送命令 If ( i2c_WaitAck() ! = 0 ){goto cmd_fail;}i2c_SendByte(data);//对应寄存器为0x00,data为命令,对应寄存器为0x40,data为数据 if (i2c_WaitAck() != 0 ){goto cmd_fail;}i2c_Stop(); //最后停止协议 cmd_fail: i2c_Stop();}
2.命令函数和数据 编写函数。 我们重新封装了该函数,使其变得更简单、更方便,因为它基本上只使用两个寄存器地址:写命令和数据。 void WriteCmd(unsigned char I2C_Command){I2C_WriteByte(0x00, I2C_Command);} void WriteDat(unsigned char I2C_Data) {I2C_WriteByte(0x40, I2C_Data);}
3. 初始化 OLED
Here 代码为直接取自互联网。 如果需要自己编写,请查看OLED模块文档。 通常由特定网站提供。 它可以是完整的英文文档。 是的,博主不懂!
void OLED_Init(void){lay_ms(1000);//应该延迟1s,防止出错 WriteCmd(0xAE); //显示 offWriteCmd(0x20);//设置内存寻址模式WriteCmd(0x10);//00,水平寻址模式;01,垂直寻址模式;10,Page Addressing Mode (RESET);11,InvalidWriteCmd(0xb0);//设置页寻址模式的页起始地址,0-7WriteCmd(0xc8);//设置COM输出扫描方向WriteCmd(0x00); // [ k4] --设置下列地址WriteCmd(0x10); //---设置上列地址WriteCmd(0x40); //--开始设置行地址WriteCmd(0x81) ); //--设置对比度控制寄存器WriteCmd(0xff); //亮度调节0x00~0xffWriteCmd(0xa1); //--段重新-映射0到127WriteCmd(0xa6) 。 // --设置正常displayWriteCmd(0xa8)。 //--设置复用比(1到64)WriteCmd(0x3F); //WriteCmd(0xa4); //0xa4,输出跟随RAM的内容。 0xa5,输出忽略 RAM 内容WriteCmd(0xd3)。 //-设置显示offsetWriteCmd(0x00); //-offsetWriteCmd(0xd5); //--设置显示时钟分频比/振荡器频率WriteCmd(0xf0); //--设置分频比WriteCmd(0xd9); //--设置预-充电周期WriteCmd(0x22); /[k4 ]-设置 com 引脚硬件配置 WriteCmd(0x12);WriteCmd(0xdb); //--设置 vcomhWriteCmd(0x20); //0x20,0.77xVccWriteCmd(0x8d); ]- DC-Configure DCenableWriteCmd(0x14); //WriteCmd(0xaf); //--打开oled面板}
4.设置起始点OLED 光标。 参数说明: x,坐标 轴内水平坐标,大小 0 - 127y,坐标轴垂直坐标,大小 0 - 7 void OLED_SetPos(unsigned char x, unsigned char y) { WriteCmd(0xb0+y ) ;//设置页面坐标 WriteCmd(((x&0xf0)>>4) |0x10); //设置列地址的前4位 WriteCmd((x&0x0f)|0x01); //设置列地址的后4位列地址设置}
5. 全屏填充功能
函数功能:填充每一页,实现全屏开关操作
void OLED_Fill(unsigned char fill_Data){unsigned char m,n;for(m=0;m )
评论前必须登录!
注册