'*********************************************************************
'Escribiendo números grandes en LCD de dos líneas
'en programación tradicional (subrutinas)
'Para placa PicEBasic, By COS, 18/05/2019, 03/16, 12/13, 12/11
'Basic Pic Simulator IDE (PSI), v7.41, Pic16F88
'*********************************************************************
'Se modifican los patrones
'Se hace los numeros proporcionales 2x3 digitos
'El espacio de separación entre digitos se minimisa
'Se simplifica la función de impresión de numeros grandes
'---------------------------------------------------------------------
'Define CONFIG = 0x2f70 'Fuses
'Define CONFIG2 = 0x3ffc
Define CLOCK_FREQUENCY = 8 'Oscilador a 8Mhz
Define SIMULATION_WAITMS_VALUE = 1 'Activar para simulación
'---------------------------------------------------------------------
'*********************************************************************
'Configuración de la placa entrenadora Pic EBasic
'LCD con linea de datos a 4 Bit sin Bit R/W
'Puerto serie RS232 a 38400baudios
'*********************************************************************
'Puerto del LCD ------------------------------------------------------
Define LCD_BITS = 4 'Bus de datos del lcd, a 4bit
Define LCD_DREG = PORTA 'Bus de datos, puerto A
Define LCD_DBIT = 0 'Bus datos 4, bit menos significativos del puerto
Define LCD_RSREG = PORTB 'Bit de control RS, puerto B
Define LCD_RSBIT = 7 'RB7 como RS
Define LCD_EREG = PORTB 'Bit de control E, puerto B
Define LCD_EBIT = 6 'RB6 como E
Define LCD_COMMANDUS = 2000 'Espera despues de cada comando
Define LCD_DATAUS = 100 'Espera despues de enviar un dato al LCD en uSeg.
Define LCD_INITMS = 50 'Espera inicialización del Display
'---------------------------------------------------------------------
Symbol ledv = RB0 'Etiqueta el led verde
Symbol leda = RA7 'Etiqueta el led amarillo
Symbol blcd = RB3 'Etiqueta el backlight del lcd
Symbol adc = RA4 'Etiqueta la entrada analogica de la R. ajustable
Symbol sw1 = RA6 'Etiqueta la tecla S1
Symbol sw2 = RA5 'Etiqueta la tecla S2
AllDigital 'ANSEL = 0x00 'Los pin I/O digitales
CMCON = 0x07 'Comparador a off
OSCCON = 0x7e 'Reloj interno a 8Mhz
TRISA = 0x00 'Puerto A como salidas
TRISB = 0x00 'Puerto B como salidas
TRISA.4 = 1 'Como entrada (RA4, adc)
TRISA.6 = 1 'Como entrada (RA6, tecla S1)
TRISA.5 = 1 'Como entrada (RA5, tecla S2)
TRISB.5 = 0 'Como salida(RB5,Tx RS232)
TRISB.2 = 1 'Como entrada (RB2, Rx RS232)
TRISB.4 = 1 'Como entrada (RHT03 inicio)
PORTB.3 = 1 'Luz lcd a ON (RB3)
PORTA.7 = 1 'Led amarillo a OFF
PORTB.0 = 1 'Led verde a OFF
PORTB.1 = 0 'LED RHT03 a OFF
'Hseropen 38400 'Inicializa puerto RS232 por hardware a 38400Baudios
Lcdinit 'Inicializa el LCD sin cursor
'---------------------------------------------------------------------
'Variables globales
Dim _word01(15) As Byte 'Declara cadena
Dim _xpos As Byte 'Posición a imprimir el digito
void_main:
Gosub _intstrngrandes 'Configura nuevos caracteres y los muestra
'Variables
Dim numero As Long
Dim main As Bit
numero = 0
While main = main 'Bucle principal
Gosub _nmrstr 'Convierte un número a cadena
_xpos = 1
Gosub _strngrandes 'Escribe números grandes
Lcdcmdout LcdLine2Pos(_xpos) 'Se escribirá en la línea dos en tal posición
Lcdout #numero 'Escribe el número en formato normal
numero = numero + 1 'Incrementa el número a imprimir
WaitMs 1000 'Pausa de un segundo
Wend
End
'*********************************************************************
'****************Subrutinas Números Grandes*******************************
'*********************************************************************
'Configura los patrones de bits en la CGRam del LCD y los muestra en el LCD
'Gosub _intstrngrandes 'Poner al principio
_intstrngrandes:
Lcddefchar 0, %11111, %11111, %11111, 0, 0, 0, 0, 0 'Barra horizontal superior.
Lcddefchar 1, 0, 0, 0, 0, 0, %11111, %11111, %11111 'Barra horizontal inferior.
Lcddefchar 2, %11111, %11111, %11111, 0, 0, 0, %11111, %11111 'Barras h. sup. e inf.
Lcddefchar 3, %11100, %11110, %11110, %11110, %11110, %11110, %11110, %11100 'Flecha derecha
Lcddefchar 4, %00111, %01111, %01111, %01111, %01111, %01111, %01111, %00111 'Flecha izq.
Lcddefchar 5, 0, 0, 0, 0, 0, %00011, %00111, %01111 'Terminación superior izquierda.
Lcddefchar 6, %00011, %00111, %01111, 0, 0, 0, 0, 0 'Terminación inferior izquierda.
Lcddefchar 7, 0, 0, 0, 0, 0, %11000, %11100, %11110 'Terminación inferior derecha.
Lcdcmdout LcdClear 'Se borra el LCD despues de guardar los chr
'Muestra los caracteres CGRam del LCD, números grandes
Lcdout "Patrones:"
Lcdcmdout LcdLine2Home
Lcdout 0, 1, 2, 3, 4, 5, 6, 7, 255 'Se imprimen los nuevos caracteres
WaitMs 3000 'Pausa de 3Seg
Lcdcmdout LcdClear 'Borrar el LCD
Return
'*********************************************************************
'Convierte un número tipo Long a cadena alfanumerica
'numero = número a convertir
'La transformación se guarda en el vector "_word01(indice)"
_nmrstr:
Dim _indice As Byte
_indice = 0
Dim _char As Byte
Dim _len As Byte
Dim _flag As Bit
Dim _nn As Byte
Dim _x As Byte
Dim _numero1 As Long
_len = 9 'Número máximo de digitos a convertir -1
_flag = 0 'Si =0 indica que son ceros a la izquierda, no se procesan
If numero = 0 Then 'Marca que se procese el cero a la izquierda y Exit
_flag = 1 'Se procesa el cero a la izquierda
_len = 0 'Fin de la transformación
Endif
_x = 1
While _x = 1 'Bucle de control
_numero1 = numero 'Se hace una imagen del número a transformar
For _nn = _len To 1 Step -1 'Selecciona el digito a extraer
_numero1 = _numero1 / 10
Next _nn
_char = _numero1 Mod 10 'Extrae el digito
If _char > 0 Then _flag = 1 'Marca procesar ceros
_char = _char + 48 'Pasa valor numérico a cadena, Acsii 48 = "0".
_word01(_indice) = _char 'Pointer(_indice) = _char 'Se asigna elemento a la cadena
If _flag = 1 Then _indice = _indice + 1 'Selecciona siguiente caracter de la cadena
'No hay más digitos
If _len = 0 Then _word01(_indice) = 0 'pointer(_indice) = 0 'Se asigna el cararcter fin de cadena a la cadena
If _len = 0 Then Return 'Exit
_len = _len - 1 'Cifra siguiente, hasta terminar
Wend
Return
'Subrutina que agranda los caracteres numéricos de una cadena
'Limitada a la longitud de la cadena, escrita para LCD de 2 líneas
'xpos: Posición de comienzo a imprimir en el LCD
'Gosub _strngrandes
'*********************************************************************
_strngrandes:
Dim _data As Byte 'Mascara del digito a dibujar
Dim _index As Byte 'Indice mascara
Dim _cdigito As Byte 'Contador caracteres de la cadena
Dim _bucle As Bit 'Control exit bucle linea
Dim _strchr As Byte 'Cotendrá el digito a dibujar
_bucle = True 'Bucle de control
_cdigito = 0 'Contador digitos
_strchr = _word01(_cdigito) 'Extrae el caracter a agrandar
While _bucle = True 'Bucle control
Lcdcmdout LcdLine1Pos(_xpos) 'Establece la posición inicial a escribir en el LCD
For _index = 0 To 5 'Bucle control de ipresión mascaras superior e inferior (digito grande)
If _strchr = "0" Then _data = LookUp(4, 0, 3, 4, 1, 3), _index 'Mascaras del 0
If _strchr = "1" Then _data = LookUp(6, 255, " ", 5, 255, 7), _index 'Mascaras del 1
If _strchr = "2" Then _data = LookUp(6, 2, 3, 4, 1, 7), _index 'Mascaras del chr 2
If _strchr = "3" Then _data = LookUp(6, 2, 3, 5, 1, 3), _index 'M. chr 3
If _strchr = "4" Then _data = LookUp(4, 1, 255, " ", " ", 255), _index 'M. chr 9
If _strchr = "5" Then _data = LookUp(4, 2, 0, 5, 1, 3), _index 'M. chr 5
If _strchr = "6" Then _data = LookUp(4, 2, " ", 4, 1, 3), _index 'M. chr 6
'If _strchr = "7" Then _data = LookUp(6, 0, 3, " ", 255, " "), _index 'M. chr 7
If _strchr = "7" Then _data = LookUp(6, 0, 255, " ", " ", 255), _index 'M. chr 7
If _strchr = "8" Then _data = LookUp(4, 2, 3, 4, 1, 3), _index 'M. chr 8
If _strchr = "9" Then _data = LookUp(4, 2, 3, " ", " ", 255), _index 'M. chr 9
Lcdout _data 'Imprime mascara actual
If _index = 2 Then 'Hace los cambios para dibujar la parte inferior del digito grande
Lcdcmdout LcdLine2Pos(_xpos) 'Establece posición en la linea 2
_xpos = _xpos + 3 'Posición del nuevo digito
Endif
Next _index
_cdigito = _cdigito + 1 'Indica la proxima posición a imprimir
_strchr = _word01(_cdigito) 'Extrae el caracter a agrandar
If _strchr = 0 Then _bucle = False 'Fin, se sale del bucle
Wend
Return
'**************************************************************************