'****************************************************************
'* Name : proyeco-4.BAS *
'* Author : Iao-Firepic *
'* Notice : Copyright (c) 2010 [select VIEW...EDITOR OPTIONS] *
'* : All Rights Reserved *
'* Date : 25/11/2010 *
'* Version : 1.0 *
'* Notes : MiniOsciloscopio con el LCD Nokia 3310. *
'* : *
'****************************************************************
'***************************************************************
'CONFIGURACIONES GENERALES
'***************************************************************
INCLUDE "modedefs.bas"
dEFINE LOADER_USED 1
Define OSC 4 ' Definimos la Frecuencia del cristal a 4Mhz
DEFINE ADC_BITS 8
Pin_SCLK VAR PortB.0 'LCD Clock
Pin_SDIN VAR PortB.1 'LCD Data
Pin_DC VAR PortB.2 'LCD Data/Command
Pin_SCE VAR PortB.3 'LCD Chip select
Pin_RST VAR PortB.4 'LCD Reset
Pin_Vcc VAR PortB.5 'LCD Power
'Variables usadas por las rutinas del LCD
ascii var byte
Grafico var byte
valor_a VAR BYTE
valor_b var byte
LCD_f var word
Fuente var byte
Fuente1 var byte
lcd_chr var word
numero VAR WORD
dato var byte
PosX var byte
PosY var byte
X var BYTE
Y var byte
i var BYTE
j var BYTE
k var BYTE
n var byte
f var byte
z var BYTE 'No usar en otra parte, se usa en rutina "DibujaPunto"
Invertido var bit
canal_a var byte[70]
canal_b var byte[70]
Inicio:
X=0
Y=0
TRISA = 255
ADCON1 = 0
TRISB=0 ' Puerto B entero como salidas
TRISC=0
PORTB=0
OPTION_REG.7 = 1 ' Desactivamos pull-ups del portB
INTCON.7=0 ' Desactivamos las interrupciones
Pause 100 ' Hacemos una pausa de 100 ms para estabilizar todo
gosub InicializaLCD
gosub ConfiguraLCD
gosub borra_lcd
gosub cursor_origen
ciclo:
gosub muestreo
gosub Pantalla
pause 2000
gosub borra_lcd
goto ciclo
'***************************************************************
'Rutina para muestreo y almacenamiento de medición en RAM.
'***************************************************************
Muestreo:
for i = 0 to 69
adcin 0, valor_a
adcin 1, valor_b
canal_a[i]= valor_a/8
canal_b[i]= valor_b/8
pause 15
next i
return
'***************************************************************
'Esta rutina muestra las dos señales en el LCD.
'***************************************************************
Pantalla:
x=0
for i = 0 to 69
y=canal_a[i]
gosub Dibujapunto
y=30+canal_b[i]
gosub dibujapunto
pause 10
x = x+1
next i
Return
'***************************************************************
'Esta rutina grafica un punto en la pantalla
'siguiendo coordenadas X,Y (X:0-83; y:0-47).
'***************************************************************
DibujaPunto:
if Y<=7 then
z=7-Y
dato = %00000001 << z
posy=5
endif
if Y>=8 AND Y<=15 then
z=15-Y
dato = %00000001 << z
posy=4
endif
if Y>=16 AND Y<=23 then
posy=3
z=23-Y
dato = %00000001 << z
endif
if Y>=24 and Y<=31 then
posy=2
z=31-Y
dato = %00000001 << z
endif
if Y>=32 AND Y<=39 then
posy=1
z=39-Y
dato = %00000001 << z
endif
if Y>=40 AND Y<=47 then
posy=0
z=47-Y
dato = %00000001 << z
endif
PosX = X
gosub cursor_xy
lcd_chr = dato
gosub lcd_data
return
'*******************************************************************************************
' RUTINAS GESTION LCD NOKIA 3310
'*******************************************************************************************
'-------------------------------------------------------------------------------------------
InicializaLCD:
Pin_DC=1 ' Seleccionamos el registro de datos en RAM
Pin_SCE=1 ' Anulamos la seleccion del chip
Pin_VCC=1 ' Damos alimentacion al LCD
pause 100 ' Hacemos una pausa de 100 ms
gosub Reset_LCD ' Reseteamos el LCD
return
'-------------------------------------------------------------------------------------------
'-------------------------------------------------------------------------------------------
ConfiguraLCD:
lcd_chr=%00100001 ' Chip Activo, Direccionamiento horizontal, uso de instrucciones extendidas
gosub lCD_cmd
lcd_chr=$B5 ' Configura el voltage de operacion del LCD (Contraste)
gosub lCD_cmd
lcd_chr=$13 ' Configura bias mux rate a 1:48
gosub lCD_cmd
lcd_chr=%00100000 ' Chip Activo, Direccionamiento horizontal,uso de instrucciones basicas
gosub lCD_cmd
gosub Segmentos_ON ' Configura el display (Todos los segmentos ON)
gosub Display_Normal ' Configura el display (modo Normal)
gosub direccionamiento_vertical
return
'-------------------------------------------------------------------------------------------
'-------------------------------------------------------------------------------------------
Display_Blanco:
lcd_chr=%00001000 ' Display Blanco
gosub lCD_cmd
return
'-------------------------------------------------------------------------------------------
'-------------------------------------------------------------------------------------------
Display_Inverso:
lcd_chr=%00001101 ' Display Inverso
gosub lCD_cmd
return
'-------------------------------------------------------------------------------------------
'-------------------------------------------------------------------------------------------
Display_Normal:
lcd_chr=%00001100 ' Display Normal
gosub lCD_cmd
return
'-------------------------------------------------------------------------------------------
'-------------------------------------------------------------------------------------------
Segmentos_ON:
lcd_chr=%00001001 ' Segmentos ON
gosub lCD_cmd
return
'-------------------------------------------------------------------------------------------
'-------------------------------------------------------------------------------------------
Direccionamiento_Vertical:
lcd_chr=%00100010 ' Chip Activo, Direccionamiento Vertical,uso de instrucciones basicas
gosub lCD_cmd
return
'-------------------------------------------------------------------------------------------
'-------------------------------------------------------------------------------------------
Direccionamiento_Horizonal:
lcd_chr=%00100000 ' Chip Activo, Direccionamiento Vertical,uso de instrucciones basicas
gosub lCD_cmd
return
'-------------------------------------------------------------------------------------------
'-------------------------------------------------------------------------------------------
Borra_LCD:
gosub Cursor_Origen ' Colocamos el cursor en el origen
for LCD_f=0 to 503 ' Recorremos todas las posiciones del LCD colocando ceros
lcd_chr=0
gosub LCD_Data
next LCD_f
return
'-------------------------------------------------------------------------------------------
'-------------------------------------------------------------------------------------------
Cursor_Origen:
lcd_chr=%01000000 ' Ponemos la direccion Y a 0 (01000yyy)
gosub lCD_cmd
lcd_chr=%10000000 ' Ponemos la direccion X a 0 (1xxxxxxx)
gosub lCD_cmd
return
'-------------------------------------------------------------------------------------------
'-------------------------------------------------------------------------------------------
Cursor_XY:
lcd_chr=%10000000 <PIPE> PosX
Gosub lCD_cmd ' Envia Posicion X
lcd_chr=%01000000 <PIPE> PosY
Gosub lCD_cmd ' Envia Posicion Y
return
'-------------------------------------------------------------------------------------------
'-------------------------------------------------------------------------------------------
Reset_LCD:
Pin_RST=0 ' Damos un pulso de reset durante 100 ms
pause 100
Pin_RST=1
return
'-------------------------------------------------------------------------------------------
'-------------------------------------------------------------------------------------------
lCD_cmd:
Pin_DC=0 ' Seleccionamos el registro de comandos
goto Data_Out
'-------------------------------------------------------------------------------------------
'-------------------------------------------------------------------------------------------
LCD_Data:
Pin_DC=1 ' Seleccionamos el registro de datos de RAM
if Invertido=1 then ' Comprobamos si se invierte el dato para la representacion
lcd_chr = lcd_chr ^ $FF
endif
goto Data_Out
'-------------------------------------------------------------------------------------------
'-------------------------------------------------------------------------------------------
Data_Out:
Pin_SCE=0 ' Seleccionamos el chip del LCD
Pin_SCLK=0 ' Ponemos a cero la señal de reloj
shiftout Pin_SDIN,Pin_SCLK,1,[lcd_chr\8] 'Enviamos los datos en modo SPI
Pin_SCE=1 ' Deseleccionamos el chip para liberar el bus
return
'-------------------------------------------------------------------------------------------
'-------------------------------------------------------------------------------------------
END