AllDigital 'Todos los puertos digitales
'---------- CONFIGURACION PINES LCD ----------
Define LCD_BITS = 4 'Bus de datos de 4 bits
Define LCD_DREG = PORTB 'Bus de datos puerto B
Define LCD_DBIT = 0 'Bus de datos, los 4 menos significativos
Define LCD_RSREG = PORTB 'Puerto del RS
Define LCD_RSBIT = 4 'Bit del RS
Define LCD_EREG = PORTB 'Puerto del E
Define LCD_EBIT = 5 'Bit del E
Define LCD_RWREG = PORTB 'Puerto del RW
Define LCD_RWBIT = 6 'Bit del RW
Define LCD_COMMANDUS = 100 'Tiempo de espera despues de un comand
Define LCD_DATAUS = 50 'Tiempo de espera despues de enviar un dato
Define LCD_INITMS = 10 'Tiempo de espera despues de inicializar
'----------CONFIGURACION I2C----------
Symbol sda = PORTA.0 'bit conexien SDA
Symbol 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 sintonizador
Dim cb As Byte 'Byte de control del sintonizador (pasos de 50 Khz)
Symbol mas = PORTA.2 'Bit para subir frecuencia y memorias
Symbol menos = PORTA.3 'Bit para bajar frecuencia y memorias
Symbol mem = PORTA.4 'Bit para memorizar
Symbol conmu = PORTA.5 'Bit para conmutar entre oscilador y memorias
Dim modo As Bit 'Variable para commutar entre oscilador y memoria
Dim divider As Word 'Frecuencia a cargar en el oscilador local del sintonizador
Dim frec As Long 'Frecuencia que se muestra en el LCD
Dim aux_frec As Long 'Variables auxiliares
Dim frec1 As Byte 'para calcular la frecuencia
Dim frec2 As Word 'Gracias a dogflu66, el Lcdout #, no admite un Long
Dim memo As Byte 'Variable para cargar el numero de memoria
'----------CONFIGURACION DE INICIO----------
bb = 2 'VHF en banda alta
adbw = 194 'Dirección del sintonizador
cb = 200 'Pasos de 50Khz
Read 126, divider.HB 'He cogido los dos ultimos bytes de la memoria
Read 127, divider.LB 'del micro para guardar frecuencia
memo = 1 'Comienzo en 1
modo = 0 'Comienzo en oscilador
'----------INICIO DEL PROGRAMA----------
Lcdinit 'inicializa el lcd sin cursor
inicio:
If conmu = 1 Then Toggle modo 'Si se pulsa conmuto entre oscilador y memoria
If modo = 0 Then 'Si esta a cero
Goto oscilador 'Voy a oscilador
Else 'si no
Goto memoria 'voy a memoria
Endif
'---------- MODO OSCILADOR ----------
oscilador:
Lcdcmdout LcdLine2Pos(13)
Lcdout " VFO" 'Muestro en LCD que estoy en modo oscilador
If mem = 1 Then Gosub guardar 'Si se pulsa mem guardo en memoria la frecuencia
If mas = 1 Then divider = divider + 1 'Si se pulsa subo frecuencia
If divider > 8248 Then divider = 3580 'Si llego a tope vuelvo al principio
If menos = 1 Then divider = divider - 1 'Si se pulsa bajamos la frecuencia
If divider < 3580 Then divider = 8248 'Si llego al primcipio salto al final
Write 126, divider.HB 'Guardo la frecuencia en los dos
Write 127, divider.LB 'ultimos bytes de la ram
Gosub sintonizador 'Mando la frecuencia frecuencia al sintonizador
Gosub display 'La muestro en el LCD
Goto inicio 'Comienzo de nuevo
'---------- MODO MEMORIA ----------
memoria:
Lcdcmdout LcdLine2Pos(13)
Lcdout "M: " 'Limpio el numero de memoria
Lcdcmdout LcdLine2Pos(13)
Lcdout "M:" #memo 'Y lo muestro
If mas = 1 Then memo = memo + 1 'Si se pulsa subo memoria
If memo > 62 Then memo = 1 'Si llega a tope vuelvo al principio
If menos = 1 Then memo = memo - 1 'Si se pulsa bajo memoria
If memo < 1 Then memo = 62 'Si llega al principio vuelvo al final
If mem = 0 Then Goto memoria 'Si no se pulsa se queda titilando
memo = memo * 2 'Calculo la posicion
memo = memo - 1 'de la memoria ram
Read memo, divider.HB 'Leo el primer byte
memo = memo + 1 'calculo posicion del segundo byte
Read memo, divider.LB 'Lo leo
memo = memo / 2 'Dejo el numero de memoria como estaba
Lcdcmdout LcdLine2Pos(13)
Lcdout "M:" #memo 'Muestro numero de memoria
Gosub sintonizador 'Mando frecuencia obtenida al sintonizador
Gosub display 'La muestro en el LCD
Goto inicio 'Comienzo de nuevo
End
'---------- RUTINA PARA MOSTRAR FREUCENCIA ----------
display:
Lcdcmdout LcdLine1Home
Lcdout "FRECUENCIA"
frec = divider * 50 'Conseguimos la frecuencia multiplicando por el salto
frec = frec - 42500 'en Khz y restando la frecuencia intermedia
aux_frec = frec / 10000 'Aqui es donde interviene dogflu66
frec1 = aux_frec 'muchas gracias, como solo necesitaba 6 digitos
aux_frec = aux_frec * 10000 'he recortado un poco el codigo
frec2 = frec - aux_frec
Lcdcmdout LcdLine2Home
Lcdout #frec1, #frec2, "Khz" 'Muestro la frecuencia en el LCD
Return
'---------- RUTINA PARA GUARDAR MEMORIA ----------
guardar:
Lcdcmdout LcdLine2Pos(13)
Lcdout "M: " 'Limpio el numero de la memoria
Lcdcmdout LcdLine2Pos(13)
Lcdout "M:" #memo 'Lo muestro
If mas = 1 Then memo = memo + 1 'Si pulsamos sube memoria
If memo > 62 Then memo = 1 'Si llego a tope paso a 1
If menos = 1 Then memo = memo - 1 'Si pulsamos bsja memoria
If memo < 1 Then memo = 62 'Si retrocedo paso a la ultima
If mem = 0 Then Goto guardar 'Titila si no pulsamos guardar
memo = memo * 2 'Calculo la posicion
memo = memo - 1 'en la memoria ram
Write memo, divider.HB 'Escribo el primer byte
memo = memo + 1 'Calculo posicion del segundo byte
Write memo, divider.LB 'lo escribo
memo = memo / 2 'Dejo el numero como estaba
Lcdcmdout LcdLine2Pos(13)
Lcdout "M:" #memo 'Muestro numero de memoria en el LCD
Return
'---------- RUTINA PARA ENVIAR FRECUENCIA A SINTONIZADOR----------
sintonizador:
I2CPrepare sda, scl 'Preparamos el bus I2C
I2CStart 'Lo abrimos
I2CSend adbw 'Mandamos direccion del sintonizador
I2CSend divider.HB 'Mandamos el primer byte de frecuencia
I2CSend divider.LB 'Mandamos el segundo byte
I2CSend cb 'Mandamos byte de control
I2CSend bb 'Mandamos Banda
I2CStop 'Cerramos bus
Return