Need a working code for oled ssd1306 display for mikroC compiler - Page 1
Forum section: electronics / beginners

author: khatus
author_rank: Regular Contributor
timestamp: April 19, 2019, 03:06:21 pm
content: Hello guys i need a working code for oled ssd1306 display for mikroC compiler. I want to print something on the display screen.i am not a programming expertHere is the working code for CCSC.But i need a code for mirkoc.Can anybody help meCode:#include <18F4550.h>#device adc=10#device PASS_STRINGS = IN_RAM#fuses NOMCLR, NOWDT, NOPROTECT, NOLVP ,NOBROWNOUT#use delay (clock=20,000000)#use i2c(Master,Fast=400000,sda=PIN_B0,scl=PIN_B1,force_sw) // maybe force_hw#include <string.h>#define OLED 0x78#INCLUDE <stdlib.h>const BYTE TEXT ={0x00, 0x00, 0x00, 0x00, 0x00, // SPACE0x00, 0x00, 0x5F, 0x00, 0x00, // !0x00, 0x03, 0x00, 0x03, 0x00, // "0x14, 0x3E, 0x14, 0x3E, 0x14, // #0x24, 0x2A, 0x7F, 0x2A, 0x12, // $0x43, 0x33, 0x08, 0x66, 0x61, // %0x36, 0x49, 0x55, 0x22, 0x50, //&0x00, 0x05, 0x03, 0x00, 0x00, // '0x00, 0x1C, 0x22, 0x41, 0x00, // (0x00, 0x41, 0x22, 0x1C, 0x00, //)0x14, 0x08, 0x3E, 0x08, 0x14, // *0x08, 0x08, 0x3E, 0x08, 0x08, // +0x00, 0x50, 0x30, 0x00, 0x00, //,0x08, 0x08, 0x08, 0x08, 0x08, // -0x00, 0x60, 0x60, 0x00, 0x00, // .0x20, 0x10, 0x08, 0x04, 0x02, // /0x3E, 0x51, 0x49, 0x45, 0x3E, // 00x04, 0x02, 0x7F, 0x00, 0x00, // 10x42, 0x61, 0x51, 0x49, 0x46, // 20x22, 0x41, 0x49, 0x49, 0x36, // 30x18, 0x14, 0x12, 0x7F, 0x10, // 40x27, 0x45, 0x45, 0x45, 0x39, // 50x3E, 0x49, 0x49, 0x49, 0x32, // 60x01, 0x01, 0x71, 0x09, 0x07, // 70x36, 0x49, 0x49, 0x49, 0x36, // 80x26, 0x49, 0x49, 0x49, 0x3E, // 90x00, 0x36, 0x36, 0x00, 0x00, // :0x00, 0x56, 0x36, 0x00, 0x00, //;0x08, 0x14, 0x22, 0x41, 0x00, // <0x14, 0x14, 0x14, 0x14, 0x14, // =0x00, 0x41, 0x22, 0x14, 0x08, // >0x02, 0x01, 0x51, 0x09, 0x06, // ?0x3E, 0x41, 0x59, 0x55, 0x5E, // @0x7E, 0x09, 0x09, 0x09, 0x7E, // A0x7F, 0x49, 0x49, 0x49, 0x36, // B0x3E, 0x41, 0x41, 0x41, 0x22, // C0x7F, 0x41, 0x41, 0x41, 0x3E, // D0x7F, 0x49, 0x49, 0x49, 0x41, // E0x7F, 0x09, 0x09, 0x09, 0x01, // F0x3E, 0x41, 0x41, 0x49, 0x3A, // G0x7F, 0x08, 0x08, 0x08, 0x7F, // H0x00, 0x41, 0x7F, 0x41, 0x00, // I0x30, 0x40, 0x40, 0x40, 0x3F, // J0x7F, 0x08, 0x14, 0x22, 0x41, // K0x7F, 0x40, 0x40, 0x40, 0x40, // L0x7F, 0x02, 0x0C, 0x02, 0x7F, // M0x7F, 0x02, 0x04, 0x08, 0x7F, // N0x3E, 0x41, 0x41, 0x41, 0x3E, // O0x7F, 0x09, 0x09, 0x09, 0x06, // P0x1E, 0x21, 0x21, 0x21, 0x5E, // Q0x7F, 0x09, 0x09, 0x09, 0x76 // R};const BYTE TEXT2={0x26, 0x49, 0x49, 0x49, 0x32, // S0x01, 0x01, 0x7F, 0x01, 0x01, // T0x3F, 0x40, 0x40, 0x40, 0x3F, // U0x1F, 0x20, 0x40, 0x20, 0x1F, // V0x7F, 0x20, 0x10, 0x20, 0x7F, // W0x41, 0x22, 0x1C, 0x22, 0x41, // X0x07, 0x08, 0x70, 0x08, 0x07, // Y0x61, 0x51, 0x49, 0x45, 0x43, // Z0x00, 0x7F, 0x41, 0x00, 0x00, // [0x02, 0x04, 0x08, 0x10, 0x20, // \0x00, 0x00, 0x41, 0x7F, 0x00, // ]0x04, 0x02, 0x01, 0x02, 0x04, // ^0x40, 0x40, 0x40, 0x40, 0x40, // _0x00, 0x01, 0x02, 0x04, 0x00, // `0x20, 0x54, 0x54, 0x54, 0x78, // a0x7F, 0x44, 0x44, 0x44, 0x38, // b0x38, 0x44, 0x44, 0x44, 0x44, // c0x38, 0x44, 0x44, 0x44, 0x7F, // d0x38, 0x54, 0x54, 0x54, 0x18, // e0x04, 0x04, 0x7E, 0x05, 0x05, // f0x08, 0x54, 0x54, 0x54, 0x3C, // g0x7F, 0x08, 0x04, 0x04, 0x78, // h0x00, 0x44, 0x7D, 0x40, 0x00, // i0x20, 0x40, 0x44, 0x3D, 0x00, // j0x7F, 0x10, 0x28, 0x44, 0x00, // k0x00, 0x41, 0x7F, 0x40, 0x00, // l0x7C, 0x04, 0x78, 0x04, 0x78, // m0x7C, 0x08, 0x04, 0x04, 0x78, // n0x38, 0x44, 0x44, 0x44, 0x38, // o0x7C, 0x14, 0x14, 0x14, 0x08, // p0x08, 0x14, 0x14, 0x14, 0x7C, // q0x00, 0x7C, 0x08, 0x04, 0x04, // r0x48, 0x54, 0x54, 0x54, 0x20, // s0x04, 0x04, 0x3F, 0x44, 0x44, // t0x3C, 0x40, 0x40, 0x20, 0x7C, // u0x1C, 0x20, 0x40, 0x20, 0x1C, // v0x3C, 0x40, 0x30, 0x40, 0x3C, // w0x44, 0x28, 0x10, 0x28, 0x44, // x0x0C, 0x50, 0x50, 0x50, 0x3C, // y0x44, 0x64, 0x54, 0x4C, 0x44, // z0x00, 0x08, 0x36, 0x41, 0x41, //{0x00, 0x00, 0x7F, 0x00, 0x00, //|0x41, 0x41, 0x36, 0x08, 0x00, //}0x02, 0x01, 0x02, 0x04, 0x02 // ~};int DISPLAY ;void OLED_command(int ind, int com){i2c_start ();i2c_write (ind);i2c_write (0x00);i2c_write (com);i2c_stop ();}void OLED_write(INT ind){LONG i;OLED_command (ind, 0x21) ;OLED_command (ind, 0x00);OLED_command (ind, 127);OLED_command (ind, 0x22) ;OLED_command (ind, 0x00);OLED_command (ind, 7);i2c_start ();i2c_write (ind) ;i2c_write (0x40) ;FOR (i = 0; i < 1024; i++){i2c_write (DISPLAY) ;}i2c_stop ();}void OLED_init(INT add){OLED_command (add, 0xae) ;OLED_command (add, 0xa8);OLED_command (add, 0x3f);OLED_command (add, 0xd3);OLED_command (add, 0x00);OLED_command (add, 0x40);OLED_command (add, 0xa0);OLED_command (add, 0xa1);OLED_command (add, 0xc0);OLED_command (add, 0xc8);OLED_command (add, 0xda);OLED_command (add, 0x12);OLED_command (add, 0x81);OLED_command (add, 0xfF);OLED_command (add, 0xa4);OLED_command (add, 0xa6) ;OLED_command (add, 0xd5);OLED_command (add, 0x80);OLED_command (add, 0x8d);OLED_command (add, 0x14) ;OLED_command (add, 0xAF) ;OLED_command (add, 0x20) ;OLED_command (add, 0x00) ;}void OLED_pixel(LONG x,long y){LONG nt;LONG pagina;LONG bit;pagina = y /8;bit= y-(pagina*8);nt= DISPLAY[pagina*128+x];nt |= 1 << bit;DISPLAY[pagina*128+x] = nt;}Void OLED_text(int x, int y, char *textptr, int size){int i, j, k, l, m; // Loop countersBYTE pixelData; // Stores character datafor (i = 0; textptr != '\0'; ++i, ++x) // Loop through the passed string{if (textptr < 'S') // Checks if the letter is in the first text arraymemcpy (pixelData, TEXT[textptr - ' '], 5) ;else if (textptr <= '~') // Check if the letter is in the second arraymemcpy (pixelData, TEXT2[textptr - 'S'], 5) ;elsememcpy (pixelData, TEXT, 5); // DEFAULT to spaceif (x + 5 * size >= 128) // Performs character wrapping{x = 0; // Set x at far left positiony += 7*size + 1; // Set y at next position down}for (j = 0; j<5; ++j, x += size) // Loop through character byte data{for (k = 0; k<7 * size; ++k) // Loop through the vertical pixels{if (bit_test (pixelData, k)) // Check if the pixel should be set{for (l = 0; l<size; ++l) // The next two loops change the{// character's sizefor (m = 0; m<size; ++m){OLED_pixel (x + m, y+k * size + l); // Draws the pixel}}}}}}}VOID OLED_clear(){LONG x;FOR (x = 0; x < 1024; x++){DISPLAY = 0x00;}}void main(){char txt;OLED_init(OLED);int16 value;setup_adc_ports(AN0);setup_adc(ADC_CLOCK_DIV_64);set_adc_channel(0);char str;WHILE (1){OLED_clear();delay_us(12);value = read_adc();sprintf(str, "%lu", value);sprintf(txt,str);OLED_text(0,16,"Voltage",2);OLED_text(82,16,txt,2);OLED_text(0,33,"Current",2);OLED_text(82,33,txt,2);OLED_text(0,50,"Power",2);OLED_text(82,50,txt,2);OLED_write(OLED);delay_ms(300);}}

author: Buriedcode
author_rank: Super Contributor
timestamp: April 20, 2019, 02:25:51 am
content: MikroC compiler will accept standard C code. As long as the code doesn't rely on any built-in libraries from other vendors I'm sure it will work just fine.It is also not necessarily a binary "use existing code" or "write completely from scratch". You can adapt existing code for your own purposes. This way you don't have to trawl through the LCD controllers datasheet to find the initialization sequence, as most libraries already have that.With that code, I believe the only changes required are to the lower level routines - the I2C based ones "void OLED_command" and "void OLED_write" as these can call mikroC's built-in I2C routines (the current code uses CSS I2C routines). Also, the first few lines are not required in MikroC as you configure the device and fuses/config in the project setup.There may be other differences such as the size of variables like int, but for the most part, the bulk of the code should work just fine.

author: hugo
author_rank: Regular Contributor
timestamp: April 20, 2019, 05:23:29 pm
content: Just do a search for "ssd1306" @https://libstock.mikroe.com

author: Doctorandus_P
author_rank: Super Contributor
timestamp: April 20, 2019, 05:38:41 pm
content: Almost 20 years ago I stopped writing code for microcontrollers which used propietary compilers.GCC is an excellent open source compilers and it works from small AVR's to lots of ARM processors from different vendors and also for big PC compilers.It supports multiple (old and newer) variants of C and C++ upto the latest C++19 standards.Why would you want to be messing around with and obscure and outdated proprietary compiler from some small company?Take a step back and look at the big picture before you proceed.