查看: 669|回复: 0

【 LinkIt ONE 】3、SPI OLED

[复制链接]
  • TA的每日心情
    慵懒
    2016-10-17 12:07
  • 签到天数: 306 天

    连续签到: 1 天

    [LV.8]以坛为家I

    发表于 2016-5-23 10:18:28 | 显示全部楼层 |阅读模式
    分享到:

    如上图,所示,基本是LinkIt ONE 的所有功能。开发板在手里,前段时间,一直在忙别的事情,学习了好久,并没有给大家分享,这里深表歉意。
    以后的时间里,针对 LinkIt ONE上述的功能和函数,与大家分享,来学习这个 兼容 arduino 的开发板--LinkIt ONE,一起来学它的功能,探索它在IoT 上的基本功能。
    这一篇文章,我们来使用SPI 总线可控制OLED(128x64)。
    同步外设接口(SPI)是由摩托罗拉公司开发的全双工同步串行总线,该总线大量用在与EEPROM、ADC、FRAM和显示驱动器之类的慢速外设器件通信。
                               
    SPI总线是一种 三线 总线协议,通过三条线实现全双工的通信。
    (1)MOSI:主器件数据输出,从器件数据输入
    (2)MISO:主器件数据输入,从器件数据输出
    (3)SCLK :时钟信号,由主器件产生
    (4)/SS:从器件使能信号,由主器件控制
    SPI(Serial Peripheral Interface)是一种串行同步通讯协议,由一个主设备和一个或多个从设备组成,主设备启动一个与从设备的同步通讯,从而完成数据的交换。SPI 接口由SDI(串行数据输入),SDO(串行数据输出),SCK(串行移位时钟),CS(从使能信号)四种信号构成,CS 决定了唯一的与主设备通信的从设备,如没有CS 信号,则只能存在一个从设备,主设备通过产生移位时钟来发起通讯。通讯时,数据由SDO 输出,SDI 输入,数据在时钟的上升或下降沿由SDO 输出,在紧接着的下降或上升沿由SDI 读入,这样经过8/16 次时钟的改变,完成8/16 位数据的传输。
    本文中使用的是 OLED 12864  主控采用的是SSD1306  用SPI进行通信:
    OLED 发光二极管,有很多优点,省点、清晰、等等、现在智能手环的显示上用的比较多。
    Linkit ONE 和 OLED连接之后,使用D6 和 D7 控制 OLED_DC  和 OLED_RST
    #define OLED_DC     6#define OLED_RST    7#define OLED_DC_L   digitalWrite(OLED_DC, LOW)#define OLED_DC_H   digitalWrite(OLED_DC, HIGH)#define OLED_RST_L  digitalWrite(OLED_RST, LOW)#define OLED_RST_H  digitalWrite(OLED_RST, HIGH)绘制字符串函数如下:
    void OLED_6x8Str(unsigned char x, unsigned char y, unsigned char ch[])OLED的控制函数如下:
    void OLED_WB(uint8_t data);void LCD_WrDat(unsigned char dat);void LCD_WrCmd(unsigned char cmd);void LCD_DLY_ms(unsigned int ms);void LCD_Fill(unsigned char bmp_dat);void OLED_SetPos(unsigned char x, unsigned char y);void LCD_CLS(void);void OLED_6x8Str(unsigned char x, unsigned char y, unsigned char ch[]);void LCD_Init(void);SPI 的简单操作如下:
    #include <SPI.h>#define SS_PIN    10void setup(){    pinMode(SS_PIN, OUTPUT);    SPI.begin();    }void loop(){    byte ret_val;    digitalWrite(SS_PIN, LOW);    ret_val = SPI.transfer(100);    digitalWrite(SS_PIN, HIGH);    delay(1000);}LinkIt ONE 上的 SPI 设置为了 Master(主机模式),试用 SPI.begin(); 启动SPI。。。使用 get= SPI.transfer(data); 进行数据的交换传输。LinkIt ONE 控制 OLED 的代码如下,下载到 LinkIt ONE 中即可以看到如下效果:
                        
    #include <SPI.h>const unsigned char F6x8[][6] =    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00,// sp0x00, 0x00, 0x00, 0x2f, 0x00, 0x00,// !0x00, 0x00, 0x07, 0x00, 0x07, 0x00,// "0x00, 0x14, 0x7f, 0x14, 0x7f, 0x14,// #0x00, 0x24, 0x2a, 0x7f, 0x2a, 0x12,// $0x00, 0x62, 0x64, 0x08, 0x13, 0x23,// %0x00, 0x36, 0x49, 0x55, 0x22, 0x50,// &0x00, 0x00, 0x05, 0x03, 0x00, 0x00,// '0x00, 0x00, 0x1c, 0x22, 0x41, 0x00,// (0x00, 0x00, 0x41, 0x22, 0x1c, 0x00,// )0x00, 0x14, 0x08, 0x3E, 0x08, 0x14,// *0x00, 0x08, 0x08, 0x3E, 0x08, 0x08,// +0x00, 0x00, 0x00, 0xA0, 0x60, 0x00,// ,0x00, 0x08, 0x08, 0x08, 0x08, 0x08,// -0x00, 0x00, 0x60, 0x60, 0x00, 0x00,// .0x00, 0x20, 0x10, 0x08, 0x04, 0x02,// /0x00, 0x3E, 0x51, 0x49, 0x45, 0x3E,// 00x00, 0x00, 0x42, 0x7F, 0x40, 0x00,// 10x00, 0x42, 0x61, 0x51, 0x49, 0x46,// 20x00, 0x21, 0x41, 0x45, 0x4B, 0x31,// 30x00, 0x18, 0x14, 0x12, 0x7F, 0x10,// 40x00, 0x27, 0x45, 0x45, 0x45, 0x39,// 50x00, 0x3C, 0x4A, 0x49, 0x49, 0x30,// 60x00, 0x01, 0x71, 0x09, 0x05, 0x03,// 70x00, 0x36, 0x49, 0x49, 0x49, 0x36,// 80x00, 0x06, 0x49, 0x49, 0x29, 0x1E,// 90x00, 0x00, 0x36, 0x36, 0x00, 0x00,// :0x00, 0x00, 0x56, 0x36, 0x00, 0x00,// ;0x00, 0x08, 0x14, 0x22, 0x41, 0x00,// <0x00, 0x14, 0x14, 0x14, 0x14, 0x14,// =0x00, 0x00, 0x41, 0x22, 0x14, 0x08,// >0x00, 0x02, 0x01, 0x51, 0x09, 0x06,// ?0x00, 0x32, 0x49, 0x59, 0x51, 0x3E,// @0x00, 0x7C, 0x12, 0x11, 0x12, 0x7C,// A0x00, 0x7F, 0x49, 0x49, 0x49, 0x36,// B0x00, 0x3E, 0x41, 0x41, 0x41, 0x22,// C0x00, 0x7F, 0x41, 0x41, 0x22, 0x1C,// D0x00, 0x7F, 0x49, 0x49, 0x49, 0x41,// E0x00, 0x7F, 0x09, 0x09, 0x09, 0x01,// F0x00, 0x3E, 0x41, 0x49, 0x49, 0x7A,// G0x00, 0x7F, 0x08, 0x08, 0x08, 0x7F,// H0x00, 0x00, 0x41, 0x7F, 0x41, 0x00,// I0x00, 0x20, 0x40, 0x41, 0x3F, 0x01,// J0x00, 0x7F, 0x08, 0x14, 0x22, 0x41,// K0x00, 0x7F, 0x40, 0x40, 0x40, 0x40,// L0x00, 0x7F, 0x02, 0x0C, 0x02, 0x7F,// M0x00, 0x7F, 0x04, 0x08, 0x10, 0x7F,// N0x00, 0x3E, 0x41, 0x41, 0x41, 0x3E,// O0x00, 0x7F, 0x09, 0x09, 0x09, 0x06,// P0x00, 0x3E, 0x41, 0x51, 0x21, 0x5E,// Q0x00, 0x7F, 0x09, 0x19, 0x29, 0x46,// R0x00, 0x46, 0x49, 0x49, 0x49, 0x31,// S0x00, 0x01, 0x01, 0x7F, 0x01, 0x01,// T0x00, 0x3F, 0x40, 0x40, 0x40, 0x3F,// U0x00, 0x1F, 0x20, 0x40, 0x20, 0x1F,// V0x00, 0x3F, 0x40, 0x38, 0x40, 0x3F,// W0x00, 0x63, 0x14, 0x08, 0x14, 0x63,// X0x00, 0x07, 0x08, 0x70, 0x08, 0x07,// Y0x00, 0x61, 0x51, 0x49, 0x45, 0x43,// Z0x00, 0x00, 0x7F, 0x41, 0x41, 0x00,// [0x00, 0x55, 0x2A, 0x55, 0x2A, 0x55,// 550x00, 0x00, 0x41, 0x41, 0x7F, 0x00,// ]0x00, 0x04, 0x02, 0x01, 0x02, 0x04,// ^0x00, 0x40, 0x40, 0x40, 0x40, 0x40,// _0x00, 0x00, 0x01, 0x02, 0x04, 0x00,// '0x00, 0x20, 0x54, 0x54, 0x54, 0x78,// a0x00, 0x7F, 0x48, 0x44, 0x44, 0x38,// b0x00, 0x38, 0x44, 0x44, 0x44, 0x20,// c0x00, 0x38, 0x44, 0x44, 0x48, 0x7F,// d0x00, 0x38, 0x54, 0x54, 0x54, 0x18,// e0x00, 0x08, 0x7E, 0x09, 0x01, 0x02,// f0x00, 0x18, 0xA4, 0xA4, 0xA4, 0x7C,// g0x00, 0x7F, 0x08, 0x04, 0x04, 0x78,// h0x00, 0x00, 0x44, 0x7D, 0x40, 0x00,// i0x00, 0x40, 0x80, 0x84, 0x7D, 0x00,// j0x00, 0x7F, 0x10, 0x28, 0x44, 0x00,// k0x00, 0x00, 0x41, 0x7F, 0x40, 0x00,// l0x00, 0x7C, 0x04, 0x18, 0x04, 0x78,// m0x00, 0x7C, 0x08, 0x04, 0x04, 0x78,// n0x00, 0x38, 0x44, 0x44, 0x44, 0x38,// o0x00, 0xFC, 0x24, 0x24, 0x24, 0x18,// p0x00, 0x18, 0x24, 0x24, 0x18, 0xFC,// q0x00, 0x7C, 0x08, 0x04, 0x04, 0x08,// r0x00, 0x48, 0x54, 0x54, 0x54, 0x20,// s0x00, 0x04, 0x3F, 0x44, 0x40, 0x20,// t0x00, 0x3C, 0x40, 0x40, 0x20, 0x7C,// u0x00, 0x1C, 0x20, 0x40, 0x20, 0x1C,// v0x00, 0x3C, 0x40, 0x30, 0x40, 0x3C,// w0x00, 0x44, 0x28, 0x10, 0x28, 0x44,// x0x00, 0x1C, 0xA0, 0xA0, 0xA0, 0x7C,// y0x00, 0x44, 0x64, 0x54, 0x4C, 0x44,// z0x14, 0x14, 0x14, 0x14, 0x14, 0x14,// horiz lines};#define OLED_DC     6#define OLED_RST    7#define OLED_DC_L   digitalWrite(OLED_DC, LOW)#define OLED_DC_H   digitalWrite(OLED_DC, HIGH)#define OLED_RST_L  digitalWrite(OLED_RST, LOW)#define OLED_RST_H  digitalWrite(OLED_RST, HIGH)void OLED_WB(uint8_t data){        SPI.transfer(data);}/*******************????????***********************/void LCD_WrDat(unsigned char dat){    OLED_DC_H;    OLED_WB(dat);}/********************??????**********************/void LCD_WrCmd(unsigned char cmd){    OLED_DC_L;    OLED_WB(cmd);}/**********************?????**********************/void LCD_Fill(unsigned char bmp_dat){  unsigned char y,x;  LCD_WrCmd(0x20);//-Set Page Addressing Mode (0x00/0x01/0x02)  LCD_WrCmd(0x00);//  LCD_WrCmd(0x21);//-Set Column Address  LCD_WrCmd(0x00);  LCD_WrCmd(0x7f);  LCD_WrCmd(0x22);//-Set Page Address  LCD_WrCmd(0x00);  LCD_WrCmd(0x07);  delayMicroseconds(1);    for(y=0;y<8;y++)    {      for(x=0;x<128;x++)      {        LCD_WrDat(bmp_dat);      }    }}void OLED_SetPos(unsigned char x, unsigned char y)//???????{  LCD_WrCmd(0xb0 + y);  LCD_WrCmd(((x&0xf0)>>4)|0x10);  LCD_WrCmd((x&0x0f)|0x01);}void LCD_CLS(void)//??{  LCD_Fill(0x00);}void OLED_6x8Str(unsigned char x, unsigned char y, unsigned char ch[]){  unsigned char c=0,i=0,j=0;  while (ch[j]!='\0')  {    c = ch[j]-32;    if(x>126)    {      x=0;y++;    }    OLED_SetPos(x,y);    for(i=0;i<6;i++)    {      LCD_WrDat(F6x8[c]);    }    x+=6;    j++;  }}/*********************12864???***********************/void LCD_Init(void){  OLED_RST_L;  delayMicroseconds(50);  OLED_RST_H;      LCD_WrCmd(0xae);//--turn off oled panel    LCD_WrCmd(0xa8);//--set multiplex ratio(1 to 64)    LCD_WrCmd(0x3f);//--1/64 duty    LCD_WrCmd(0xd3);//-set display offset Shift Mapping RAM Counter (0x00~0x3F)    LCD_WrCmd(0x00);//-not offset    LCD_WrCmd(0x40);//--set start line address  Set Mapping RAM Display Start Line (0x00~0x3F)    LCD_WrCmd(0xa0);//--Set SEG/Column Mapping     0xa0???? 0xa1??    LCD_WrCmd(0xc0);//Set COM/Row Scan Direction   0xc0???? 0xc8??    LCD_WrCmd(0xda);//--set com pins hardware configuration    LCD_WrCmd(0x12);    LCD_WrCmd(0x81);//--set contrast control register    LCD_WrCmd(0xcf); // Set SEG Output Current Brightness    LCD_WrCmd(0xa4);// Disable Entire Display On (0xa4/0xa5)    LCD_WrCmd(0xa6);// Disable Inverse Display On (0xa6/a7)    LCD_WrCmd(0xd5);//--set display clock divide ratio/oscillator frequency    LCD_WrCmd(0x80);//--set divide ratio, Set Clock as 100 Frames/Sec    LCD_WrCmd(0x8d);//--set Charge Pump enable/disable    LCD_WrCmd(0x14);//--set(0x10) disable    LCD_WrCmd(0xaf);//--turn on oled panel    LCD_WrCmd(0xd9);//--set pre-charge period    LCD_WrCmd(0xf8);//Set Pre-Charge as 15 Clocks & Discharge as 1 Clock    LCD_WrCmd(0xdb);//--set vcomh    LCD_WrCmd(0x40);//Set VCOM Deselect Level    LCD_Fill(0x00); }unsigned char dis1[] = "hello";unsigned char dis2[] = "I am LinkIt ONE";unsigned char dis3[] = "eeboard";void setup() {  pinMode(OLED_DC,OUTPUT);  pinMode(OLED_RST,OUTPUT);    SPI.begin();    SPI.setBitOrder(MSBFIRST);     LCD_Init();   delayMicroseconds(10);  LCD_Fill(0xff);  LCD_Fill(0xff);  LCD_Fill(0x00);    OLED_6x8Str(0, 0, dis1);  OLED_6x8Str(0, 3, dis2);  OLED_6x8Str(80, 7, dis3);  }void loop() {}
    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    手机版|小黑屋|与非网

    GMT+8, 2024-4-23 16:30 , Processed in 0.123346 second(s), 17 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.