TODOPIC
Microcontroladores PIC => Lenguaje Basic para microcontroladores PIC => Mensaje iniciado por: lager en 07 de Noviembre de 2004, 16:30:00
-
Bueno panas, despues de un largo proceso.... y de platicas, aqui esta el nuevo PPRINT, ahora se puede imprimir mayores letras(que no supere el alto de 33) asi que lo unico que tienn que hacer es copiar el siguiente codigo(ya que no se puede subir en el foro) SON 2 ARCHIVOS UNO LLAMADO"PPRINT.INC" Y OTRO LLAMADO "PPRINT_14I32.inc" PARA CADA UNO ESTA DELIMITADO POR LINEAS ------ Y DEBE SER GUARDADO CON ESE ".INC" AMBOS PARA QUE FUNCIONEN, UNA VES GENERADOS ESTOS ARCHIVOS, GUARDENLOS EN LA CARPETA INCLUDE (INC) DE PROTON NORMALMENTE UBICADA EN C: ARCHIVOS DE PROGRAMACROWNHILLINC . PARA HACER LOS ARCHIVOS, SOLO ABRAN EL BLOQ DE NOTAS , COPIEN EL CODIGO DELIMITADO PARA CADA ARCHIVO Y GUARDENLO COMO PPRINT.INC Y PPRINT_14I32.INC (CADA UNO CON SU CODIGO DELIMITADO POR LAS LINEAS -----)
AQUI LES DEJO NUEVAMETE UN EJEMPLO Y NOTEN QUE SE TIENE QUE AGREGAR TRES DEFINICIONES PARA PODER USARSE (dim GLCD_FLAG2 as byte system ,DIM OVERWRITEgMASKHHHH AS BYTE SYSTEM ,DIM PCHARgDATAHHHH AS BYTE SYSTEM )
INICIO DE Codigo para PPRINT.INC
---------------------------------------------------------------------------------------------------------
NOLIST
; Decide which version of PPRINT to load
if(_CORE == 14) ; Is it a 14-bit core device ?
ifdef INTERNAL@FONT ; Is the INTERNAL@FONT define on the PBP file ?
if(INTERNAL@FONT == 1) ; Do we need the internal font version ?
LIST
#include "PPRINT_14I32.INC" ; Yes. So load the internal font version of PPRINT for a 14-bit core device
NOLIST
else
LIST
#include "PPRINT_14E.INC" ; Otherwise load the external font version of PPRINT for a 14-bit core device
NOLIST
endif
else
LIST
#include "PPRINT_14I.INC" ; Load (by default) the internal font version of PPRINT for a 14-bit core device
NOLIST
endif
else ; Must be a 16-bit core device
ifdef INTERNAL@FONT ; Is the INTERNAL@FONT define on the PBP file ?
if(INTERNAL@FONT == 1) ; Do we need the internal font version ?
LIST
#include "PPRINT_16I.INC" ; Yes. So load the internal font version of PPRINT for a 16-bit core device
NOLIST
else
LIST
#include "PPRINT_16E.INC" ; Otherwise load the external font version of PPRINT for a 16-bit core device
NOLIST
endif
else
LIST
#include "PPRINT_16I.INC" ; Load (by default) the internal font version of PPRINT for a 16-bit core device
NOLIST
endif
endif
------------------------------------------------------------------------------------------------------
FIN DEL CODIGO PARA PPRINT:INC
INICIO DEL Codigo para PPRINT_14I32.INC
-------------------------------------------------------------------------------------------------------
NOLIST
; _PFONT_TBL#ADDRS ; Stores out the start of the lookup table for this font
; _PFONT_TBL#ADDRSH
; _PFONT_TBL#ADDRS
; _PFONT_TBL#ADDRSH
; _GLCD_YPOS ; The horizontal pixel Line
; _GLCD_XPOS ; The var used to indicate at what pixcel point on the hrz line you want to start printing from
; GEN ; Internal lcdwrite line
; _GLCD_YPOS#TEMP ; Used to store the current line printing is used to prevent re doing maths to work out control flags etc
; _PFONT#HT ; The number of pixels high font is
; _GLCD_FLAG ; Print control flags
#define P@INVERSE _GLCD_FLAG,0 ; Set when an invert print is required
#define P@XOR _GLCD_FLAG,1 ; Set when an XOR print is required
#define P@OR _GLCD_FLAG,2 ; Set when an OR print is required
#define PYLINE2@REQ _GLCD_FLAG,3 ; Flag to indicate second line is required
#define PYLINE3@REQ _GLCD_FLAG,4 ; Flag to indicate third line is required
#define PYLINE4@REQ _GLCD_FLAG,5 ; Flag to indicate forth line is required
#define TWO_BYTE@FONT _GLCD_FLAG,6 ; Flag to indicate font is 2 bytes tall
#define THREE_BYTE@FONT _GLCD_FLAG,7 ; Flag to indicate font is 3 bytes tall
#define FOUR_BYTEaFONT GLCD_FLAG2,0
#define PYLINE5aREQ GLCD_FLAG2,1
; _PSHIFT#LEFT ; Number of shifts required to move to bits to correct place
; _OVERWRITE#MASK ; Mask to define overwrite mask shape of char
; _OVERWRITE#MASKH
; _OVERWRITE#MASKHH
; _OVERWRITE#MASKHHH
; _PCHAR#DATA ; Var that holds the current data to lcdwrite out
; _PCHAR#DATAH
; _PCHAR#DATAHH
; _PCHAR#DATAHHH
; PP5 ; Temp var using pic variables
; PP6H ; Temp var using pic variables
; PP6 ; Number of x pixels that makes up font length
if((EEADR >> 8) != 0x01) ; Make sure the BANK arrangement is correct
error "This PICmicro is not suitable for PPRINT because the eeprom banks are different"
endif
; Requires the Character to be displayed in WREG
LIST
Movlw 255
Movwf _GLCD_YPOS#TEMP ; Force a re calc
set@page over@ext@pprint
Goto over@ext@pprint ; Jump over the PPRINT subroutines, because we are in the line of the program
NOLIST
;-----[READ FROM MEMORY A BYTE OF DATA]-------------------------
; Enter here to perform a pre-inc read
LIST
c@readpdata
Bsf STATUS,RP1 ; BANK 2
Incf EEADR,F ; Increment the address
Skpnz
Incf EEADRH,F
; Enter here to perform a normal read EEADR/EEADRH has to be pre-loaded
c@readpdata2
Bsf STATUS,RP0
Bsf STATUS,RP1 ; BANK 3
Bsf EECON1,EEPGD ; Instigate the read
Bsf EECON1,RD
Goto $ + 1 ; Waste 2 cycles
Bcf STATUS,RP0 ; Back down to BANK 2
Movfw EEDATA ; Get the low data into wreg
if($ > 2047)
set@page I@nt
endif
Goto I@nt
;----[Restore the WREG and exit routine]----------------------------------------------------
PPRINT@EXIT
Movfw PP3 ; Restore WREG
if($ > 2047)
set@page I@nt
endif
Goto I@nt ; Exit the routine
;----[PUT THE DATA CONTAINED IN _PCHAR#DATA ON THE LCD AND RETURN]-----
PPRINT@IT
Movfw _GLCD_XPOS
Movwf GENH
Movfw _PCHAR#DATA
if($ > 2047)
set@page GLCD@P
endif
Goto GLCD@P ; Return via GLCD@P
;----[ROUTINE TO PUT THE DATA ON THE SCREEN]--------------------
PPRINT@DAT:
if($ > 2047)
set@page PPRINT@EXIT
endif
Btfsc GEN,3 ; Are we within screen area?
Goto PPRINT@EXIT
Btfsc _GLCD_XPOS,7
Goto PPRINT@EXIT ; No
Movfw PP7 ; Save contents of PP7, because of interference with Display float
Movwf _PPRINT#TEMP3
Movfw _GLCD_XPOS
if($ > 2047)
set@page GLCD@G
endif
Call GLCD@G ; Read data from the LCD into PP5
Movwf PP5
Movfw _PPRINT#TEMP3 ; Restore contents of PP7
Movwf PP7
set@page PPRINT@DAT_L1
Btfss P@OR ; "OR" Required?
Goto PPRINT@DAT_L1
Iorwf _PCHAR#DATA,F
if($ > 2047)
set@page PPRINT@IT
endif
Goto PPRINT@IT
PPRINT@DAT_L1
set@page PPRINT@DAT_L2
Btfss P@XOR ; "XOR" Required?
Goto PPRINT@DAT_L2
Xorwf _PCHAR#DATA,F
if($ > 2047)
set@page PPRINT@IT
endif
Goto PPRINT@IT
PPRINT@DAT_L2
; Masking Required
Movfw PP6H
Andwf PP5,F
Movfw PP5
Iorwf _PCHAR#DATA,F
if($ > 2047)
set@page PPRINT@IT
endif
Goto PPRINT@IT
;----[START OF PPRINT SUBROUTINE]-----------------------------------------------------------
PRINT
if($ > 2047)
set@page setup@lcd
endif
Call setup@lcd ; Setup the LCD if it hasn"t been setup already
Movwf _PCHAR#DATA
Movwf PP3 ; Save contents of WREG
Movlw 32
Subwf _PCHAR#DATA,F ; Subtract the ASCII offset for the FONT table
; Calculate if we require the new PFONT shift values and how many lines to print
Movfw _GLCD_YPOS ; Have we calculated the info for this line already?
Subwf _GLCD_YPOS#TEMP,W
set@page OVER@PRINT_CALC
Btfsc STATUS,Z
; Goto P@STRT ; No so do the calcs
Goto OVER@PRINT_CALC ; Yes so just print
;P@STRT
Movlw 7 ; Work out how much to shift data
Andwf _GLCD_YPOS,W
Movwf _PSHIFT#LEFT
Movfw _PSHIFT#LEFT ; Calc the lines to print
Addwf _PFONT#HT,W
Movwf PP5
Movfw _GLCD_FLAG ; Clear the control flags
Andlw B"00000111" ; But leave the modifier flags alone
Movwf _GLCD_FLAG
bcf GLCD_FLAG2,0 ; clear the 4th line flag
bcf GLCD_FLAG2,1 ; clear the 4th line flag
Movlw 9
Subwf _PFONT#HT,W ; Is this > 8 pixels high
Btfsc STATUS,C
; Goto IFTHENEXIT@L1
Bsf TWO_BYTE@FONT ; Yes
;IFTHENEXIT@L1
Movlw 17 ; Is this > 16 pixels high
Subwf _PFONT#HT,W
Btfsc STATUS,C
; Goto IFTHENEXIT@L2
Bsf THREE_BYTE@FONT ; Yes
;IFTHENEXIT@L1A ; <<<<<<<<<<<<<<<<<<<<<<<
Movlw 25 ; Is this > 24 pixels high
Subwf _PFONT#HT,W
Btfsc STATUS,C
; Goto IFTHENEXIT@L2
Bsf FOUR_BYTEaFONT ; Yes
; <<<<<<<<<<<<<<<<<<<<<<<
;IFTHENEXIT@L2
Movlw 9 ; 2 Lines to be printed?
Subwf PP5,W
Btfsc STATUS,C
; Goto IFTHENEXIT@L3
Bsf PYLINE2@REQ ; Yes
;IFTHENEXIT@L3
Movlw 17 ; 3 Lines to be printed?
Subwf PP5,W
Btfsc STATUS,C
; Goto IFTHENEXIT@L4
Bsf PYLINE3@REQ ; Yes
;IFTHENEXIT@L4
Movlw 25 ; 4 Lines to be printed?
Subwf PP5,W
Btfsc STATUS,C
; Goto IFTHENEXIT@L5
Bsf PYLINE4@REQ ; Yes
;IFTHENEXIT@L5
Movlw 33 ; 5 Lines to be printed? <<<<<<<<<<<<<
Subwf PP5,W
Btfsc STATUS,C
; Goto IFTHENEXIT@L5
Bsf PYLINE5aREQ ; Yes <<<<<<<<<<<<<
;IFTHENEXIT@L5
Movfw _PFONT#HT ; Work out no rotates for masks
Sublw 40 ;<<<<<<<<<<<<<<<<<<<<<32
Movwf _PPRINT#TEMP2
Movlw 255
Movwf _OVERWRITE#MASK ; _OVERWRITE#MASK = $FFFFFFFFFF
Movwf _OVERWRITE#MASKH
Movwf _OVERWRITE#MASKHH
Movwf _OVERWRITE#MASKHHH
Movwf OVERWRITEgMASKHHHH ;<<<<<<<<<<<<<<<<<<<<<
Incf _PPRINT#TEMP2,F
RR_LOOP@L1 ; Rotate mask first right
Decf _PPRINT#TEMP2,F
set@page RREXIT@L1
Btfsc STATUS,Z
Goto RREXIT@L1
Clrc
Rrf OVERWRITEgMASKHHHH,F ;<<<<<<<<<<<<<<<<<<<<<
Rrf _OVERWRITE#MASKHHH,F
Rrf _OVERWRITE#MASKHH,F
Rrf _OVERWRITE#MASKH,F
Rrf _OVERWRITE#MASK,F
if($ > 2047)
set@page RR_LOOP@L1
endif
Goto RR_LOOP@L1
RREXIT@L1
Movfw _PSHIFT#LEFT
Movwf _PPRINT#TEMP2
Incf _PPRINT#TEMP2,F ; Then left
RL_LOOP@L1
Decf _PPRINT#TEMP2,F
set@page RLEXIT@L1
Btfsc STATUS,Z
Goto RLEXIT@L1
Clrc
Rlf _OVERWRITE#MASK,F
Rlf _OVERWRITE#MASKH,F
Rlf _OVERWRITE#MASKHH,F
Rlf _OVERWRITE#MASKHHH,F
Rlf OVERWRITEgMASKHHHH,F ;<<<<<<<<<<<<<<<<<<<
if($ > 2047)
set@page RL_LOOP@L1
endif
Goto RL_LOOP@L1
RLEXIT@L1
Comf _OVERWRITE#MASK,F ; LASTLY INVERT
Comf _OVERWRITE#MASKH,F
Comf _OVERWRITE#MASKHH,F
Comf _OVERWRITE#MASKHHH,F
Comf OVERWRITEgMASKHHHH,F ;<<<<<<<<<<<<<<<<<<<<
Movfw _GLCD_YPOS
Movwf _GLCD_YPOS#TEMP ; Make note for next time
OVER@PRINT_CALC
NOLIST
; Start of print routine
;---- Look up the address for the char no in pchar ----------
LIST
Movfw _PFONT_TBL#ADDRS
Bsf STATUS,RP1 ; Point to BANK 2
Movwf EEADR ; Load the Base Font address into the eread address regs
Bcf STATUS,RP1 ; Back to BANK0
Movfw _PFONT_TBL#ADDRSH
Bsf STATUS,RP1 ; Point to BANK 2
Movwf EEADRH
Bcf STATUS,RP1 ; Back to BANK0
Movfw _PCHAR#DATA ; TAKE the char_no
Bsf STATUS,RP1 ;
Addwf EEADR,F ; add that to the address held in the eread address regs
Skpnc
Incf EEADRH,F ; NOW POINT TO THE ADDRESS OF THE FONT CHAR
if($ > 2047)
set@page c@readpdata2
endif
Call c@readpdata2
Bsf STATUS,RP1 ; Back up to BANK 2
Movwf EEADR
Movfw EEDATH
Movwf EEADRH
Call c@readpdata2 ; Read in how many bytes per line make up the char
Movwf PP6 ; AND SAVE
; Main subroutine loop
MAIN_PPRINT@LOOP ; Loop for as many times as there are x pixels in font
; Get the bytes that make up char
Clrf PCHARgDATAHHHH ;<<<<<<<<<<<<<<<<<<<<<<
Clrf _PCHAR#DATAHHH ; Always clear these vars
Clrf _PCHAR#DATAHH
Clrf _PCHAR#DATAH
Clrf _PCHAR#DATA
if($ > 2047)
set@page c@readpdata
endif
Call c@readpdata ; Get the lower byte
Movwf _PCHAR#DATA ; Load first line
set@page PRINT_LOOP@L1
Btfss TWO_BYTE@FONT ; If font > 8 pixels load 2nd byte
Goto PRINT_LOOP@L1
if($ > 2047)
set@page c@readpdata
endif
Call c@readpdata
Movwf _PCHAR#DATAH ; Load second line
PRINT_LOOP@L1
set@page PRINT_LOOP@L1A
Btfss THREE_BYTE@FONT ; If font > 16 pixels load 3rd byte
Goto PRINT_LOOP@L1A
if($ > 2047)
set@page c@readpdata
endif
Call c@readpdata
Movwf _PCHAR#DATAHH ; Load third line
PRINT_LOOP@L1A
set@page PRINT_LOOP@L2
Btfss FOUR_BYTEaFONT ; If font > 24 pixels load 4th byte <<<<<<<<
Goto PRINT_LOOP@L2
if($ > 2047)
set@page c@readpdata
endif
Call c@readpdata
Movwf _PCHAR#DATAHHH ; Load Forth line <<<<<<<<<<<<<<<<
PRINT_LOOP@L2
; Shift the data into place
Movfw _PSHIFT#LEFT
Movwf _PPRINT#TEMP2 ; We need to shift the data into the correct place
Incf _PPRINT#TEMP2,F
RL_LOOP@L2
set@page RLEXIT@L2
Decf _PPRINT#TEMP2,F
Btfsc STATUS,Z
Goto RLEXIT@L2
Clrc
Rlf _PCHAR#DATA,F
Rlf _PCHAR#DATAH,F
Rlf _PCHAR#DATAHH,F
Rlf _PCHAR#DATAHHH,F
Rlf PCHARgDATAHHHH,F ;<<<<<<<<<<<<<<<
if($ > 2047)
set@page RL_LOOP@L2
endif
Goto RL_LOOP@L2
Movfw _PSHIFT#LEFT
Incf _PPRINT#TEMP2,F
if($ > 2047)
set@page RL_LOOP@L2
endif
Goto RL_LOOP@L2
RLEXIT@L2
Btfss P@INVERSE ; If invert required make mask and xor with data
Goto PRINT_LOOP@L3
Comf _OVERWRITE#MASK,W
Xorwf _PCHAR#DATA,F
Comf _OVERWRITE#MASKH,W
Xorwf _PCHAR#DATAH,F
Comf _OVERWRITE#MASKHH,W
Xorwf _PCHAR#DATAHH,F
Comf _OVERWRITE#MASKHHH,W
Xorwf _PCHAR#DATAHHH,F
Comf OVERWRITEgMASKHHHH,W ;<<<<<<<<<<<<<<<<
Xorwf PCHARgDATAHHHH,F ;<<<<<<<<<<<<<<<<
PRINT_LOOP@L3
Clrc ; Work out the lcdwrite line to start printing
Rrf _GLCD_YPOS,W
Movwf GEN
Clrc
Rrf GEN,F
Clrc
Rrf GEN,F
;Byte_byte _PCHAR#DATA, _PCHAR#DATA ; Print the first line
Movfw _OVERWRITE#MASK
Movwf PP6H
if($ > 2047)
set@page PPRINT@DAT
endif
Call PPRINT@DAT
set@page PRINT_LOOP@L4
Btfss PYLINE2@REQ ; Do we need to print to the next line?
Goto PRINT_LOOP@L4
Incf GEN,F ; Yes so move down a line
Movfw _PCHAR#DATAH
Movwf _PCHAR#DATA ; Get the data to print
Movfw _OVERWRITE#MASKH
Movwf PP6H
if($ > 2047)
set@page PPRINT@DAT
endif
Call PPRINT@DAT ; Put the data down
PRINT_LOOP@L4
set@page PRINT_LOOP@L5
Btfss PYLINE3@REQ ; Do we need to print to the next line?
Goto PRINT_LOOP@L5
Incf GEN,F ; Yes so move down a line
Movfw _PCHAR#DATAHH
Movwf _PCHAR#DATA ; Get the data to print
Movfw _OVERWRITE#MASKHH
Movwf PP6H
if($ > 2047)
set@page PPRINT@DAT
endif
Call PPRINT@DAT ; Put the data down
PRINT_LOOP@L5
set@page PRINT_LOOP@L5A
Btfss PYLINE4@REQ ; Do we need to print to the next line?
Goto PRINT_LOOP@L5A
Incf GEN,F ; Yes so move down a line
Movfw _PCHAR#DATAHHH
Movwf _PCHAR#DATA ; Get the data to print
Movfw _OVERWRITE#MASKHHH
Movwf PP6H
if($ > 2047)
set@page PPRINT@DAT
endif
Call PPRINT@DAT ; Put the data down
PRINT_LOOP@L5A ;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
set@page PRINT_LOOP@L6
Btfss PYLINE5aREQ ; Do we need to print to the next line?
Goto PRINT_LOOP@L6
Incf GEN,F ; Yes so move down a line
Movfw PCHARgDATAHHHH
Movwf _PCHAR#DATA ; Get the data to print
Movfw OVERWRITEgMASKHHHH
Movwf PP6H
if($ > 2047)
set@page PPRINT@DAT
endif
Call PPRINT@DAT ; Put the data down
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
PRINT_LOOP@L6
Incf _GLCD_XPOS,F ; Move to the next X pixel
if($ > 2047)
set@page MAIN_PPRINT@LOOP
endif
Decfsz PP6,F
Goto MAIN_PPRINT@LOOP ; Loop until all X pixels printed
if($ > 2047)
set@page PPRINT@EXIT
endif
Goto PPRINT@EXIT
NOLIST
;-----[READ THE FONT HEIGHT]------------------------------------
LIST
SET@FONT
Movfw _PFONT_TBL#ADDRS
Bsf STATUS,RP1 ; Point to BANK 2
Movwf EEADR ; Load the address in
Bcf STATUS,RP1 ; Point back to BANK 0
Movfw _PFONT_TBL#ADDRSH
Bsf STATUS,RP1 ; Point to BANK 2
Movwf EEADRH
set@page c@readpdata2
Call c@readpdata2 ; Read the font height
Movwf _PFONT#HT ; And save it
Incf _PFONT_TBL#ADDRS,F ; Up the address 2
Skpnz
Incf _PFONT_TBL#ADDRSH,F
Movlw 255
Movwf _GLCD_YPOS#TEMP ; Force a re calc
if($ > 2047)
set@page I@nt
endif
Goto I@nt
over@ext@pprint
--------------------------------------------------------------------------------------------------------
FIN DL CODIGO PARA PPRINT_14I32.INC
EJEMPLO:
device 16f877
dim GLCD_FLAG2 as byte system "AGREGAR ESTAS VARIABLES DE SISTEMA
DIM OVERWRITEgMASKHHHH AS BYTE SYSTEM "NUEVA V.S
DIM PCHARgDATAHHHH AS BYTE SYSTEM "NUEVA V.S
xtal 4
DECLARE LCD_TYPE 1
DECLARE LCD_DTPORT PORTD
DECLARE LCD_RWPIN PORTC.0
DECLARE LCD_CS1PIN PORTE.1
DECLARE LCD_CS2PIN PORTE.2
DECLARE LCD_RSPIN PORTC.1
DECLARE LCD_ENPIN PORTE.0
DECLARE GLCD_CS_INVERT OFF
DECLARE INTERNAL_FONT ON
GLCD_EXTERNAL_PRINT=PPRINT
PRINT FONT MS_Sans_Serif24
all_digital true
X:cls
PRINT "TODOPIC"
delayms 2000
GOTO X
include "MS_Sans_Serif24.fnt"
--------------------------------------------------------------------------------------------------------
NOTA:NO INCLUYO EL CODIGO DE "MS_Sans_Serif24.fnt" YA QUE ES EXTENSO Y ES GENERADO AUTOMATICAMENTE POR EL GENERADOR TODOPIC.
En cuanto tenga el PPRINT final para letras extra gandes lo subo tambien
Salu2 panas
-
Pana Khasistos, Gracias por la Observacion del codigo ERRONEO, ya lo correji , En un Rato subo el NUEVO codigo para letras del tamaño de la pantall, jajajajaja.
Un abraso pana
-
HOLA PANA
Me parece que las gracias estan de mas ....yo solo probe en lo que estoy mas o menos practico ,pero la genialidad la posteaste tu ,solo soy un OMEGA TESTER no llego si quiera a ello...JA JA JA.GRACIAS a vos por todo tu empeño en el desarrolo,Y ya ven para los que se "comen" las cosas como hay GENTE que sus horas y neuronas las postean ESTO ES UN EJEMPLO A SEGUIR.....FELICITACIONES Y GRACIAS POR TODOS...
saludos
Khasistos
-
HOLA .
Solo te ahorro el trabajo ..CAMBIEN SOLO EL 14I32.INC EL PPRINT DEJENLO COMO ESTA .....TODO ESTO COMO SIEMPRE EN UNA CARPETA .INC DENTRO DE LA CARPETA INC del Proton....
FUNCIONA PERFECTO CON LETRAS DE 4 BITS DE ALTO (NO CONFUNDIR) 33 DE TAMAÑO MAXIMO EN LA PRACTICA ESO SE VE CUANDO SE GENERA LA LETRA EN EL CODIGO DICE WORD=XX NO ES EL TAMAÑO DE LA LETRA QUE ELIGAN ...POR EJEMPLO UNA ARIAL DE 18 GENERA UN WORD=23 ese es el tamaño que hay que tener en cuenta......por ahora ......ya va a llegar la pantalla completa .......
NOLIST
; _PFONT_TBL#ADDRS ; Stores out the start of the lookup table for this font
; _PFONT_TBL#ADDRSH
; _PFONT_TBL#ADDRS
; _PFONT_TBL#ADDRSH
; _GLCD_YPOS ; The horizontal pixel Line
; _GLCD_XPOS ; The var used to indicate at what pixcel point on the hrz line you want to start printing from
; GEN ; Internal lcdwrite line
; _GLCD_YPOS#TEMP ; Used to store the current line printing is used to prevent re doing maths to work out control flags etc
; _PFONT#HT ; The number of pixels high font is
; _GLCD_FLAG ; Print control flags
#define P@INVERSE _GLCD_FLAG,0 ; Set when an invert print is required
#define P@XOR _GLCD_FLAG,1 ; Set when an XOR print is required
#define P@OR _GLCD_FLAG,2 ; Set when an OR print is required
#define PYLINE2@REQ _GLCD_FLAG,3 ; Flag to indicate second line is required
#define PYLINE3@REQ _GLCD_FLAG,4 ; Flag to indicate third line is required
#define PYLINE4@REQ _GLCD_FLAG,5 ; Flag to indicate forth line is required
#define TWO_BYTE@FONT _GLCD_FLAG,6 ; Flag to indicate font is 2 bytes tall
#define THREE_BYTE@FONT _GLCD_FLAG,7 ; Flag to indicate font is 3 bytes tall
#define FOUR_BYTEaFONT GLCD_FLAG2,0
#define PYLINE5aREQ GLCD_FLAG2,1
; _PSHIFT#LEFT ; Number of shifts required to move to bits to correct place
; _OVERWRITE#MASK ; Mask to define overwrite mask shape of char
; _OVERWRITE#MASKH
; _OVERWRITE#MASKHH
; _OVERWRITE#MASKHHH
; _PCHAR#DATA ; Var that holds the current data to lcdwrite out
; _PCHAR#DATAH
; _PCHAR#DATAHH
; _PCHAR#DATAHHH
; PP5 ; Temp var using pic variables
; PP6H ; Temp var using pic variables
; PP6 ; Number of x pixels that makes up font length
if((EEADR >> 8) != 0x01) ; Make sure the BANK arrangement is correct
error "This PICmicro is not suitable for PPRINT because the eeprom banks are different"
endif
; Requires the Character to be displayed in WREG
LIST
Movlw 255
Movwf _GLCD_YPOS#TEMP ; Force a re calc
set@page over@ext@pprint
Goto over@ext@pprint ; Jump over the PPRINT subroutines, because we are in the line of the program
NOLIST
;-----[READ FROM MEMORY A BYTE OF DATA]-------------------------
; Enter here to perform a pre-inc read
LIST
c@readpdata
Bsf STATUS,RP1 ; BANK 2
Incf EEADR,F ; Increment the address
Skpnz
Incf EEADRH,F
; Enter here to perform a normal read EEADR/EEADRH has to be pre-loaded
c@readpdata2
Bsf STATUS,RP0
Bsf STATUS,RP1 ; BANK 3
Bsf EECON1,EEPGD ; Instigate the read
Bsf EECON1,RD
Goto $ + 1 ; Waste 2 cycles
Bcf STATUS,RP0 ; Back down to BANK 2
Movfw EEDATA ; Get the low data into wreg
if($ > 2047)
set@page I@nt
endif
Goto I@nt
;----[Restore the WREG and exit routine]----------------------------------------------------
PPRINT@EXIT
Movfw PP3 ; Restore WREG
if($ > 2047)
set@page I@nt
endif
Goto I@nt ; Exit the routine
;----[PUT THE DATA CONTAINED IN _PCHAR#DATA ON THE LCD AND RETURN]-----
PPRINT@IT
Movfw _GLCD_XPOS
Movwf GENH
Movfw _PCHAR#DATA
if($ > 2047)
set@page GLCD@P
endif
Goto GLCD@P ; Return via GLCD@P
;----[ROUTINE TO PUT THE DATA ON THE SCREEN]--------------------
PPRINT@DAT:
if($ > 2047)
set@page PPRINT@EXIT
endif
Btfsc GEN,3 ; Are we within screen area?
Goto PPRINT@EXIT
Btfsc _GLCD_XPOS,7
Goto PPRINT@EXIT ; No
Movfw PP7 ; Save contents of PP7, because of interference with Display float
Movwf _PPRINT#TEMP3
Movfw _GLCD_XPOS
if($ > 2047)
set@page GLCD@G
endif
Call GLCD@G ; Read data from the LCD into PP5
Movwf PP5
Movfw _PPRINT#TEMP3 ; Restore contents of PP7
Movwf PP7
set@page PPRINT@DAT_L1
Btfss P@OR ; "OR" Required?
Goto PPRINT@DAT_L1
Iorwf _PCHAR#DATA,F
if($ > 2047)
set@page PPRINT@IT
endif
Goto PPRINT@IT
PPRINT@DAT_L1
set@page PPRINT@DAT_L2
Btfss P@XOR ; "XOR" Required?
Goto PPRINT@DAT_L2
Xorwf _PCHAR#DATA,F
if($ > 2047)
set@page PPRINT@IT
endif
Goto PPRINT@IT
PPRINT@DAT_L2
; Masking Required
Movfw PP6H
Andwf PP5,F
Movfw PP5
Iorwf _PCHAR#DATA,F
if($ > 2047)
set@page PPRINT@IT
endif
Goto PPRINT@IT
;----[START OF PPRINT SUBROUTINE]-----------------------------------------------------------
PRINT
if($ > 2047)
set@page setup@lcd
endif
Call setup@lcd ; Setup the LCD if it hasn"t been setup already
Movwf _PCHAR#DATA
Movwf PP3 ; Save contents of WREG
Movlw 32
Subwf _PCHAR#DATA,F ; Subtract the ASCII offset for the FONT table
; Calculate if we require the new PFONT shift values and how many lines to print
Movfw _GLCD_YPOS ; Have we calculated the info for this line already?
Subwf _GLCD_YPOS#TEMP,W
set@page OVER@PRINT_CALC
Btfsc STATUS,Z
; Goto P@STRT ; No so do the calcs
Goto OVER@PRINT_CALC ; Yes so just print
;P@STRT
Movlw 7 ; Work out how much to shift data
Andwf _GLCD_YPOS,W
Movwf _PSHIFT#LEFT
Movfw _PSHIFT#LEFT ; Calc the lines to print
Addwf _PFONT#HT,W
Movwf PP5
Movfw _GLCD_FLAG ; Clear the control flags
Andlw B"00000111" ; But leave the modifier flags alone
Movwf _GLCD_FLAG
bcf GLCD_FLAG2,0 ; clear the 4th line flag
bcf GLCD_FLAG2,1 ; clear the 4th line flag
Movlw 9
Subwf _PFONT#HT,W ; Is this > 8 pixels high
Btfsc STATUS,C
; Goto IFTHENEXIT@L1
Bsf TWO_BYTE@FONT ; Yes
;IFTHENEXIT@L1
Movlw 17 ; Is this > 16 pixels high
Subwf _PFONT#HT,W
Btfsc STATUS,C
; Goto IFTHENEXIT@L2
Bsf THREE_BYTE@FONT ; Yes
;IFTHENEXIT@L1A ; <<<<<<<<<<<<<<<<<<<<<<<
Movlw 25 ; Is this > 24 pixels high
Subwf _PFONT#HT,W
Btfsc STATUS,C
; Goto IFTHENEXIT@L2
Bsf FOUR_BYTEaFONT ; Yes
; <<<<<<<<<<<<<<<<<<<<<<<
;IFTHENEXIT@L2
Movlw 9 ; 2 Lines to be printed?
Subwf PP5,W
Btfsc STATUS,C
; Goto IFTHENEXIT@L3
Bsf PYLINE2@REQ ; Yes
;IFTHENEXIT@L3
Movlw 17 ; 3 Lines to be printed?
Subwf PP5,W
Btfsc STATUS,C
; Goto IFTHENEXIT@L4
Bsf PYLINE3@REQ ; Yes
;IFTHENEXIT@L4
Movlw 25 ; 4 Lines to be printed?
Subwf PP5,W
Btfsc STATUS,C
; Goto IFTHENEXIT@L5
Bsf PYLINE4@REQ ; Yes
;IFTHENEXIT@L5
Movlw 33 ; 5 Lines to be printed? <<<<<<<<<<<<<
Subwf PP5,W
Btfsc STATUS,C
; Goto IFTHENEXIT@L5
Bsf PYLINE5aREQ ; Yes <<<<<<<<<<<<<
;IFTHENEXIT@L5
Movfw _PFONT#HT ; Work out no rotates for masks
Sublw 40 ;<<<<<<<<<<<<<<<<<<<<<32
Movwf _PPRINT#TEMP2
Movlw 255
Movwf _OVERWRITE#MASK ; _OVERWRITE#MASK = $FFFFFFFFFF
Movwf _OVERWRITE#MASKH
Movwf _OVERWRITE#MASKHH
Movwf _OVERWRITE#MASKHHH
Movwf OVERWRITEgMASKHHHH ;<<<<<<<<<<<<<<<<<<<<<
Incf _PPRINT#TEMP2,F
RR_LOOP@L1 ; Rotate mask first right
Decf _PPRINT#TEMP2,F
set@page RREXIT@L1
Btfsc STATUS,Z
Goto RREXIT@L1
Clrc
Rrf OVERWRITEgMASKHHHH,F ;<<<<<<<<<<<<<<<<<<<<<
Rrf _OVERWRITE#MASKHHH,F
Rrf _OVERWRITE#MASKHH,F
Rrf _OVERWRITE#MASKH,F
Rrf _OVERWRITE#MASK,F
if($ > 2047)
set@page RR_LOOP@L1
endif
Goto RR_LOOP@L1
RREXIT@L1
Movfw _PSHIFT#LEFT
Movwf _PPRINT#TEMP2
Incf _PPRINT#TEMP2,F ; Then left
RL_LOOP@L1
Decf _PPRINT#TEMP2,F
set@page RLEXIT@L1
Btfsc STATUS,Z
Goto RLEXIT@L1
Clrc
Rlf _OVERWRITE#MASK,F
Rlf _OVERWRITE#MASKH,F
Rlf _OVERWRITE#MASKHH,F
Rlf _OVERWRITE#MASKHHH,F
Rlf OVERWRITEgMASKHHHH,F ;<<<<<<<<<<<<<<<<<<<
if($ > 2047)
set@page RL_LOOP@L1
endif
Goto RL_LOOP@L1
RLEXIT@L1
Comf _OVERWRITE#MASK,F ; LASTLY INVERT
Comf _OVERWRITE#MASKH,F
Comf _OVERWRITE#MASKHH,F
Comf _OVERWRITE#MASKHHH,F
Comf OVERWRITEgMASKHHHH,F ;<<<<<<<<<<<<<<<<<<<<
Movfw _GLCD_YPOS
Movwf _GLCD_YPOS#TEMP ; Make note for next time
OVER@PRINT_CALC
NOLIST
; Start of print routine
;---- Look up the address for the char no in pchar ----------
LIST
Movfw _PFONT_TBL#ADDRS
Bsf STATUS,RP1 ; Point to BANK 2
Movwf EEADR ; Load the Base Font address into the eread address regs
Bcf STATUS,RP1 ; Back to BANK0
Movfw _PFONT_TBL#ADDRSH
Bsf STATUS,RP1 ; Point to BANK 2
Movwf EEADRH
Bcf STATUS,RP1 ; Back to BANK0
Movfw _PCHAR#DATA ; TAKE the char_no
Bsf STATUS,RP1 ;
Addwf EEADR,F ; add that to the address held in the eread address regs
Skpnc
Incf EEADRH,F ; NOW POINT TO THE ADDRESS OF THE FONT CHAR
if($ > 2047)
set@page c@readpdata2
endif
Call c@readpdata2
Bsf STATUS,RP1 ; Back up to BANK 2
Movwf EEADR
Movfw EEDATH
Movwf EEADRH
Call c@readpdata2 ; Read in how many bytes per line make up the char
Movwf PP6 ; AND SAVE
; Main subroutine loop
MAIN_PPRINT@LOOP ; Loop for as many times as there are x pixels in font
; Get the bytes that make up char
Clrf PCHARgDATAHHHH ;<<<<<<<<<<<<<<<<<<<<<<
Clrf _PCHAR#DATAHHH ; Always clear these vars
Clrf _PCHAR#DATAHH
Clrf _PCHAR#DATAH
Clrf _PCHAR#DATA
if($ > 2047)
set@page c@readpdata
endif
Call c@readpdata ; Get the lower byte
Movwf _PCHAR#DATA ; Load first line
set@page PRINT_LOOP@L1
Btfss TWO_BYTE@FONT ; If font > 8 pixels load 2nd byte
Goto PRINT_LOOP@L1
if($ > 2047)
set@page c@readpdata
endif
Call c@readpdata
Movwf _PCHAR#DATAH ; Load second line
PRINT_LOOP@L1
set@page PRINT_LOOP@L1A
Btfss THREE_BYTE@FONT ; If font > 16 pixels load 3rd byte
Goto PRINT_LOOP@L1A
if($ > 2047)
set@page c@readpdata
endif
Call c@readpdata
Movwf _PCHAR#DATAHH ; Load third line
PRINT_LOOP@L1A
set@page PRINT_LOOP@L2
Btfss FOUR_BYTEaFONT ; If font > 24 pixels load 4th byte <<<<<<<<
Goto PRINT_LOOP@L2
if($ > 2047)
set@page c@readpdata
endif
Call c@readpdata
Movwf _PCHAR#DATAHHH ; Load Forth line <<<<<<<<<<<<<<<<
PRINT_LOOP@L2
; Shift the data into place
Movfw _PSHIFT#LEFT
Movwf _PPRINT#TEMP2 ; We need to shift the data into the correct place
Incf _PPRINT#TEMP2,F
RL_LOOP@L2
set@page RLEXIT@L2
Decf _PPRINT#TEMP2,F
Btfsc STATUS,Z
Goto RLEXIT@L2
Clrc
Rlf _PCHAR#DATA,F
Rlf _PCHAR#DATAH,F
Rlf _PCHAR#DATAHH,F
Rlf _PCHAR#DATAHHH,F
Rlf PCHARgDATAHHHH,F ;<<<<<<<<<<<<<<<
if($ > 2047)
set@page RL_LOOP@L2
endif
Goto RL_LOOP@L2
Movfw _PSHIFT#LEFT
Incf _PPRINT#TEMP2,F
if($ > 2047)
set@page RL_LOOP@L2
endif
Goto RL_LOOP@L2
RLEXIT@L2
Btfss P@INVERSE ; If invert required make mask and xor with data
Goto PRINT_LOOP@L3
Comf _OVERWRITE#MASK,W
Xorwf _PCHAR#DATA,F
Comf _OVERWRITE#MASKH,W
Xorwf _PCHAR#DATAH,F
Comf _OVERWRITE#MASKHH,W
Xorwf _PCHAR#DATAHH,F
Comf _OVERWRITE#MASKHHH,W
Xorwf _PCHAR#DATAHHH,F
Comf OVERWRITEgMASKHHHH,W ;<<<<<<<<<<<<<<<<
Xorwf PCHARgDATAHHHH,F ;<<<<<<<<<<<<<<<<
PRINT_LOOP@L3
Clrc ; Work out the lcdwrite line to start printing
Rrf _GLCD_YPOS,W
Movwf GEN
Clrc
Rrf GEN,F
Clrc
Rrf GEN,F
;Byte_byte _PCHAR#DATA, _PCHAR#DATA ; Print the first line
Movfw _OVERWRITE#MASK
Movwf PP6H
if($ > 2047)
set@page PPRINT@DAT
endif
Call PPRINT@DAT
set@page PRINT_LOOP@L4
Btfss PYLINE2@REQ ; Do we need to print to the next line?
Goto PRINT_LOOP@L4
Incf GEN,F ; Yes so move down a line
Movfw _PCHAR#DATAH
Movwf _PCHAR#DATA ; Get the data to print
Movfw _OVERWRITE#MASKH
Movwf PP6H
if($ > 2047)
set@page PPRINT@DAT
endif
Call PPRINT@DAT ; Put the data down
PRINT_LOOP@L4
set@page PRINT_LOOP@L5
Btfss PYLINE3@REQ ; Do we need to print to the next line?
Goto PRINT_LOOP@L5
Incf GEN,F ; Yes so move down a line
Movfw _PCHAR#DATAHH
Movwf _PCHAR#DATA ; Get the data to print
Movfw _OVERWRITE#MASKHH
Movwf PP6H
if($ > 2047)
set@page PPRINT@DAT
endif
Call PPRINT@DAT ; Put the data down
PRINT_LOOP@L5
set@page PRINT_LOOP@L5A
Btfss PYLINE4@REQ ; Do we need to print to the next line?
Goto PRINT_LOOP@L5A
Incf GEN,F ; Yes so move down a line
Movfw _PCHAR#DATAHHH
Movwf _PCHAR#DATA ; Get the data to print
Movfw _OVERWRITE#MASKHHH
Movwf PP6H
if($ > 2047)
set@page PPRINT@DAT
endif
Call PPRINT@DAT ; Put the data down
PRINT_LOOP@L5A ;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
set@page PRINT_LOOP@L6
Btfss PYLINE5aREQ ; Do we need to print to the next line?
Goto PRINT_LOOP@L6
Incf GEN,F ; Yes so move down a line
Movfw PCHARgDATAHHHH
Movwf _PCHAR#DATA ; Get the data to print
Movfw OVERWRITEgMASKHHHH
Movwf PP6H
if($ > 2047)
set@page PPRINT@DAT
endif
Call PPRINT@DAT ; Put the data down
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
PRINT_LOOP@L6
Incf _GLCD_XPOS,F ; Move to the next X pixel
if($ > 2047)
set@page MAIN_PPRINT@LOOP
endif
Decfsz PP6,F
Goto MAIN_PPRINT@LOOP ; Loop until all X pixels printed
if($ > 2047)
set@page PPRINT@EXIT
endif
Goto PPRINT@EXIT
NOLIST
;-----[READ THE FONT HEIGHT]------------------------------------
LIST
SET@FONT
Movfw _PFONT_TBL#ADDRS
Bsf STATUS,RP1 ; Point to BANK 2
Movwf EEADR ; Load the address in
Bcf STATUS,RP1 ; Point back to BANK 0
Movfw _PFONT_TBL#ADDRSH
Bsf STATUS,RP1 ; Point to BANK 2
Movwf EEADRH
set@page c@readpdata2
Call c@readpdata2 ; Read the font height
Movwf _PFONT#HT ; And save it
Incf _PFONT_TBL#ADDRS,F ; Up the address 2
Skpnz
Incf _PFONT_TBL#ADDRSH,F
Movlw 255
Movwf _GLCD_YPOS#TEMP ; Force a re calc
if($ > 2047)
set@page I@nt
endif
Goto I@nt
over@ext@pprint
-
Gracias pana, solo comento que el codigo no lo hice yo, yo solo postee la modificacion que Tim (su creador) a estado modificando bajo las necesidades de letras mas grandes, pronto Posteara el nuevo y Final PPRInt para modelos de 14 y 16 bit(ya que como bien tu te diste cuenta pana Khasistos solo es para 14 bits )s, ya probados, y listos para usarse. En cuanto esten bien chekados los subo para que puedan usarlos junto con el TODOPIC generador. Ahora si es Facil pasar Graficos y Letras de CUALQUIER TAMAÑO y sin necesidad de editores ni agentes externos ni calculos que quitan tiempo en el desarrollo de un buen programa y sobre todo sin generar tanto codigo no necesario.
Salu2 panas