TA的每日心情 | 奋斗 2024-9-22 22:20 |
---|
签到天数: 944 天 连续签到: 1 天 [LV.10]以坛为家III
|
本帖最后由 9robot 于 2016-12-27 13:39 编辑
了解了Fireduino有关IIC接口的基本知识就可以开始使用了,第一次使用Arduino环境下的IIC接口,还不太熟悉,不过使用之后感觉Arduino环境确实简化了IIC的操作。简单的几个函数就可以完成对IIC器件的操作,这次使用的是IIC接口的OLED显示屏,由于只是向OLED模块写数据,没有往回读数据的过程,所以只使用了以下几个函数:
Wire.begin(); //初始化I2C
Wire.beginTransmission(OLED_ADDRESS);
Wire.write(addr);
Wire.write(data);
Wire.endTransmission();
在使用这几个函数前要包含 Wire.h文件- #include "Wire.h"
- #include "oledfont.h"
- #define OLED_ADDRESS (0x78>>1) //默认0x78
- void setup() {
- Serial.begin(9600);
- delay(100);
- pinMode(3, OUTPUT);
- digitalWrite(3,HIGH);
- Serial.println("setup");
- Wire.begin(); //初始化I2C
- delay(100);
- OLED_Init();
- }
- void loop() {
- char tab[]={"Fireduino"};
- OLED_ClearScr();
- //LCD_P6x8Str(0,0,tab);
- //LCD_P6x8Str(0,1,tab);
- LCD_P8x16Str(0,0,tab);
- while(1)
- {
- digitalWrite(3,HIGH);
- delay(1000);
- digitalWrite(3,LOW);
- delay(1000);
- }
- }
- //写命令函数
- void WriteCmd(unsigned char I2C_Command)//写命令
- {
- I2C_WriteByte(0x00, I2C_Command);
- }
- //写数据函数
- void WriteDat(unsigned char I2C_Data)//写数据
- {
- I2C_WriteByte(0x40, I2C_Data);
- }
- //写一个字节
- void I2C_WriteByte(uint8_t addr,uint8_t data)
- {
- Wire.beginTransmission(OLED_ADDRESS);
- Wire.write(addr);
- Wire.write(data);
- Wire.endTransmission();
- }
- //oled初始化
- void OLED_Init(void)
- {
- WriteCmd(0xAE ); //关闭显示
- WriteCmd(0xD5 ); //设置时钟分频因子,震荡频率
- WriteCmd(0x80 ); //[3:0],分频因子;[7:4],震荡频率
- WriteCmd(0xA8 ); //设置驱动路数
- WriteCmd(0x1f );
- WriteCmd(0X3F ); //默认0X3F(1/64)
- WriteCmd(0xD3 ); //设置显示偏移
- WriteCmd(0X00 ); //默认为0
- WriteCmd(0x40 ); //设置显示开始行 [5:0],行数.
-
- WriteCmd(0x8D ); //电荷泵设置
- WriteCmd(0x14 ); //bit2,开启/关闭
-
- WriteCmd(0x20 ); //设置内存地址模式
- WriteCmd(0x02 ); //[1:0],00,列地址模式;01,行地址模式;10,页地址模式;默认10;
-
- WriteCmd(0xA1 ); //段重定义设置,bit0:0,0->0;1,0->127;
-
- WriteCmd(0xC0 ); //设置COM扫描方向;bit3:0,普通模式;1,重定义模式 COM[N-1]->COM0;N:驱动路数
-
- WriteCmd(0xDA ); //设置COM硬件引脚配置 这部分在一开始出现问题 2016.07.10
- WriteCmd(0x00 ); //[5:4]配置
-
- WriteCmd(0x81 ); //对比度设置
- WriteCmd(0xff ); //1~255;默认0X7F (亮度设置,越大越亮)
-
- WriteCmd(0xa1);
- WriteCmd(0xc8);
-
- WriteCmd(0xD9 ); //设置预充电周期
- WriteCmd(0xf1 ); //[3:0],PHASE 1;[7:4],PHASE 2;
- WriteCmd(0xDB ); //设置VCOMH 电压倍率
- WriteCmd(0x30 ); //[6:4] 000,0.65*vcc;001,0.77*vcc;011,0.83*vcc;
- WriteCmd(0xA4 ); //全局显示开启;bit0:1,开启;0,关闭;(白屏/黑屏)
- WriteCmd(0xA6 ); //设置显示方式;bit0:1,反相显示;0,正常显示
- WriteCmd(0xAF ); //开启显示
-
- }
- //清屏
- void OLED_ClearScr(void)
- {
- uint8_t i,n;
- for(i=0;i<4;i++)
- {
- WriteCmd(0xb0+i); //设置页地址(0~7)
- WriteCmd(0x00); //设置显示位置—列低地址
- WriteCmd(0x10); //设置显示位置—列高地址
- for(n=0;n<128;n++) WriteDat(0x00);
- }
- }
- void LCD_Set_Pos(unsigned char x, unsigned char y)
- {
- WriteCmd(0xb0+y);
- WriteCmd(((x&0xf0)>>4)|0x10);
- WriteCmd(x&0x0f);
- }
- void LCD_P6x8Str(unsigned char x,unsigned char y,char ch[])
- {
- char c=0,i=0,j=0;
- while (ch[j]!='\0')
- {
- c =ch[j]-32;
- if(x>128){x=0;y+=2;}
- LCD_Set_Pos(x,y);
- for(i=0;i<6;i++)
- WriteDat( F6x8[c][i]);
- x+=8;
- j++;
- }
- }
- void LCD_P8x16Str(unsigned char x,unsigned char y,char ch[])
- {
- char c=0,i=0,j=0;
- while (ch[j]!='\0')
- {
- c =ch[j]-32;
- if(x>128){x=0;y+=2;}
- LCD_Set_Pos(x,y);
- for(i=0;i<8;i++)
- WriteDat( F8X16[c][i]);
- LCD_Set_Pos(x,y+1);
- for(i=0;i<8;i++)
- WriteDat( F8X16[c][i+8]);
-
- x+=8;
- j++;
- }
- }
复制代码 一开始调试时就准备用Fireduino自带的IIC接口,但是调了一下午也没出来,拿逻辑分析仪测了一下波形也没问题,整个人都不好了,这个驱动OLED的程序是从其他板子移植过来,是不应该有问题的。但就是不好用,又去使用IO软件模拟IIC,还是不好使。又折腾了半天才发现一个问题,就是这个OLED模块虽然说电压范围是2.6~3.5V,但3V左右时亮度很低,几乎就看不见了,发现Fireduino的板子上标注的是3V,而不是3.3V。找了另外一块板子为OLED模块提供电压,一切正常。
拿电压表实测了一下,Fireduino上标3V的口确实是3V(实际2.96V),但是和硬件手册上对比了一下,电路图上确实3.3V,虽然0.3V的电压差多数情况下影响不大,但这次确实把我坑了
|
评分
-
查看全部评分
|