9robot 发表于 2017-5-17 22:34:04

【Curie Nano】驱动OLED+RTC

       拿到Curie Nano有一段时间了,感觉Curie Nano简直太棒啦。一直忙于毕业的事,发的帖子确实有点少。开始正事之前先说说自己使用的体会。之前自己买过arduino mini Pro是arduino入门的开始,当时只是感觉arduino入门还是比较简单的,适合编程基础有限的人使用,有点小瞧arduino。后来在B站上才知道arduino在很多高端领域的应用。在爱板网有幸使用过Fireduino,Curie Nano给我的感觉就像当时用Fireduino很惊喜,只不过两者各有千秋。前面开箱时巴拉巴拉扯啦一堆Curie Nano参数。真正开始使用时才体会到Curie Nano的强大。
       最近想给Curie Nano加个液晶屏,就把之前在fireduino上写的程序拿过来,没有改动就可以运行。Curie Nano自带RTC功能,可以加个时间显示,这样就是一个简单的电子表,可是Curie Nano有六轴陀螺仪加速度传感器和BLE,也就是说可以把Curie Nano做成智能手环而且不需要再添加其他模块。
       这次的帖子只是简单的驱动OLED,外加时间显示,如果加上六轴传感器可以做一个有趣的闹钟,翻转就可以取消响铃。#include "Wire.h"
#include <CurieTime.h>
#include "oledfont.h"
#define OLED_ADDRESS(0x78>>1) //通过调整0R电阻,屏可以0x78和0x7A两个地址 -- 默认0x78

void setup() {
Serial.begin(9600);
delay(100);
pinMode(13, OUTPUT);
digitalWrite(13,HIGH);
Serial.println("setup");
Wire.begin();//初始化I2C
delay(100);
OLED_Init();
setTime(22, 30, 00, 17, 5, 2017);
}

void loop() {
char tab[]={"CURIE NANO"};
char nowtime={};
OLED_ClearScr();
//LCD_P6x8Str(0,0,tab);
//LCD_P6x8Str(0,1,tab);
LCD_P8x16Str(0,0,tab);
while(1)
{
nowtime=hour()/10+'0';
nowtime=hour()%10+'0';
nowtime=':';
nowtime=minute()/10+'0';
nowtime=minute()%10+'0';
nowtime=':';
nowtime=second()/10+'0';
nowtime=second()%10+'0';
nowtime='\0'';
digitalWrite(13,HIGH);
LCD_P8x16Str(0,2,nowtime);
//delay(1000);
//digitalWrite(13,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 );   //,分频因子;,震荡频率
   WriteCmd(0xA8 ); //设置驱动路数
   WriteCmd(0x1f );
   WriteCmd(0X3F ); //默认0X3F(1/64)
   WriteCmd(0xD3 ); //设置显示偏移
   WriteCmd(0X00 ); //默认为0

   WriteCmd(0x40 ); //设置显示开始行 ,行数.
                              
   WriteCmd(0x8D ); //电荷泵设置
   WriteCmd(0x14 ); //bit2,开启/关闭
   
   WriteCmd(0x20 ); //设置内存地址模式
   WriteCmd(0x02 ); //,00,列地址模式;01,行地址模式;10,页地址模式;默认10;
   
   WriteCmd(0xA1 ); //段重定义设置,bit0:0,0->0;1,0->127;
   
   WriteCmd(0xC0 ); //设置COM扫描方向;bit3:0,普通模式;1,重定义模式 COM->COM0;N:驱动路数
   
   WriteCmd(0xDA ); //设置COM硬件引脚配置   这部分在一开始出现问题2016.07.10
   WriteCmd(0x00 ); //配置
   
   WriteCmd(0x81 ); //对比度设置
   WriteCmd(0xff ); //1~255;默认0X7F (亮度设置,越大越亮)
   
   WriteCmd(0xa1);
    WriteCmd(0xc8);
   
   WriteCmd(0xD9 ); //设置预充电周期
   WriteCmd(0xf1 ); //,PHASE 1;,PHASE 2;
   WriteCmd(0xDB ); //设置VCOMH 电压倍率
   WriteCmd(0x30 ); // 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!='\0')
   {
       c =ch-32;
       if(x>128){x=0;y+=2;}
       LCD_Set_Pos(x,y);   
       for(i=0;i<6;i++)   
       WriteDat( F6x8);
       x+=8;
       j++;
   }
}
void LCD_P8x16Str(unsigned char x,unsigned char y,char ch[])
{
    char c=0,i=0,j=0;
    while (ch!='\0')
   {
       c =ch-32;
       if(x>128){x=0;y+=2;}
       LCD_Set_Pos(x,y);   
       for(i=0;i<8;i++)   
       WriteDat( F8X16);

       LCD_Set_Pos(x,y+1);   
       for(i=0;i<8;i++)   
       WriteDat( F8X16);

      
       x+=8;
       j++;
   }
}






limale 发表于 2017-5-18 09:54:32

赞一个。。:lol

噗噗熊 发表于 2017-5-18 16:32:39

加上六轴传感器可以做一个有趣的闹钟,翻转就可以取消响铃。期待,赞!
页: [1]
查看完整版本: 【Curie Nano】驱动OLED+RTC