GeSHi (freebasic):'***PARA SIMULACION, PIC16F877'IMPRIMIR UNA VARIABLE LONG EN EL LCDDefine ADC_CLOCK = 3 'default value is 3Define ADC_SAMPLEUS = 10 'default value is 20Define LCD_BITS = 8 'allowed values are 4 and 8 - the number of data interface linesDefine LCD_DREG = PORTBDefine LCD_DBIT = 0 '0 or 4 for 4-bit interface, ignored for 8-bit interfaceDefine LCD_RSREG = PORTDDefine LCD_RSBIT = 1Define LCD_EREG = PORTDDefine LCD_EBIT = 3Define LCD_RWREG = PORTD 'set to 0 if not used, 0 is defaultDefine LCD_RWBIT = 2 'set to 0 if not used, 0 is defaultDefine LCD_COMMANDUS = 2000 'delay after LCDCMDOUT, default value is 5000Define LCD_DATAUS = 50 'delay after LCDOUT, default value is 100Define LCD_INITMS = 2 'delay used by LCDINIT, default value is 100'the last three Define directives set the values suitable for simulation; they should be omitted for a real device Dim a As LongDim aux_a As LongDim a1 As ByteDim a2 As WordDim a3 As WordAllDigitalLcdinit 1 'initialize LCD module; cursor is blinkingLcdcmdout LcdClearloop: a = 1234567890 aux_a = a / 100000000 a1 = aux_a aux_a = aux_a * 100000000 a = a - aux_a aux_a = a / 10000 a2 = aux_a aux_a = aux_a * 10000 a3 = a - aux_a Lcdcmdout LcdLine2Home 'set cursor at the beginning of line 2 Lcdout #a1, #a2, #a3 'formatted text for line 2End
GeSHi (freebasic):AllDigital 'Todos los puertos digitales'---------- CONFIGURACION PINES LCD ----------Define LCD_BITS = 4 'Bus de datos de 4 bitsDefine LCD_DREG = PORTB 'Bus de datos puerto BDefine LCD_DBIT = 0 'Bus de datos, los 4 menos significativosDefine LCD_RSREG = PORTB 'Puerto del RSDefine LCD_RSBIT = 4 'Bit del RSDefine LCD_EREG = PORTB 'Puerto del EDefine LCD_EBIT = 5 'Bit del EDefine LCD_RWREG = PORTB 'Puerto del RWDefine LCD_RWBIT = 6 'Bit del RWDefine LCD_COMMANDUS = 100 'Tiempo de espera despues de un comandDefine LCD_DATAUS = 50 'Tiempo de espera despues de enviar un datoDefine LCD_INITMS = 10 'Tiempo de espera despues de inicializar '----------CONFIGURACION I2C----------Symbol sda = PORTA.0 'bit conexien SDASymbol scl = PORTA.1 'bit conexien SCL '---------- VARIABLES----------Dim bb As Byte 'Byte para enviar al sintonizador (VHF en banda alta)Dim adbw As Byte 'Byte de direccien del sintonizadorDim cb As Byte 'Byte de control del sintonizador (pasos de 50 Khz)Symbol mas = PORTA.2 'Bit para subir frecuencia y memoriasSymbol menos = PORTA.3 'Bit para bajar frecuencia y memoriasSymbol mem = PORTA.4 'Bit para memorizarSymbol conmu = PORTA.5 'Bit para conmutar entre oscilador y memoriasDim modo As Bit 'Variable para commutar entre oscilador y memoriaDim divider As Word 'Frecuencia a cargar en el oscilador local del sintonizadorDim frec As Long 'Frecuencia que se muestra en el LCDDim aux_frec As Long 'Variables auxiliaresDim frec1 As Byte 'para calcular la frecuenciaDim frec2 As Word 'Gracias a dogflu66, el Lcdout #, no admite un LongDim memo As Byte 'Variable para cargar el numero de memoria '----------CONFIGURACION DE INICIO----------bb = 2 'VHF en banda altaadbw = 194 'Dirección del sintonizadorcb = 200 'Pasos de 50KhzRead 126, divider.HB 'He cogido los dos ultimos bytes de la memoriaRead 127, divider.LB 'del micro para guardar frecuenciamemo = 1 'Comienzo en 1modo = 0 'Comienzo en oscilador'----------INICIO DEL PROGRAMA----------Lcdinit 'inicializa el lcd sin cursorinicio:If conmu = 1 Then Toggle modo 'Si se pulsa conmuto entre oscilador y memoriaIf modo = 0 Then 'Si esta a ceroGoto oscilador 'Voy a osciladorElse 'si noGoto memoria 'voy a memoriaEndif '---------- MODO OSCILADOR ----------oscilador:Lcdcmdout LcdLine2Pos(13)Lcdout " VFO" 'Muestro en LCD que estoy en modo osciladorIf mem = 1 Then Gosub guardar 'Si se pulsa mem guardo en memoria la frecuenciaIf mas = 1 Then divider = divider + 1 'Si se pulsa subo frecuenciaIf divider > 8248 Then divider = 3580 'Si llego a tope vuelvo al principioIf menos = 1 Then divider = divider - 1 'Si se pulsa bajamos la frecuenciaIf divider < 3580 Then divider = 8248 'Si llego al primcipio salto al finalWrite 126, divider.HB 'Guardo la frecuencia en los dosWrite 127, divider.LB 'ultimos bytes de la ramGosub sintonizador 'Mando la frecuencia frecuencia al sintonizadorGosub display 'La muestro en el LCDGoto inicio 'Comienzo de nuevo '---------- MODO MEMORIA ----------memoria:Lcdcmdout LcdLine2Pos(13)Lcdout "M: " 'Limpio el numero de memoriaLcdcmdout LcdLine2Pos(13)Lcdout "M:" #memo 'Y lo muestroIf mas = 1 Then memo = memo + 1 'Si se pulsa subo memoriaIf memo > 62 Then memo = 1 'Si llega a tope vuelvo al principioIf menos = 1 Then memo = memo - 1 'Si se pulsa bajo memoriaIf memo < 1 Then memo = 62 'Si llega al principio vuelvo al finalIf mem = 0 Then Goto memoria 'Si no se pulsa se queda titilandomemo = memo * 2 'Calculo la posicionmemo = memo - 1 'de la memoria ramRead memo, divider.HB 'Leo el primer bytememo = memo + 1 'calculo posicion del segundo byteRead memo, divider.LB 'Lo leomemo = memo / 2 'Dejo el numero de memoria como estabaLcdcmdout LcdLine2Pos(13)Lcdout "M:" #memo 'Muestro numero de memoriaGosub sintonizador 'Mando frecuencia obtenida al sintonizadorGosub display 'La muestro en el LCDGoto inicio 'Comienzo de nuevoEnd '---------- RUTINA PARA MOSTRAR FREUCENCIA ----------display:Lcdcmdout LcdLine1HomeLcdout "FRECUENCIA"frec = divider * 50 'Conseguimos la frecuencia multiplicando por el saltofrec = frec - 42500 'en Khz y restando la frecuencia intermediaaux_frec = frec / 10000 'Aqui es donde interviene dogflu66frec1 = aux_frec 'muchas gracias, como solo necesitaba 6 digitosaux_frec = aux_frec * 10000 'he recortado un poco el codigofrec2 = frec - aux_frecLcdcmdout LcdLine2HomeLcdout #frec1, #frec2, "Khz" 'Muestro la frecuencia en el LCDReturn '---------- RUTINA PARA GUARDAR MEMORIA ----------guardar:Lcdcmdout LcdLine2Pos(13)Lcdout "M: " 'Limpio el numero de la memoriaLcdcmdout LcdLine2Pos(13)Lcdout "M:" #memo 'Lo muestroIf mas = 1 Then memo = memo + 1 'Si pulsamos sube memoriaIf memo > 62 Then memo = 1 'Si llego a tope paso a 1If menos = 1 Then memo = memo - 1 'Si pulsamos bsja memoriaIf memo < 1 Then memo = 62 'Si retrocedo paso a la ultimaIf mem = 0 Then Goto guardar 'Titila si no pulsamos guardarmemo = memo * 2 'Calculo la posicionmemo = memo - 1 'en la memoria ramWrite memo, divider.HB 'Escribo el primer bytememo = memo + 1 'Calculo posicion del segundo byteWrite memo, divider.LB 'lo escribomemo = memo / 2 'Dejo el numero como estabaLcdcmdout LcdLine2Pos(13)Lcdout "M:" #memo 'Muestro numero de memoria en el LCDReturn '---------- RUTINA PARA ENVIAR FRECUENCIA A SINTONIZADOR----------sintonizador:I2CPrepare sda, scl 'Preparamos el bus I2CI2CStart 'Lo abrimosI2CSend adbw 'Mandamos direccion del sintonizadorI2CSend divider.HB 'Mandamos el primer byte de frecuenciaI2CSend divider.LB 'Mandamos el segundo byteI2CSend cb 'Mandamos byte de controlI2CSend bb 'Mandamos BandaI2CStop 'Cerramos busReturn
GeSHi (vb):Define CONF_WORD = 0x2f10Define CONF_WORD_2 = 0x3ffcDefine CLOCK_FREQUENCY = 8'NOMBRE:16F88_PicEBasic_JugandoConBit_10'MICRO: PIC16F88/8Mhz reloj interno'Versión: 1.0, By COS, 2/10.'Rutina que extrae el bit o bit´s seleccionados y consecutivos de una variable'Uso del LCD con bus de datos a 4Bit y sin pin de RW'************************************************************************************************'-------------------------------------Puertos del LCD---------------------------------------------Define LCD_BITS = 4 'indicamos que el bus de datos del LCD será de 4bitDefine LCD_DREG = PORTA 'el bus de datos será el puerto ADefine LCD_DBIT = 0 'el bus de datos serán los 4 bit menos significativos del puerto ADefine LCD_RSREG = PORTB 'el bit de control RS será del puerto BDefine LCD_RSBIT = 7 'se usara el RB7 como RSDefine LCD_EREG = PORTB 'el bit de control E será del puerto BDefine LCD_EBIT = 6 'se usara el RB6 como EDefine LCD_COMMANDUS = 2000 'Tiempo de espera después de ejecutar un comando del LCD en uSeg.Define LCD_DATAUS = 50 'Tiempo de espera después de enviar un dato al LCD en uSeg.Define LCD_INITMS = 5 '(50) 'Tiempo de espera después de inicializar el Display, solo se ejecuta una vez en mSeg., trucado para simulación'------------------------------------------------------------------------------------------------------Define SIMULATION_WAITMS_VALUE = 1 'suprime los tiempos de espera Waitms, solo activar esta línea en simulación'------------------------------------Definición de puertos------------------------------------------ANSEL = 0x00 'los pin I/O digitales (no analógicos)OSCCON = 0x7e 'set intrc To 8mhz, se usara reloj interno a 8MhzCMCON = 0x07 'comparador a offTRISA = 0x00 'Puerto A como salidasTRISB = 0x00 'puerto B como salidas'------------------------------------Inicio------------------------------------------------------------Dim valor As Wordvalor = %1100000000001101Lcdinit 'inicializa el LCD sin cursorWaitMs 500 'pausa para estabilizarmain: 'Inicio bucle principal Call getbit(%00001101, 0, 1) 'Extrae el bit 1 Lcdcmdout LcdLine1Home 'Principio de línea 1 Lcdout #getbit, " " 'Imprime en decimal Call getbit(valor, 15, 14) 'Extrae los bit´s 14 y 15 Lcdcmdout LcdLine2Home 'Principio de línea dos Lcdout #getbit, " " 'Imprime bit en decimal'Goto mainEnd 'Extrae los bit indicados hasta 16bit'numero = constante o variable a extraer los bits'inibit = constante o variable que indica el límite del bit más significativo'endbit = constante o variable que indica el bit menos significativo'Para extraer un solo bit entonces inibit = endbit o inibit = 0.Function getbit(numero As Word, inibit As Byte, endbit As Byte) As Word If inibit < endbit Then inibit = endbit 'Se asegura que inibit >= endbit inibit = 15 - inibit 'Numero de lugares a desplazar hacia la izquierda endbit = inibit + endbit 'Numero de lugares a desplazar a la derecha numero = ShiftLeft(numero, inibit) 'Elimina los bit de más peso getbit = ShiftRight(numero, endbit) 'Elimina los bit de menos pesoEnd Function
GeSHi (vb):Define CONF_WORD = 0x2f10Define CONF_WORD_2 = 0x3ffcDefine CLOCK_FREQUENCY = 8'NOMBRE:16F88_PicEBasic_JugandoConBit_11'MICRO: PIC16F88/8Mhz reloj interno'Versión: 1.1, By COS, 2/10, 3/10, PSI v6.83'Imprime por el lcd en formato binario'Rutina que extrae el bit o bits seleccionados y consecutivos de una variable'Uso del LCD con bus de datos a 4Bit y sin pin de RW'************************************************************************************************'-------------------------------------Puertos del LCD---------------------------------------------Define LCD_BITS = 4 'indicamos que el bus de datos del LCD será de 4bitDefine LCD_DREG = PORTA 'el bus de datos será el puerto ADefine LCD_DBIT = 0 'el bus de datos serán los 4 bit menos significativos del puerto ADefine LCD_RSREG = PORTB 'el bit de control RS será del puerto BDefine LCD_RSBIT = 7 'se usara el RB7 como RSDefine LCD_EREG = PORTB 'el bit de control E será del puerto BDefine LCD_EBIT = 6 'se usara el RB6 como EDefine LCD_COMMANDUS = 2000 'Tiempo de espera después de ejecutar un comando del LCD en uSeg.Define LCD_DATAUS = 50 'Tiempo de espera después de enviar un dato al LCD en uSeg.Define LCD_INITMS = 5 '(50) 'Tiempo de espera después de inicializar el Display, solo se ejecuta una vez en mSeg., trucado para simulación'------------------------------------------------------------------------------------------------------Define SIMULATION_WAITMS_VALUE = 1 'suprime los tiempos de espera Waitms, solo activar esta línea en simulación'------------------------------------Definición de puertos------------------------------------------ANSEL = 0x00 'los pin I/O digitales (no analógicos)OSCCON = 0x7e 'set intrc To 8mhz, se usara reloj interno a 8MhzCMCON = 0x07 'comparador a offTRISA = 0x00 'Puerto A como salidasTRISB = 0x00 'puerto B como salidas'------------------------------------Inicio------------------------------------------------------------Dim valor As WordDim n As Bytevalor = %1100000000001101Lcdinit 'inicializa el LCD sin cursorWaitMs 500 'pausa para estabilizarmain: 'Inicio bucle principal Lcdcmdout LcdLine1Home 'Principio de línea 1 Lcdout #valor, " " 'Imprime en decimal Lcdcmdout LcdLine2Home 'Principio de línea dos, print bit For n = 15 To 0 Step -1 'Contador para seleccionar bit Call getbit(valor, 0, n) 'Extrae los bit n Lcdout #getbit 'Imprime bit Next n'Goto mainEnd 'Extrae los bit indicados hasta 16bit'numero = constante o variable a extraer los dígitos'inibit = constante o variable que indica el límite del bit más significativo'endbit = constante o variable que indica el bit menos significativo'Para extraer un solo bit entonces inibit = endbit o inibit = 0.Function getbit(numero As Word, inibit As Byte, endbit As Byte) As Word If inibit < endbit Then inibit = endbit 'Se asegura que inibit >= endbit inibit = 15 - inibit 'Numero de lugares a desplazar hacia la izquierda endbit = inibit + endbit 'Numero de lugares a desplazar a la derecha numero = ShiftLeft(numero, inibit) 'Elimina los bit de más peso getbit = ShiftRight(numero, endbit) 'Elimina los bit de menos pesoEnd Function
GeSHi (freebasic):Define CONF_WORD = 0x2f10Define CONF_WORD_2 = 0x3ffcDefine CLOCK_FREQUENCY = 8'NOMBRE:16F88_PicEBasic_JugandoConBit_12'MICRO: PIC16F88/8Mhz reloj interno'Versión: 1.2, By COS, 2/10, 3/10, PSI v6.83'Codigo BCD, decimal codificado en binario'************************************************************************************************'-------------------------------------Puertos del LCD---------------------------------------------Define LCD_BITS = 4 'indicamos que el bus de datos del LCD será de 4bitDefine LCD_DREG = PORTA 'el bus de datos será el puerto ADefine LCD_DBIT = 0 'el bus de datos serán los 4 bit menos significativos del puerto ADefine LCD_RSREG = PORTB 'el bit de control RS será del puerto BDefine LCD_RSBIT = 7 'se usara el RB7 como RSDefine LCD_EREG = PORTB 'el bit de control E será del puerto BDefine LCD_EBIT = 6 'se usara el RB6 como EDefine LCD_COMMANDUS = 2000 'Tiempo de espera después de ejecutar un comando del LCD en uSeg.Define LCD_DATAUS = 50 'Tiempo de espera después de enviar un dato al LCD en uSeg.Define LCD_INITMS = 5 '(50) 'Tiempo de espera después de inicializar el Display, solo se ejecuta una vez en mSeg., trucado para simulación'------------------------------------------------------------------------------------------------------Define SIMULATION_WAITMS_VALUE = 1 'suprime los tiempos de espera Waitms, solo activar esta línea en simulación'------------------------------------Definición de puertos------------------------------------------ANSEL = 0x00 'los pin I/O digitales (no analógicos)OSCCON = 0x7e 'set intrc To 8mhz, se usara reloj interno a 8MhzCMCON = 0x07 'comparador a offTRISA = 0x00 'Puerto A como salidasTRISB = 0x00 'puerto B como salidas'------------------------------------Inicio------------------------------------------------------------Dim valor As WordDim n As Bytevalor = 3210Lcdinit 'inicializa el LCD sin cursorWaitMs 500 'pausa para estabilizarmain: 'Inicio bucle principal Lcdcmdout LcdLine1Home 'Principio de línea 1 Lcdout #valor, " " 'Imprime en decimal Lcdcmdout LcdLine2Home 'Principio de línea dos, print digito For n = 3 To 0 Step -1 'Contador para seleccionar digito Call getbcd(valor, n) 'Extrae digito n Lcdout #getbcd, "_" 'Imprime digito Next n'Goto mainEnd 'Codigo BCD, decimal codificado en binario'Extrae el digito indicado, hasta 4 digitos'numero = Cifra a descomponer'digito = Digito a extraer de 0 a 3Function getbcd(numero As Word, digito As Byte) As Byte 'Descompone el numero a mostrar en digitos If digito = 3 Then getbcd = numero / 1000 'Calculo unidades de millar If digito = 2 Then getbcd = (numero - ((numero / 1000) * 1000)) / 100 'calculo centenas If digito = 1 Then getbcd = (numero - ((numero / 100) * 100)) / 10 'calculo decenas If digito = 0 Then getbcd = numero - ((numero / 10) * 10) 'Calculo unidadesEnd Function
GeSHi (qbasic):Define CONF_WORD = 0x2f10Define CONF_WORD_2 = 0x3ffcDefine CLOCK_FREQUENCY = 8'NOMBRE:16F88_PicEBasic_JugandoConBit_13'MICRO: PIC16F88/8Mhz reloj interno'Versión: 1.3, By COS, 2/10, 3/10, PSI v6.83'Codigo BCD a cifra decimal'************************************************************************************************'-------------------------------------Puertos del LCD---------------------------------------------Define LCD_BITS = 4 'indicamos que el bus de datos del LCD será de 4bitDefine LCD_DREG = PORTA 'el bus de datos será el puerto ADefine LCD_DBIT = 0 'el bus de datos serán los 4 bit menos significativos del puerto ADefine LCD_RSREG = PORTB 'el bit de control RS será del puerto BDefine LCD_RSBIT = 7 'se usara el RB7 como RSDefine LCD_EREG = PORTB 'el bit de control E será del puerto BDefine LCD_EBIT = 6 'se usara el RB6 como EDefine LCD_COMMANDUS = 2000 'Tiempo de espera después de ejecutar un comando del LCD en uSeg.Define LCD_DATAUS = 50 'Tiempo de espera después de enviar un dato al LCD en uSeg.Define LCD_INITMS = 5 '(50) 'Tiempo de espera después de inicializar el Display, solo se ejecuta una vez en mSeg., trucado para simulación'------------------------------------------------------------------------------------------------------Define SIMULATION_WAITMS_VALUE = 1 'suprime los tiempos de espera Waitms, solo activar esta línea en simulación'------------------------------------Definición de puertos------------------------------------------ANSEL = 0x00 'los pin I/O digitales (no analógicos)OSCCON = 0x7e 'set intrc To 8mhz, se usara reloj interno a 8MhzCMCON = 0x07 'comparador a offTRISA = 0x00 'Puerto A como salidasTRISB = 0x00 'puerto B como salidas'------------------------------------Inicio------------------------------------------------------------Lcdinit 'inicializa el LCD sin cursorWaitMs 500 'pausa para estabilizarmain: 'Inicio bucle principal CALL getdecimal(3, 2, 1, 0) 'Pasa los numeros a una cifra decimal Lcdcmdout LcdLine1Home 'Principio de línea 1 Lcdout "3 2 1 0 = ", #getdecimal 'Imprime en decimal'Goto mainEND 'Include "_FunctionGetDecimal.bas"'Versión: 1.0, By COS, 3/10, PSI v6.83'Codigo BCD a cifra decimal'getdecimal = Cifra decimal'dig_3 al 0 = Digitos BCDFUNCTION getdecimal(dig_3 AS Byte, dig_2 AS Byte, dig_1 AS Byte, dig_0 AS Byte) AS Word 'Compone los digitos en una decimal getdecimal = dig_3 * 1000 'Calculo unidades de millar getdecimal = getdecimal + (dig_2 * 100) 'Calculo centenas getdecimal = getdecimal + (dig_1 * 10) 'Calculo decenas getdecimal = getdecimal + dig_0 'Calculo unidadesEND FUNCTION
GeSHi (freebasic):Define CONF_WORD = 0x2f10Define CONF_WORD_2 = 0x3ffcDefine CLOCK_FREQUENCY = 8'NOMBRE:16F88_PicEBasic_FunctionGetADC_14'MICRO: PIC16F88/8Mhz reloj interno'Versión: 1.4, By COS, 2/10, 3/10, PSI v6.83'Rutina lectura del modulo ADC'************************************************************************************************'-------------------------------------Puertos del LCD---------------------------------------------Define LCD_BITS = 4 'indicamos que el bus de datos del LCD será de 4bitDefine LCD_DREG = PORTA 'el bus de datos será el puerto ADefine LCD_DBIT = 0 'el bus de datos serán los 4 bit menos significativos del puerto ADefine LCD_RSREG = PORTB 'el bit de control RS será del puerto BDefine LCD_RSBIT = 7 'se usara el RB7 como RSDefine LCD_EREG = PORTB 'el bit de control E será del puerto BDefine LCD_EBIT = 6 'se usara el RB6 como EDefine LCD_COMMANDUS = 2000 'Tiempo de espera después de ejecutar un comando del LCD en uSeg.Define LCD_DATAUS = 50 'Tiempo de espera después de enviar un dato al LCD en uSeg.Define LCD_INITMS = 5 '(50) 'Tiempo de espera después de inicializar el Display, trucado para simulación'------------------------------------------------------------------------------------------------------Define SIMULATION_WAITMS_VALUE = 1 'suprime los tiempos de espera Waitms, solo activar esta línea en simulación'------------------------------------Definición de puertos------------------------------------------ANSEL = %00010000 'Selecciona modo de trabajo de los pin, bit=0 digitales y bit=1 analógicosOSCCON = 0x7e 'set intrc To 8mhz, se usara reloj interno a 8MhzCMCON = 0x07 'comparador a offTRISA = 0xff 'Puerto A como entradasTRISB = 0xff 'puerto B como entradasTRISB.3 = 0 'RB3 como salidaTRISA.7 = 0 'RA7 como salidaTRISB.0 = 0 'RB0 como salida'TRISA.4 = 1 'como entrada (RA4, adc)'TRISA.6 = 1 'como entrada (RA6, tecla S1)'TRISA.5 = 1 'como entrada (RA5, tecla S2)PORTB.3 = 1 'luz lcd a on (RB3)PORTA.7 = 1 'led amarillo a offPORTB.0 = 1 'led verde a off'------------------------------------Inicio------------------------------------------------------------Lcdinit 'inicializa el LCD sin cursorWaitMs 500 'pausa para estabilizar'/* Iniciliza la funcion getadc a 10Bit con el canal 4, que es el'del potenciometro de la EBasic y activa un lectura al salir de la funcion*/Call getadc(4, 4, %1101)main: 'Inicio bucle principal 'Hace una lectura del canal por defecto y activa una lectura al salir Call getadc(0, 0, %1000) Lcdcmdout LcdLine1Home 'Principio de línea 1 Lcdout "ADC=", #getadc, " " 'Imprime en decimalGoto mainEnd 'Include "_FunctionGetADC.bas"'Pic16F88 o compatibles'Lee entradas analogicas, 8bit y 10bit'r_pin = Selecciona el canal's_pin = Selecciona el canal por defecto'Si r_pin <> s_pin = Fuerza cambio de canales'init.0 = 1, establece con figuracion basica a 10 bit'init.0 = 1 & init.1 = 1, establece configurcion basica a 8 bit'init.2 = 1, selecciona nuevo canal de entrada'init.3 = 1, habilita nueva lectura al salir'Si el ADC esta configurado a 8Bit el valor esta en v_bat.HB'Optimizada para 8Mhz.'En el programa mediante el reg. ANSEL seleccionaremos que pins seran digitales (I/O) y o analogicos'La función tiene que ser inicializada llamandola una vez antes de usarlaFunction getadc(r_pin As Byte, s_pin As Byte, ini As Byte) As Word If ini.0 = 1 Then ADCON0 = %01000001 'Fosc/16 a 8Mhz (ADCON1.ADCS2=1) =2uSeg (min 1.6uSeg), CH AN0, switching ADCON1 = %11000000 'volt. ref.(AVdd/AVss), selec. de escala division clock/16 ADCON1.ADCS2=1, ADC a ON If ini.1 = 1 Then ADCON1.ADFM = 0 'Activa lectura 8bit del ADC Endif If r_pin <> s_pin Or ini.2 = 1 Then 'Se establece el nuevo canal de lectura ADCON0 = ADCON0 And %11000111 'Selecciona channel AN0 If r_pin = 1 Then ADCON0.3 = 1 'Selecciona channel AN1 If r_pin = 2 Then ADCON0.4 = 1 'Selecciona channel AN2 If r_pin = 3 Then 'Selecciona channel AN3 ADCON0.3 = 1 ADCON0.4 = 1 Endif If r_pin = 4 Then ADCON0.5 = 1 'Selecciona channel AN4 Endif If ini.0 = 1 Or ini.2 = 1 Then WaitUs 10 'Tiempo estabilización despues de configuración If ini.3 = 0 Or ini.0 = 1 Or ini.2 = 1 Then ADCON0.GO = 1 'Activa una lectura en el ADC While ADCON0.GO = 1 'Espera que termine la lectura del módulo ADC Wend getadc.HB = ADRESH 'Carga el valor mas significativo del registro del ADC getadc.LB = ADRESL 'Carga el valor menos significativo del registro del ADC If ini.3 = 1 Then ADCON0.GO = 1 'Genera una lectura al salir '/* Selecciona el canal por defecto, de esta forma en la proxima lectura 'nos ahorramos los 10useg. de estabilizacion del modulo * / If r_pin <> s_pin Then ADCON0 = ADCON0 And %11000111 'Selecciona channel AN0 If s_pin = 1 And r_pin <> s_pin Then ADCON0.3 = 1 'Selecciona channel AN1 If s_pin = 2 And r_pin <> s_pin Then ADCON0.4 = 1 'Selecciona channel AN2 If s_pin = 3 And r_pin <> s_pin Then 'Selecciona channel AN3 ADCON0.3 = 1 ADCON0.4 = 1 Endif If s_pin = 4 And r_pin <> s_pin Then ADCON0.5 = 1 'Selecciona channel AN4End Function