摘要:显示模块如果还没有看过协议的,请移步先看下面这篇文章协议好的,现在我们进入正题向寄存器地址写入一个的数据开启发送设备地址读写控制,采用宏定义方式一般地址为,不行就尝试下传入参数,为寄存器参数,根据手册,写入命令寄
如果还没有看过I2C 协议的,请移步先看下面这篇文章
好的,现在我们进入正题
void I2C_WriteByte(uint8_t addr,uint8_t data){ i2c_Start(); //开启 协议 //0x78 转化为 2进制 0111 1110 再或上一个 0 | 1 的值,表示地址最后一位为读写控制指令 i2c_SendByte(OLED_ADDRESS|OLED_I2C_WR); //发送地址 和 读写控制指令 if (i2c_WaitAck() != 0) { goto cmd_fail; } i2c_SendByte(addr); //发送对应寄存器,判断为0x00发送命令,还是0x40发送数据 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();}
void WriteCmd(unsigned char I2C_Command){ I2C_WriteByte(0x00, I2C_Command);}void WriteDat(unsigned char I2C_Data){ I2C_WriteByte(0x40, I2C_Data);}
这边代码直接使用网上的,如果非要自己编写,请查看 OLED 模块使用手册,某宝一般都会提供,可能为 全英文文档,没错,博主看不懂!
void OLED_Init(void){ delay_ms(1000); // 1s,一定要延时,防止错误 WriteCmd(0xAE); //display off WriteCmd(0x20); //Set Memory Addressing Mode WriteCmd(0x10); //00,Horizontal Addressing Mode;01,Vertical Addressing Mode;10,Page Addressing Mode (RESET);11,Invalid WriteCmd(0xb0); //Set Page Start Address for Page Addressing Mode,0-7 WriteCmd(0xc8); //Set COM Output Scan Direction WriteCmd(0x00); //---set low column address WriteCmd(0x10); //---set high column address WriteCmd(0x40); //--set start line address WriteCmd(0x81); //--set contrast control register WriteCmd(0xff); //亮度调节 0x00~0xff WriteCmd(0xa1); //--set segment re-map 0 to 127 WriteCmd(0xa6); //--set normal display WriteCmd(0xa8); //--set multiplex ratio(1 to 64) WriteCmd(0x3F); // WriteCmd(0xa4); //0xa4,Output follows RAM content;0xa5,Output ignores RAM content WriteCmd(0xd3); //-set display offset WriteCmd(0x00); //-not offset WriteCmd(0xd5); //--set display clock divide ratio/oscillator frequency WriteCmd(0xf0); //--set divide ratio WriteCmd(0xd9); //--set pre-charge period WriteCmd(0x22); // WriteCmd(0xda); //--set com pins hardware configuration WriteCmd(0x12); WriteCmd(0xdb); //--set vcomh WriteCmd(0x20); //0x20,0.77xVcc WriteCmd(0x8d); //--set DC-DC enable WriteCmd(0x14); // WriteCmd(0xaf); //--turn on oled panel}
void OLED_SetPos(unsigned char x, unsigned char y) { WriteCmd(0xb0+y); //设置页坐标 WriteCmd(((x&0xf0)>>4)|0x10); //设置 列 高四位地址 WriteCmd((x&0x0f)|0x01); //设置 列 低四位地址 }
函数作用:填充每一页,实现全亮,全灭的操作
void OLED_Fill(unsigned char fill_Data){ unsigned char m,n; for(m=0;m<8;m++) { WriteCmd(0xb0+m); //page0-page7 WriteCmd(0x00); //第四位起始地址 WriteCmd(0x10); //高四位起始地址 for(n=0;n<128;n++) //每页水平坐标为 0 - 127 { WriteDat(fill_Data); //写入数据 0x00 为全灭,0xff为全亮 } }}
采用 字符库软件生成 16 进制数,放入数组中
判断是采用 6*8 数组还是 8*16 数组
空格的 ascll 码为 32 ,需要减去,这样才能得到正确的数字,字母,符号等
如果为 6*8 的 ascll 码,每个 x 就为 6,所以判断一下 如果同一行后面不能准确显示,就换行,再显示该字符
设置字符起点,写入对应数据,数据为字符软件生成的字符。
case2 表示 8*16 的字符,一行 16 位 16进制数代表某一个英文字符,8*16 代表列数为 8 个,也就是每一行应该输出 8 个 16进制数,总共输出两行,先使用 ascall 码找到英文字符对应的所在位置,再设置 起点坐标,由于一次绘制 8 个 16进制数,所以 x+=8; j++ 表示开始下一个字符
就是类似于
void OLED_ShowStr(unsigned char x, unsigned char y, unsigned char ch[], unsigned char TextSize){ unsigned char c = 0,i = 0,j = 0; switch(TextSize) { case 1: { while(ch[j] != "/0") { c = ch[j] - 32; if(x > 126) { x = 0; y++; } OLED_SetPos(x,y); for(i=0;i<6;i++) WriteDat(F6x8[c][i]); x += 6; j++; } }break; case 2: { while(ch[j] != "/0") { c = ch[j] - 32; if(x > 120) { x = 0; y++; } OLED_SetPos(x,y); for(i=0;i<8;i++) WriteDat(F8X16[c*16+i]); OLED_SetPos(x,y+1); for(i=0;i<8;i++) WriteDat(F8X16[c*16+i+8]); x += 8; j++; } }break; }}
与上面 字符串 case 2 中显示相同
这边的字符串数组为 12*12 ,一个汉字为 1个 2*12点阵,所以 addr 为 24*N
void OLED_ShowCN8(unsigned char x, unsigned char y, unsigned char N){ unsigned char wm=0; unsigned int adder=24*N; OLED_SetPos(x , y); for(wm = 0;wm < 12;wm++) { WriteDat(F12x12[adder]); adder += 1; } OLED_SetPos(x,y + 1); for(wm = 0;wm < 12;wm++) { WriteDat(F12x12[adder]); adder += 1; }}
第一次尝试编写博客,若是有什么建议,欢迎批评指出。
后续会逐步分块更新,并会在最后一篇文章上传源代码。
若是该文章对你有作用或是觉得文章写得还行,帮忙点点赞,三连!
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/121621.html
摘要:负责对电能检测模块下发收集指令,以及对电能检测模块响应的数据进行处理,一方面对接收的单相数据进行转换后驱动屏幕对相关数据进行显示,另一方面对单相数据进行重新打包并通过串口对以太网模块进行数据传输。 ...
摘要:对应代码为读取口线状态拉低总线发送信号根据上方时序图可以知道在为高电平期间,发送数据,发送次数据,数据为被拉高,被拉低,数据为,被拉低。 I2C 协议 I2C 简要...
摘要:当温度感应器感应到设备主体内部的温度高于设定值时,此时温度设定器会控制风机进行启动,对内部进行散热处理,低于设定值时停止。设定的时间间隔温度阈值,当前温度由显示,表示工作状态。为继电器,,,供电。必须手动清除,否则将持续引发中断。 目录 一、 设计要求 二、 总体设计和系统框图 三、设计...
阅读 1491·2021-09-30 09:47
阅读 3485·2021-09-22 15:05
阅读 2804·2021-08-30 09:44
阅读 3596·2019-08-30 15:55
阅读 1345·2019-08-30 13:08
阅读 1307·2019-08-29 16:40
阅读 513·2019-08-29 12:45
阅读 1326·2019-08-29 11:25