tried a pbp version for the 5 byte compressed packed font, the unpacking done without asm
takes more code space than the compressing saves
inc file
Code:'**************************************************************** '* Name : NOKIA_ds5.INC * '* Author : richard * '* Notice : * '* : * '* Date : 26/05/2018 * '* Version : 1.0b mssp1 version bigtxt * '* Notes : inverse text mike 5 byte font version * '* :FOR pic 16/18 NOKIA LCD * '**************************************************************** goto overglcd ;################################################################## ; adjust these definitions to suit and place in main prg '#DEFINE PIC16 1 ;IF PIC18 NOT USED '#define use_mssp 1 ;if mssp used DON'T FORGET to set sdo and sck pins as o/p's ' lcdheight con 5 ; 6 PAGES ' lcdwidth con 84 ; 84 PIXELS WIDE ;--------------ONLY IF MSSP NOT USED--------------- ' LCD_CLK var Portb.4 ' Clock ' LCD_DIN var Portb.2 ' Data ;----------------------------------------- ' LCD_RST var PortA.4 ' LCD_DC var PortA.3 ' LCD_CE var LATA.6 ' LCD_LIGHT var PortA.0 ;################################################################## USERCOMMAND "LCDC" ;X,Y,CHR 0 < X < 84 , 0 < Y < 7 31 < CHR > 127 USERCOMMAND "LCDCLR" ;clear LCD USERCOMMAND "LCDSTR" ;STRING @ X,Y or Constant String USERCOMMAND "LCDCMD" ;cmd BYTE TO LCD USERCOMMAND "LCDDAT" ;DATA BYTE TO LCD ASM ;----[const String]--------------------------------------------------------------- LCDSTR?CCS macro Xin ,Yin,Cin IFNDEF TBLPTRL local TheString, OverStr ; define local labels so you can call macro multiple times goto OverStr ; goto over string stored in FLASH, so processor can't execute that TheString ;label to get address of your string da Cin, 0 ;add string to flash at TheString address and end string with 0 OverStr MOVE?CW TheString, _glcd_bigaddress MOVE?CB Xin , _POSX MOVE?CB Yin , _POSY L?CALL _GlcdUnpackStr ELSE local TheString, OverStr ; define local labels so you can call macro multiple times goto OverStr ; goto over string stored in FLASH, so processor can't execute that TheString ;label to get address of your string data Cin, 0 ;add string to flash at TheString address and end string with 0 OverStr movlw UPPER TheString movwf TBLPTRU movlw HIGH TheString movwf TBLPTRH movlw LOW TheString movwf TBLPTRL MOVE?CB Xin , _POSX MOVE?CB Yin , _POSY L?CALL GLCD_Cstr_out ENDIF endm ;----------------------Strings------------------------------------ LCDSTR?CBB macro Xin ,Yin ,Bin MOVE?CB Xin , _POSX MOVE?BB Yin , _POSY MOVE?CB high Bin, FSR1H ;load highbyte MOVE?CB low Bin, FSR1L ;load low byte L?CALL GLCD_str_out endm LCDSTR?CCB macro Xin ,Yin ,Bin MOVE?CB Xin , _POSX MOVE?CB Yin ,_POSY MOVE?CB high (Bin), FSR1H ;load highbyte MOVE?CB low (Bin), FSR1L ;load low byte L?CALL GLCD_str_out endm LCDSTR?BBB macro Xin ,Yin ,Bin MOVE?B Xin, _POSX MOVE?B Yin, _POSY MOVE?CB high Bin, FSR1H ;load highbyte MOVE?CB low Bin, FSR1L ;load low byte L?CALL GLCD_str_out endm LCDSTR?WBB macro Xin ,Yin ,Bin MOVE?WB Xin, _POSX MOVE?BB Yin, _POSY MOVE?CB high Bin, FSR1H ;load highbyte MOVE?CB low Bin, FSR1L ;load low byte L?CALL GLCD_str_out endm LCDSTR?WWB macro Xin ,Yin ,Bin MOVE?WB Xin, _POSX MOVE?WB Yin, _POSY MOVE?CB high Bin, FSR1H ;load highbyte MOVE?CB low Bin, FSR1L ;load low byte L?CALL GLCD_str_out endm LCDCMD?C macro Cin MOVE?CT 0,_LCD_DC MOVE?CB Cin , _lcdData L?CALL _lcd_byte endm LCDCMD?B macro Cin MOVE?CT 0,_LCD_DC MOVE?BB Cin , _lcdData L?CALL _lcd_byte endm LCDCMD?W macro Cin MOVE?CT 0,_LCD_DC MOVE?WB Cin , _lcdData L?CALL _lcd_byte endm LCDDAT?C macro Cin MOVE?CT 1,_LCD_DC MOVE?CB Cin , _lcdData L?CALL _lcd_byte endm LCDDAT?B macro Cin MOVE?CT 1,_LCD_DC MOVE?BB Cin , _lcdData L?CALL _lcd_byte endm LCDDAT?W macro Cin MOVE?CT 1,_LCD_DC MOVE?WB Cin , _lcdData L?CALL _lcd_byte endm LCDCLR? macro L?CALL _lcd_clr endm ;----------------------Character @ X,Y ------------------------------------ LCDC?BBB macro Xin ,Yin , Bin MOVE?BB Xin, _POSX MOVE?BB Yin, _POSY MOVE?BB Bin, _glcdCh L?CALL _gcga endm LCDC?WBB macro Xin ,Yin , Bin MOVE?WB Xin, _POSX MOVE?BB Yin, _POSY MOVE?BB Bin, _glcdCh L?CALL _gcga endm LCDC?WWB macro Xin ,Yin , Bin MOVE?WB Xin, _POSX MOVE?WB Yin, _POSY MOVE?BB Bin, _glcdCh L?CALL _gcga endm LCDC?BBC macro Xin ,Yin , Cin MOVE?BB Xin, _POSX MOVE?BB Yin, _POSY MOVE?CB Cin ,_glcdCh L?CALL _gcga endm LCDC?WBC macro Xin ,Yin , Cin MOVE?WB Xin, _POSX MOVE?BB Yin, _POSY MOVE?CB Cin ,_glcdCh L?CALL _gcga endm LCDC?CCC macro Xin ,Yin ,Cin MOVE?CB Xin , _POSX MOVE?CB Yin, _POSY MOVE?CB Cin, _glcdCh L?CALL _gcga endm LCDC?CCB macro Xin ,Yin ,Bin MOVE?CB Xin , _POSX MOVE?CB Yin, _POSY MOVE?BB Bin, _glcdCh L?CALL _gcga endm LCDC?B macro Bin MOVE?BB Bin, _glcdCh L?CALL _gcga endm GLetAddress macro Label, Wout CHK?RP Wout movlw low Label ; get low byte movwf Wout movlw High Label ; get high byte movwf Wout + 1 BANKSEL 0 endm IFDEF TBLPTRL GLCD_Cstr_out tblrd *+ movf TABLAT,w bz GLCD_exit_Cstr_out ; EXIT ON Null char CHK?RP _glcdCh MOVWF _glcdCh CHK?RP _glcd_bigaddress movff TBLPTRU,_glcd_bigaddress movff TBLPTRH,_glcd_bigaddress+1 movff TBLPTRL,_glcd_bigaddress+2 L?CALL _gcga CHK?RP _glcd_bigaddress movff _glcd_bigaddress ,TBLPTRU movff _glcd_bigaddress+1 ,TBLPTRH movff _glcd_bigaddress+2 ,TBLPTRL bra GLCD_Cstr_out GLCD_exit_Cstr_out BANKSEL 0 return GLCD_str_out movf POSTINC1, W ; Get a character bz GLCD_exit_strout ; EXIT ON Null char CHK?RP _glcdCh MOVWF _glcdCh BANKSEL 0 L?CALL _gcga bra GLCD_str_out GLCD_exit_strout BANKSEL 0 return ELSE GLCD_str_out IFDEF BSR MOVIW FSR1++ ; Get a character BTFSC STATUS,Z BRA GLCD_exit_strout ; EXIT ON Null char ELSE movf INDF, W ; Get a character BTFSC STATUS,Z GOTO GLCD_exit_strout ; EXIT ON Null char INCF FSR,F ENDIF CHK?RP _glcdCh MOVWF _glcdCh MOVE?BB FSR1L,_glcd_bigaddress MOVE?BB FSR1H,_glcd_bigaddress+1 BANKSEL 0 L?CALL _gcga MOVE?BB _glcd_bigaddress,FSR1L MOVE?BB _glcd_bigaddress+1,FSR1H GOTO GLCD_str_out GLCD_exit_strout BANKSEL 0 return ENDIF endasm glcd_bigaddress VAR BYTE[3] glcdCh var byte 'chr DATA lcdData VAR byte 'DATA glcdDC VAR BYTE 'gca var glcdFont var word 'font address glcdOffset VAR word 'font offset dsfbuff var byte[26] ctemp1 var word gl var byte glcdBc var byte POSY var byte 'gca pg address gy_ var byte 'gca pg address POSX var byte 'gca row address gx_ var byte 'gca row address ctemp var word glcdStrAddr var word ext bigtxt var bit inverted var bit @glcdStrAddr = _glcd_bigaddress GlcdUnpackStr: readcode glcdStrAddr,CTEMP glcd_bigaddress[2] = CTEMP&$7f ctemp=ctemp<<1 glcdCh = CTEMP.HIGHBYTE glcdStrAddr=glcdStrAddr+1 if glcdCh then gosub gcga glcdCh = glcd_bigaddress[2] else return endif if glcdCh then gosub gcga else return endif goto GlcdUnpackStr: return lcd_init: @ GLetAddress _font7x5,_glcdFont bigtxt = 0 inverted =0 #ifdef use_mssp SSP1CON1=$21 ;$22,21,20 all work @32mhz 20 is fastest SSP1STAT=$40 #endif LCD_CE=1 pause 30 Lcd_RST = 0 ' Reset LCD (HW reset) pause 1 Lcd_RST = 1 ' Release Reset ' lcd_dc=0 LCDCMD $21 ' LCD EXTENDED COMMANDS LCDCMD $c8 ' SET LCD Vop (CONTRAST) initial value $C8 = 200. LCDCMD $06 ' SET TEMP COEFFICIENT LCDCMD $13 ' LCD BIAS MODE LCDCMD $20 ' LCD STANDARD COMMANDS LCDCMD $08 ' LCD blank LCDCMD $0c ' LCD IN NORMAL MODE return lcd_clr: ' clear FOR gy_ =0 TO 5 FOR GX_=0 TO 83 LCDDAT 0 NEXT NEXT return lcd_byte: 'send command sequence "glcdData " LCD_CE=0 #ifdef use_mssp PIR1.3=0 SSP1BUF = LcdData WHILE !PIR1.3 : wend #else PAUSEUS 150 SHiftOUT LCD_DIN,LCD_CLK,1,[LcdData] #endif LCD_CE=1 return LCDxy: ;set LCD XY POSY = POSY MIN lcdheight POSX = POSX MIN lcdwidth LCDCMD POSY|$40 LCDCMD POSX|$80 return gcga: ;unpack font from flash and display it #ifdef PIC16 glcdOffset = (glcdch-32)*5/2 + glcdFont ; point to cga data #ELSE glcdOffset = (glcdch-32)*6 + glcdFont ; point to cga data #ENDIF gosub LCDxy #ifdef PIC16 ' ; COMMENT OUT THIS ASM SECTION IF CHIP HAS NO EEDAT REG ' ASM ' MOVE?CB high _dsfbuff, FSR1H ;load highbyte ' MOVE?CB low _dsfbuff, FSR1L ;load low byte ' MOVE?WW _glcdOffset,EEADRL ' MOVE?CB 3,_glcdDC 'nxtf ' BANKSEL EECON1 ' BSF EECON1, EEPGD ;Point to PROGRAM memory ' BSF EECON1, RD ;EE Read ' NOP ' NOP ' RLF EEDAT, W ' RLF EEDATH, W ' MOVE?AB _glcdBc ' BANKSEL EEDAT ' BCF EEDAT,7 ' MOVF EEDAT,W ' MOVWI FSR1++ ' MOVE?BA _glcdBc ' MOVWI FSR1++ ' BANKSEL EEADRL ' incf EEADRL,F ' btfsc STATUS,Z ' incf EEADRH,F ' BANKSEL _glcdDC ' DECFSZ _glcdDC,F ;dec count ' GOTO nxtf ' BANKSEL 0 ' ENDASM ; UNCOMMENT IF CHIP HAS NO EEDAT REG glcdBc=0 gosub getflash if !glcdch.0 then dsfbuff[glcdBc] = CTEMP.HIGHBYTE glcdBc=glcdBc+1 endif dsfbuff[glcdBc] = glcdDC glcdBc=glcdBc+1 gosub getflash dsfbuff[glcdBc] = CTEMP.HIGHBYTE glcdBc=glcdBc+1 dsfbuff[glcdBc] = glcdDC glcdBc=glcdBc+1 gosub getflash dsfbuff[glcdBc] = CTEMP.HIGHBYTE if glcdch.0 then glcdBc=glcdBc+1 dsfbuff[glcdBc] = glcdDC endif dsfbuff[5] = 0 #else for glcddc = 0 to 2 dsfbuff[glcddc*2] = CTEMP dsfbuff[glcddc*2+1] = CTEMP.HIGHBYTE glcdOffset = glcdOffset + 2 NEXT #endif if inverted then for glcddc = 5 to 0 STEP -1 dsfbuff[glcddc]=~dsfbuff[glcddc] next endif if bigtxt then ;create a big chr from a small one DSFBUFF[24] = POSX DSFBUFF[25] = POSy for glcddc = 5 to 0 STEP -1 ctemp = 0 ctemp1 = 3 gL = dsfbuff[glcddc] for glcdBc = 0 to 7 IF GL & 1 THEN ctemp = ctemp|ctemp1 ctemp1 = ctemp1<<2 GL = GL>>1 NEXT gL = glcddc*2 dsfbuff[GL] =ctemp.LOWBYTE dsfbuff[GL+1] =ctemp.LOWBYTE dsfbuff[GL+12]=ctemp.HIGHBYTE dsfbuff[GL+13]=ctemp.HIGHBYTE NEXT for glcddc = 0 to 11 LCDDAT dsfbuff[GLCDDC] NEXT POSY=POSY+1 POSX=DSFBUFF[24] gosub LCDxy for glcddc = 12 to 23 LCDDAT dsfbuff[GLCDDC] NEXT POSx = POSX + 12 IF POSX > 72 THEN POSX=0 ;wrap posy=DSFBUFF[25] else for glcddc = 0 to 5 LCDDAT dsfbuff[GLCDDC] NEXT POSx = POSX + 6 IF POSX > 78 THEN POSX=0 ;wrap endif RETURN getflash: readcode glcdOffset,CTEMP glcdDC= CTEMP&$7f ctemp = ctemp << 1 glcdOffset = glcdOffset + 1 return overglcd :
demo file
Code:'**************************************************************** '* Name : NOKIA_DEMO.PBP * '* Author : richard * '* Notice : * '* : * '* Date : 16/5/2018 * '* Version : mssp1 version with bigtxt ,inverse txt * '* Notes : used mikes compressed packed 5 byte font * '* :FOR pic 16F1847@32MHZ NOKIA * '**************************************************************** #CONFIG ; 16FF1847. __config _CONFIG1, _FOSC_INTOSC & _WDTE_ON & _PWRTE_ON & _MCLRE_ON & _CP_OFF & _BOREN_OFF __config _CONFIG2, _PLLEN_OFF & _LVP_OFF #ENDCONFIG define OSC 32 ; --- *** Oscillator *** --------------------------------------------------- OSCCON = %11110000 ;32 MHz, ANSELb = 0 ANSELA = 0 TRISA=%10010000 TRISB=%11101011 ;DEFINES FOR DISPLAY use font7x5_16.bas or font7x5_18.bas for pic18 #DEFINE PIC16 1 #define use_mssp 1 lcdheight con 5 ; 6 PAGES lcdwidth con 83 ; 84 PIXELS WIDE ' LCD_CLK var LATB.4 ' SCK1 pin needs to be set as dig o/p ' LCD_DIN var LATB.2 ' SDO1 pin needs to be set as dig o/p LCD_RST var LATA.4 LCD_DC var LATA.3 LCD_CE var LATA.6 LCD_LIGHT var LATA.0 BUFF VAR BYTE [16] char VAR BYTE Include "nokia_ds5.inc" ' bring it in include "font7x5_16_5.bas" '========================== MAIN Routine ============================== gosub lcd_init LCDCLR ARRAYWRITE BUFF,["READY",0] inverted=1 LCDSTR 5,2,BUFF PAUSE 1000 LCDCLR inverted=0 bigtxt = 1 LCDSTR 5,2,BUFF PAUSE 1000 LCDCLR bigtxt = 0 posx=0 posy=0 gosub LCDxy char=32 looper: lcdc char while posx char=char+1 if char>127 then char=32 lcdc char PAUSE 100 wend posy=posy+1 if posy>5 then posy=0 gosub LCDxy PAUSE 1000 endif GOTO LOOPER ' END
font
Code:'**************************************************************** '* Name : font7x5_16_5.BAS * '* Author : mike * '* Notice : * '* : * '* Date : * '* Version : 1.0 * '* Notes : * '* : * '**************************************************************** goto overfont font7x5: ;14BIT PACKED FORMAT [2X7BITS] CHR32-126 [SP TO ~ ] asm 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 overfont:





Bookmarks