Okay, found!
![]()
Here is a simple code to get started with this 72x40 display.
I also include the SSD1306 command and display's datasheets.
Since I use EXCEL to design characters, here's the sheet you may want to have a look at.
And again, lots of thanks to Richard
![]()
Roger
You seem to have the communication to the controller well under control
next step is to try to store a font economically, you have probably discovered a large font on a very resource limited chip
like a 690 stored as a series of code structures like
I2CWrite SDA,SCL,I2CDevice,_
[$40,192,224,240,248,252,126,63,63,63,63,63,63,63,6 3,126,252,248,240,224,192,_
255,255,255,255,128,128,128,128,128,128,128,128,12 8,128,128,128,255,255,255,255,_
255,255,255,255,15,15,15,15,15,15,15,15,15,15,15,1 5,255,255,255,255,_
255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,255,255,25 5,255]
will by the time you have 10 digits covered will have blown 75% of the chips flash.
fonts can be stored in much better ways, even expanded out as the are read back
Warning I'm not a teacher
Richard, can you point me the direction to do this?fonts can be stored in much better ways
Should I use some kind of algorithm where repetitive numbers could be stored differently or find a way to make better use of the 14 bits word size of the 16F690?
Roger
the font is just a simple block of data
this one is for digits 0 to 9 + "." + "%" its 14 bits high and 10 bits wide [to match chip flash]
so total size is 120 words
for convenience lets locate it a the end of flash - 120 words ie. 0xf88
note this is only partially "filled" in and not very carefully at that
normally i would make the font an include and give it a label rather than manually locate it like thisCode:asm ;incomplete and very rough font 14x10 org 0xf88 dw 0x1ffc,0x3ffe,0x3006,0x3006,0x3006,0x3006,0x3006,0x3006,0x3ffe,0x1ffc ;"0" dw 0,0x300C,0x300E,0x300F,0x3ffF,0x3ffF,0x3ffF,0x3000,0x3000,0 dw 0x3806,0x3C07,0x3E03,0x3703,0x3383,0x31E3,0x30F3,0x307F,0x303E,0 dw 0x3018,0x3006,0x3186,0x3186,0x3186,0x3186,0x3186,0x3006,0x3cf8,0x1ffc ;"3" dw 0,0x3ffe,0,0x3ffe,0,0x3ffe,0,0x3ffe,0,0 dw 0,0x3ffe,0,0x3ffe,0x3ffe,0x3ffe,0,0x3ffe,0,0 dw 0x3ffe,0x3ffe,0x3ffe,0,0,0,0,0x3ffe,0x3ffe,0x3ffe dw 0x3ffe,0x3ffe,0x3ffe,0,0,0x3ffe,0,0x3ffe,0x3ffe,0x3ffe dw 0x1ffc,0x3ffe,0x3186,0x3186,0x3186,0x3186,0x3186,0x3186,0x3ffe,0x1ffc ;"8" dw 0,0x3ffe,0x3ffe,0x3ffe,0x3ffe,0x3ffe,0x3ffe,0x3ffe,0x3ffe,0x3ffe dw 0,0,0,0xE00,0x1F00,0x1F00,0xE00,0,0,0 ;"." dw 0x181f,0xC11,0x611,0x31f,0x1C0,0x60,0x1F38,0x110c,0x1106,0x1F02 ;"%" endasm
dt's macro as found in dt-ints is ideal to find and numerate the font address
when the fonts address is known its simple to use readcode command to retrieve font dataGetAddress macro Label, Wout
CHK?RP Wout
movlw low Label ; get low byte
movwf Wout
movlw High Label ; get high byte
movwf Wout + 1
endm
Last edited by lester; - 8th December 2023 at 08:44. Reason: Changed Thread Title
Warning I'm not a teacher
Just for fun, scrolling text example
![]()
Roger
i'm not seeing a font , i had a look at a 40x18 font this morning with my new 72x40 that just arrived
encoded this way seems the best compromise for easy of unpacking into a 18 x 5 byte stream to send to display
i dont like most of you inital sfr settings
i would replace the entire section with
OSCCON = $70 ;% 01110000 'Internal RC set to 8MHZ
for these reasons
OPTION_REG = % 10000000 'PORT A&B Pull-Ups disabled (see WPUA & WPUB)
Pull-Ups are set that way by default anyway . that does other things to that may later prove to be incorrect Like set int edge to falling, reassign and alter the prescaler, change timer 0 clock source
OSCCON = % 11100000 'Internal RC set to 8MHZ
no 'OSCCON = % 01110000 for 8mhz you have set it for 4 mhz
ANSEL = % 00010100 'Select analog inputs Channels 0 to 7 (AN2 + AN4 selected)
ok but you then go on to make those pins be digital outputs , not recommended except for smoke generation if used as analog inputs
ADCON0 = % 10000000 'A/D Module (Bit5:2 select channels 0:11)
ADCON1 = % 00000000 'A/D control register
why ? makes no sense adc is off by default
CM1CON0 = % 00000000 'Comparator1 Module is OFF
CM2CON0 = % 00000000 'Comparator2 Module is OFF
why ? Comparator 1 and 2 Modules are OFF by default
INTCON = % 00000000 'INTerrupts CONtrol (TMR0 OFF)
why serves no purpose ints are off by default
TRISA = % 00000000 'Set Input/Output (0 to 5)
bad call when an2
TRISB = % 00000000 'Set Input/Output (4 to 7)
bad call when 4,6 used for i2c
TRISC = % 00000000 'Set Input/Output (0 to 7)
bad call when an4
why ? i2c pins can left as be inputs
when breadboarding leave unused pins as inputs. fine set them as low outputs for the "production" version if a few microwatts of power dissipation makes a difference
PORTB = % 00000000 'Ports High/Low (4 to 7)
why ? i2c pins being set low is not useful
Warning I'm not a teacher
Bookmarks