Only for full screen animations.for a start you need a full size screen buffer in RAM, where you assemble the picture then blast it to the screen.
Only for full screen animations.
For general text & icons in limited locations, you can just keep overwriting the same parts of the display & clearing it on an overall change.
I've used a few graphics displays and never yet had a full image in RAM.
You do need enough overall memory for the font and any icons etc., plus adequate working ram for transferring things.
I've never bothered with monochrome graphics, only full colour - that probably explains the different approach!and not too big as it's only a monochrome display.
I've never bothered with monochrome graphics, only full colour - that probably explains the different approach!
...If I could just reduce the steepness of the mountain in front of me I might have a go, but suspect this is where I need to learn how to compile C
Hey folks, so I still use assembler, don't ask why, I just like to make life difficult for myself...
/************************************************************************
* Packed 96 character 5x7 Font, 2.5-words-per-character, 240 words *
************************************************************************/
#asm
PSECT myFonts, class=CODE, abs, ovrld, space=0, delta=2
ORG 0x0F00
Font5x7:
dw 0x0000, 0x0000, 0x0000, 0x005F, 0x0000 ; 32 ' ' '!'
dw 0x0007, 0x0007, 0x0014, 0x3F94, 0x3F94 ; 34 '"' '#'
dw 0x122A, 0x3FAA, 0x0923, 0x0988, 0x3262 ; 36 '$' '%'
dw 0x1B49, 0x2AA2, 0x2800, 0x0283, 0x0000 ; 38 '&' '''
dw 0x001C, 0x1141, 0x0000, 0x20A2, 0x0E00 ; 40 '(' ')'
dw 0x0A08, 0x1F08, 0x0A08, 0x043E, 0x0408 ; 42 '*' '+'
dw 0x0050, 0x1800, 0x0008, 0x0408, 0x0408 ; 44 ',' '-'
dw 0x0060, 0x3000, 0x0020, 0x0808, 0x0202 ; 46 '.' '/'
dw 0x1F51, 0x24C5, 0x1F00, 0x217F, 0x2000 ; 48 '0' '1'
dw 0x2161, 0x28C9, 0x2321, 0x20C5, 0x25B1 ; 50 '2' '3'
dw 0x0C14, 0x097F, 0x0827, 0x22C5, 0x22B9 ; 52 '4' '5'
dw 0x1E4A, 0x24C9, 0x1801, 0x3889, 0x0283 ; 54 '6' '7'
dw 0x1B49, 0x24C9, 0x1B06, 0x24C9, 0x149E ; 56 '8' '9'
dw 0x0036, 0x1B00, 0x0000, 0x2B36, 0x0000 ; 58 ':' ';'
dw 0x0414, 0x1141, 0x0014, 0x0A14, 0x0A14 ; 60 '<' '='
dw 0x0041, 0x1114, 0x0402, 0x00D1, 0x0486 ; 62 '>' '?'
dw 0x1949, 0x3CC1, 0x1F7E, 0x0891, 0x08FE ; 64 '@' 'A'
dw 0x3FC9, 0x24C9, 0x1B3E, 0x20C1, 0x20A2 ; 66 'B' 'C'
dw 0x3FC1, 0x20A2, 0x0E7F, 0x24C9, 0x24C1 ; 68 'D' 'E'
dw 0x3F89, 0x0489, 0x00BE, 0x20C9, 0x24FA ; 70 'F' 'G'
dw 0x3F88, 0x0408, 0x3F80, 0x20FF, 0x2080 ; 72 'H' 'I'
dw 0x1040, 0x20BF, 0x00FF, 0x0414, 0x1141 ; 74 'J' 'K'
dw 0x3FC0, 0x2040, 0x207F, 0x010C, 0x017F ; 76 'L' 'M'
dw 0x3F84, 0x0410, 0x3FBE, 0x20C1, 0x20BE ; 78 'N' 'O'
dw 0x3F89, 0x0489, 0x033E, 0x20D1, 0x10DE ; 80 'P' 'Q'
dw 0x3F89, 0x0CA9, 0x2346, 0x24C9, 0x24B1 ; 82 'R' 'S'
dw 0x0081, 0x3F81, 0x00BF, 0x2040, 0x203F ; 84 'T' 'U'
dw 0x0FA0, 0x2020, 0x0FBF, 0x2038, 0x203F ; 86 'V' 'W'
dw 0x3194, 0x0414, 0x3187, 0x0470, 0x0407 ; 88 'X' 'Y'
dw 0x30D1, 0x24C5, 0x2180, 0x3FC1, 0x2080 ; 90 'Z' '['
dw 0x0104, 0x0410, 0x1000, 0x20C1, 0x3F80 ; 92 '\' ']'
dw 0x0202, 0x0082, 0x0240, 0x2040, 0x2040 ; 94 '^' '_'
dw 0x0001, 0x0104, 0x0020, 0x2A54, 0x2A78 ; 96 '`' 'a'
dw 0x3FC8, 0x2244, 0x1C38, 0x2244, 0x2220 ; 98 'b' 'c'
dw 0x1C44, 0x2248, 0x3FB8, 0x2A54, 0x2A18 ; 100 'd' 'e'
dw 0x047E, 0x0481, 0x010C, 0x2952, 0x293E ; 102 'f' 'g'
dw 0x3F88, 0x0204, 0x3C00, 0x227D, 0x2000 ; 104 'h' 'i'
dw 0x1040, 0x223D, 0x007F, 0x0828, 0x2200 ; 106 'j' 'k'
dw 0x0041, 0x3FC0, 0x007C, 0x0218, 0x0278 ; 108 'l' 'm'
dw 0x3E08, 0x0204, 0x3C38, 0x2244, 0x2238 ; 110 'n' 'o'
dw 0x3E14, 0x0A14, 0x0408, 0x0A14, 0x0C7C ; 112 'p' 'q'
dw 0x3E08, 0x0204, 0x0448, 0x2A54, 0x2A20 ; 114 'r' 's'
dw 0x023F, 0x2240, 0x103C, 0x2040, 0x107C ; 116 't' 'u'
dw 0x0E20, 0x2020, 0x0E3C, 0x2030, 0x203C ; 118 'v' 'w'
dw 0x2228, 0x0828, 0x220C, 0x2850, 0x283C ; 120 'x' 'y'
dw 0x2264, 0x2A4C, 0x2200, 0x0436, 0x2080 ; 122 'z' '{'
dw 0x0000, 0x3F80, 0x0000, 0x20B6, 0x0400 ; 124 '|' '}'
dw 0x0808, 0x0410, 0x0478, 0x2341, 0x2378 ; 126 '~' ''
#endasm
/************************************************************************
* *
* *************************************/
void rdflash() //
{ asm("movlb EECON1/128 "); // bank 3 |03
asm("bcf EECON1,6 "); // CFGS = 0 (not config) |03
asm("bsf EECON1,7 "); // EEPGD = 1 (program memory) |03
asm("bsf EECON1,0 "); // RD = 1 (initiate read) |03
asm("nop "); // required nop |03
asm("nop "); // " |03
asm("incf EEADRL,F "); // bump EEADR |03
asm("rlf EEDATL,W "); // move b7 into Carry |03
asm("rlf EEDATH,W "); // wreg = the 7 bit hi byte |03
asm("bcf EEDATL,7 "); // eedatl = the 7 bit lo byte |03
} //
/************************************************************************
* *
* *************************************/
void OLED_char(char ascii) // send ASCII 5x7 character font
{ static char ndx; //
asm("addlw -32 "); // ascii 32..127 minus offset |02
// asm("banksel putascii@ndx "); // bank 0 ? |00
asm("movwf OLED_char@ndx "); // save table index, 0..95 |02
asm("lsrf WREG,F "); // int(index *= 2.5) -> 0..237 |02
asm("addwf OLED_char@ndx,W"); // " |02
asm("addwf OLED_char@ndx,W"); // " |02
asm("movlb EEADRL/128 "); // bank 3 |03
asm("movwf EEADRL "); // |03
asm("movlw Font5x7/256 "); // |03
asm("movwf EEADRH "); // flash address hi |03
/* *
* Extract five bytes of font data from three words of memory. An *
* even character uses word 0 hi + lo, 1 hi + lo, and 2 hi while *
* odd characters use word 0 lo, 1 hi + lo, and 2 hi + lo. A 6th *
* blank (zero) byte is sent for inter-character spacing. *
* */
i2c_start(0x78); // send I2C 'start'
// i2c_write(0x78); // send I2C 'address'
i2c_write(0x40); // send SSD 'control' Co=0 D/C=1
asm("call _rdflash "); // read 1st word (2 bytes) |03
// asm("banksel wrchar@ndx "); // bank 0 |00
asm("btfss OLED_char@ndx,0"); // odd char? yes, skip, else |03
asm("call _i2c_write "); // send hi byte (even character) |02
asm("movlb EEDATL/128 "); // bank 3 |03
asm("movf EEDATL,W "); // |03
asm("call _i2c_write "); // send lo byte |02
asm("call _rdflash "); // read 2nd word (2 bytes) |03
asm("call _i2c_write "); // send hi byte |02
asm("movlb EEDATL/128 "); // bank 3 |03
asm("movf EEDATL,W "); // |03
asm("call _i2c_write "); // send lo byte |02
asm("call _rdflash "); // read 3rd word (2 bytes) |03
asm("call _i2c_write "); // send hi byte |02
asm("movlb EEDATL/128 "); // bank 3 |03
asm("movf EEDATL,W "); // |03
// asm("banksel wrchar@ndx "); // bank 0 |00
asm("btfsc OLED_char@ndx,0"); // even char? yes, skip, else |03
asm("call _i2c_write "); // send lo byte (odd characters) |02
asm("movlw 0 "); // |02
asm("call _i2c_write "); // send blank 6th column |02
i2c_stop(); //
} //
/************************************************************************
* init command sequence for 0.96" 128x64 SSD1306 OLED display *
************************************************************************/
const unsigned char ssdcfg[] = {
// 0xAE, // displayoff . . . . . . . (default)
// 0xD5, 0x80, // displayclockdiv & param (default)
// 0xA8, 0x3F, // setmultiplex & param () (default)
// 0xD3, 0x00, // setdisplayoffset & param (default)
// 0x40, // setstartline . . . . . . (default)
0x8D, 0x14, // chargepump & param
0x20, 0x00, // memorymode 'horizontal'
// 0xA1, // segremap (A0/A1, flip horizontally)
// 0xC8, // comscandec (C0/C8, flip vertically)
// 0xDA, 0x12, // setcompins () . . . . . (default)
// 0x81, 0x7F, // setcontrast, 0-255 . . . (default)
0xD9, 0xF1, // setprecharge
0xDB, 0x40, // setvcomdetect
// 0xA4, // displayallon_resume . . (default)
// 0xA6, // normaldisplay . . . . . (default)
0xAF // displayon
}; //
are there any shortcuts that make life a little more manageable?
Where are they, please (XC8, not CCS)? I would love to study them.Yes, use the C libraries.
Where are they, please (XC8, not CCS)? I would love to study them.
TIA... Mike
Ok, Library was a big word but - I was referring to the various C-based code for Nokia 5110 displays available on Arduino - one can easily port over to XC8.
Except the libraries are C++ not just C, so less trivial to convert to XC8 than it might have been. I've done a considerable amount of such porting
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?