BASIC4MCU | 통신 | I2C-IIC,TWI | SSD1306( dot matrix OLED/PLED 128x64) 아두이노 라이브러리
페이지 정보
작성자 master 작성일2018-04-26 12:17 조회2,425회 댓글0건본문
https://github.com/digistump/DigistumpArduino/tree/master/digistump-avr/libraries/DigisparkOLED
이 라이브러리를 c 스타일로 변경 해봤습니다.
// MCU BASIC: https://www.basic4mcu.com// DateTime : 2018-04-26 오후 12:19:40// by Ok-Hyun Park/**SSD1306xLED-Drivers for SSD1306 controlled dot matrix OLED/PLED 128x64 displays*/#include <stdlib.h>#include <stdint.h>#include <avr/io.h>#include <Arduino.h>#include <Wire.h>#include <util/delay.h>//#define U08 uint8_t#define U16 uint16_t////#define _nofont_8x16 //tBUG#ifndef _nofont_8x16 //tBUG#define FONT8X16 1#endif//#define FONT6X8 0//#include "font6x8.h"//#ifndef _nofont_8x16 // tBUG Optional removal to save code space#include "font8x16.h"#endif//----------------------------------------------------------------------------#ifndef SSD1306#define SSD1306 0x3C // Slave address#endif//----------------------------------------------------------------------------#define start_cmd 0x00#define start_data 0x40//----------------------------------------------------------------------------/**SSD1306xLED-Drivers for SSD1306 controlled dot matrix OLED/PLED 128x64 displays*///----------------------------------------------------------------------------//----------------------------------------------------------------------------// Some code based on "IIC_wtihout_ACK" by http: //www.14blog.com/archives/1358U08 ssd1306_init[]={ // Initialization Sequence0xAE, // Display OFF(sleep mode)0x20,0b00,// Set Memory Addressing Mode // 00=Horizontal Addressing Mode; 01=Vertical Addressing Mode; // 10=Page Addressing Mode(RESET); 11=Invalid0xB0, // Set Page Start Address for Page Addressing Mode,0-70xC8, // Set COM Output Scan Direction0x00, //---set low column address0x10, //---set high column address0x40, //--set start line address0x81,0x3F,// Set contrast control register0xA1, // Set Segment Re-map.A0=address mapped; A1=address 127 mapped.0xA6, // Set display mode.A6=Normal; A7=Inverse0xA8,0x3F,// Set multiplex ratio(1 to 64)0xA4, // Output RAM to Display // 0xA4=Output follows RAM content; 0xA5,Output ignores RAM content0xD3,0x00,// Set display offset.00=no offset0xD5, //--set display clock divide ratio/oscillator frequency0xF0, //--set divide ratio0xD9,0x22,// Set pre-charge period0xDA,0x12,// Set com pins hardware configuration0xDB, //--set vcomh0x20, // 0x20,0.77xVcc0x8D,0x14,// Set DC-DC enable0xAF // Display ON in normal mode};//U08 oledFont,oledX,oledY=0;//// Program: 5248 bytes//void SSD1306_setFont(U08 font){ oledFont=font; }//void SSD1306_cmd (U08 c){ Wire.beginTransmission(SSD1306_add); Wire.write(start_cmd); Wire.write(c); Wire.endTransmission(); }void SSD1306_data(U08 b){ if(Wire.writeAvailable()){ Wire.endTransmission(); Wire.beginTransmission(SSD1306_add); Wire.write(start_data); } Wire.write(b); }void SSD1306_Cursor(U08 x,U08 y){ Wire.beginTransmission(SSD1306_add); Wire.write(start_cmd); Wire.write(0xb0+y); Wire.write((x>>4)|0x10); Wire.write((x&0x0f)|0x01); Wire.endTransmission(); oledX=x; oledY=y; }//void SSD1306_fill(U08 f){U08 m,n;for(m=0;m<8;m++){SSD1306_cmd(0xb0+m); SSD1306_cmd(start_cmd); SSD1306_cmd(0x10); // page0-page1 // low column start address // high column start addressWire.beginTransmission(SSD1306_add); Wire.write(start_data); for(n=0;n<128;n++)SSD1306_data(f); Wire.endTransmission();}setCursor(0,0);}void SSD1306_clear(){ fill(0); }//size_t SSD1306_wr(byte c){U08 i=0,ci;if(c=='\r')return 1;if(c=='\n'){if(oledFont==FONT6X8){ oledY++; } // if(oledY>7)oledY=7; // tBUGelse { oledY+=2; if(oledY>6)oledY=6; } // tBUG Large Font up by two // tBUGsetCursor(0,oledY);return 1;}ci=c-32;if(oledFont==FONT6X8){if(oledX>122){ oledX=0; oledY++; if(oledY>7)oledY=7; setCursor(oledX,oledY); } // tBUGWire.beginTransmission(SSD1306_add); Wire.write(start_data); for(i=0;i<6;i++)SSD1306_data(pgm_read_byte(&ssd1306xled_font6x8[ci*6+i])); Wire.endTransmission(); setCursor(oledX+6,oledY);}#ifndef _nofont_8x16 // tBUGelse{if(oledX>120){ oledX=0; oledY+=2; if(oledY>6)oledY=6; setCursor(oledX,oledY); } // oledY++; //tBUG Large Font up by two // tBUGWire.beginTransmission(SSD1306_add); Wire.write(start_data); for(i=0;i<8;i++)Wire.write(pgm_read_byte(&ssd1306xled_font8x16[ci*16+i ])); Wire.endTransmission(); setCursor(oledX ,oledY+1);Wire.beginTransmission(SSD1306_add); Wire.write(start_data); for(i=0;i<8;i++)Wire.write(pgm_read_byte(&ssd1306xled_font8x16[ci*16+i+8])); Wire.endTransmission(); setCursor(oledX+8,oledY-1);}#endifreturn 1;}//void SSD1306_bitmap(U08 x0,U08 y0,U08 x1,U08 y1,const U08 bitmap[]){U16 j=0; U08 y,x;// if(y1%8==0)y=y1/8; // else y=y1/8+1; // tBUG:: this does nothing as y is initialized below// THIS PARAM rule on y makes any adjustment here WRONG //usage oled.bitmap(START X IN PIXELS,START Y IN ROWS OF 8 PIXELS,END X IN PIXELS,END Y IN ROWS OF 8 PIXELS,IMAGE ARRAY);for(y=y0;y<y1;y++){ setCursor(x0,y); Wire.beginTransmission(SSD1306_add); Wire.write(start_data); for(x=x0;x<x1;x++)SSD1306_data(pgm_read_byte(&bitmap[j++])); Wire.endTransmission(); }setCursor(0,0);}//void SSD1306_begin(){Wire.begin(); for(U08 i=0;i<sizeof(ssd1306_init);i++)SSD1306_cmd(ssd1306_init[i]); clear();}//
댓글 0
조회수 2,425등록된 댓글이 없습니다.