oled显示时是竖向的取模,gram为何要写成这样的数组?
//OLED的显存
//存放格式如下.
//[0]0 1 2 3 ... 127
//[1]0 1 2 3 ... 127
//[2]0 1 2 3 ... 127
//[3]0 1 2 3 ... 127
//[4]0 1 2 3 ... 127
//[5]0 1 2 3 ... 127
//[6]0 1 2 3 ... 127
//[7]0 1 2 3 ... 127
u8 OLED_GRAM[128][8];
我怎么觉得应该是这样 u8 OLED_GRAM[8][128];
还是没搞懂oled gram的对于关系!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
---------------------------------
实际测试吧。最直接了。
---------------------------------
已经仿真了,找到原因了,原来page0是靠近oled排线的那一端
--------------------------------
原子哥,OLED_GRAM[100][4]|=1<<2;这个地方我也有疑问,求解答。1<<2为什么改变的是y值,也就是那个4?
---------------------------------
好的,谢谢原子哥
---------------------------------
您好原子哥,我根据您的OLED显存显示的方案,写好了一些GUI函数,并把模拟I2C和硬件I2C都实现(通过修改宏的值用于选择),工程跑的是RTX操作系统。这是我6月份做的智能小车,一直没什么时间现在才写了一点点的程序。希望您能看下,给些意见,谢谢。
原子哥,您的模拟I2C实验中并不需要设置I2C引脚的方向,只要配置成开漏输出即可,开漏输出即可以做输出又可以读出引脚电平,不过一定要接上拉电阻。
您的OLED显存二维数组个人有点不太习惯,所以改成 [8][16]形式,显存对应OLED坐标如下:
[mw_shl_code=c,true]//OLED的显存 左下角为坐标原点 即坐标为 (0,0) //存放格式如下. //[0]0 1 2 3 ... 127 ------------------- //[1]0 1 2 3 ... 127 | | //[2]0 1 2 3 ... 127 | | //[3]0 1 2 3 ... 127 | | //[4]0 1 2 3 ... 127 | | //[5]0 1 2 3 ... 127 | | //[6]0 1 2 3 ... 127 |O | //[7]0 1 2 3 ... 127 原点 -------------------- u8 OLED_GRAM[8][128]; [/mw_shl_code] 硬件I2C及模拟I2C底层函数均写好,修改宏的值及可选择,头文件代码如下:
[mw_shl_code=c,true]#ifndef _MONI_I2C_ #define _MONI_I2C_ #include <stm32f10x.h> #define Hardware_I2C 0 //1 为硬件 I2C 0 为模拟I2C //---------------------------------------------------------------------------------------- //I2C IO #define I2C_NUM_RCC RCC_APB1Periph_I2C2 #define I2C_NUM I2C2 #define I2C_RCC RCC_APB2Periph_GPIOB #define I2C_BUS GPIOB #define IIC_SCL GPIO_Pin_10 #define IIC_SDA GPIO_Pin_11 #define I2C_SCL(x) x?GPIO_SetBits(I2C_BUS,IIC_SCL) : GPIO_ResetBits(I2C_BUS,IIC_SCL) #define I2C_SDA(x) x?GPIO_SetBits(I2C_BUS,IIC_SDA) : GPIO_ResetBits(I2C_BUS,IIC_SDA) #define READ_SDA GPIO_ReadInputDataBit(I2C_BUS,IIC_SDA) #if Hardware_I2C //硬件I2C----------------------------------------- //IIC所有操作函数 void IIC_Init(void); //初始化IIC的IO口 void IIC_Start(void); //发送IIC开始信号 void IIC_Stop(void); //发送IIC停止信号 void IIC_Send_Byte(u8 txd); //IIC发送一个字节 u8 IIC_Read_Byte(void); //IIC读取一个字节 void I2C_START(void); //开启I2C void I2C_End(void); //关闭I2C #else //模拟I2C---------------------------------------------------- //IIC所有操作函数 void IIC_Init(void); //初始化IIC的IO口 void IIC_Start(void); //发送IIC开始信号 void IIC_Stop(void); //发送IIC停止信号 void IIC_Send_Byte(u8 txd); //IIC发送一个字节 u8 IIC_Read_Byte(unsigned char ack);//IIC读取一个字节 ack=1时,发送ACK,ack=0,发送nACK u8 IIC_Wait_Ack(void); //IIC等待ACK信号 void IIC_Ack(void); //IIC发送ACK信号 void IIC_NAck(void); //IIC不发送ACK信号 void I2C_delay(u16 t); //I2C 延时 #define I2C_Wait 0 //I2C延时时间 用于调节I2C 速度 #endif #endif [/mw_shl_code] 模拟I2C只需配置成开漏输出就不需要切换引脚方向,但是一定要外接上拉电阻!
宏I2C_Wait 用于控制模拟I2C 速度 ,值越大速度越慢
ARM智能小车跑RTX操作系统,I2C OLED 模拟I2C及硬件I2C均测试通过,OLED写好部分GUI函数。
工程文件:
一周热门 更多>