Gracias por t respuesta.
cambíe todos los gosub por goto y aún así me pone el warning.
lo más probable es que me pasé a otro banco, ya que el programa es muy grande.
supuestamente el PBP hace el trabajo con el PLATH para saltar a más de 2K.
este es el programa, es la interfaz únicamente con un LCD y un teclado.
Para un afinadior de guitarra.
"****************************************************************
"* Name : interfaz.BAS *
"* Author : Raymundo Coronado Guerrero *
"* Notice : Copyright (c) 2005 ITSON *
"* : All Rights Reserved *
"* Date : 23/11/05 *
"* Version : 1.0 *
"* Notes : *
"* : *
"****************************************************************
@ device HS_OSC
DEFINE OSC 12 ;oscilador externo de 12 MHz.
"*******************************************************************************
"DECLARACIÓN DE VARIABLES Y CONSTANTES *
"*******************************************************************************
inicia var bit
OK VAR BIT
atras var bit
auto var bit
adelante var bit
escoge var bit
enter var bit
manual var bit
personal var bit
afina var byte
espa var byte
fase var byte
cuerda var byte
divisor var byte
id var byte
index var byte
letra var byte
nsexta var byte
nquinta var byte
ncuarta var byte
notamax var byte
notamin var byte
ntercera var byte
nsegunda var byte
nprimera var byte
pausa var byte
tinning var byte
nota var byte
z var byte
permin var word
permax var word
ncentral var word
"Notas con sus repectivos periodos multiplicados por 10^5.
C2 CON 1528
Cs2_Db2 CON 1443
D2 CON 1362
Ds2_Eb2 CON 1286
E2_Fb2 CON 1213
Es2_F2 CON 1145
Fs2_Gb2 CON 1081
G2 CON 1024
Gs2_Ab2 CON 963
A2 CON 909
As2_Bb2 CON 858
B2_Cb2 CON 809
C3_Bs2 CON 764
Cs3_Df3 CON 721
D3 CON 681
Ds3_Ef3 CON 642
E3_Ff3 CON 606
F3_Es3 CON 572
Fs3_Gf3 CON 540
G3 CON 510
Gs3_Af3 CON 481
A3 CON 454
As3_Bf3 CON 429
B3_Cf4 CON 405
C4_Bs3 CON 382
Cs4_Df4 CON 360
D4 CON 340
Ds4_Ef4 CON 321
E4_Ff4 CON 303
F4_Es4 CON 286
Fs4_Gf4 CON 270
G4 CON 255
"*******************************************************************************
"Alias para los 4 botones del teclado *
"*******************************************************************************
" ----------------------------
" | Esc | < | > | Enter|
" ----------------------------
A VAR PORTC.4 ;nombres para los pines de las filas
B VAR PORTC.5
UNO VAR PORTC.6 ;nombres para los pines de las columnas
DOS VAR PORTC.7
TRISC=$C0 ;2 pines más significativos como entradas
;los demás como salidas
TRISA=$00 ;puerto A como salida
DEFINE LCD_DREG PORTB
DEFINE LCD_DBIT 0 "datos del LCD = al MSnible del Puerto B.
define LCD_RSREG PORTB
DEFINE LCD_RSBIT 5 "selección del registro de contol/datos Puerto A.4.
define LCD_EREG PORTA
DEFINE LCD_EBIT 4
"*******************************************************************************
"RUTINA QUE ENCUENTRA LA TECLA PRESIONADA. *
"*******************************************************************************
teclado:
porta.0=1
IF escoge=0 THEN
LCDOUT $FE,1
LCDOUT $FE,$81,"PRESIONE "
LCDOUT $FE,$C2," <,> o ENTER "
endif
A=0 ;hacer baja la 1era fila
IF UNO=0 THEN
espera1:
INICIA=1 ;si la 1ra tecla es presionada sacar 1
if uno=0 then espera1 ;espera a se que suelte la tecla
gosub display
endif
IF dos=0 THEN
espera2:
ATRAS=1 ;si la 1ra tecla es presionada sacar 1
if dos=0 then espera2 ;espera a que se suelte la tecla
gosub display
endif
A=1 ;poner en alto la 1era fila
B=0 ;hacer bajo la 2da fila
IF UNO=0 THEN
espera3:
ADELANTE=1 ;si la 1ra tecla es presionada sacar 1
if uno=0 then espera3 ;espera a que se suelte la tecla
gosub display
endif
IF dos=0 THEN
espera4:
ENTER=1 ;si la 1ra tecla es presionada sacar 1
if dos=0 then espera4 ;espera a que se suelte la tecla
gosub display
endif
B=1 ;poner en alto la 2da fila
porta.0=0
goto teclado
"*******************************************************************************
"SUBRRUTINAS DE DESPLIEGUE Y BÚSQUEDA DE OPCIONES. *
"*******************************************************************************
display:
porta.1=1
if inicia=1 then
fase=fase-1 min 0
adelante=1
atras=0
enter=0
inicia=0
nota=0
cuerda=0
escoge=0
LCDOUT $FE,1
endif
IF fase=0 THEN
goto modo
endif
if fase=1 then
goto tipo
endif
if (fase=1)&(personal=0) then
goto elija_afinacion
ENDIF
if (fase=1)&(personal=1) then
goto elija_cuerda
ENDIF
IF FASE=2 then
goto elija_nota
ENDIF
if fase=3 then
goto golpea
endif
if (OK=1)&(fase=1)&(personal=0)|(enter=1) then
cuerda=cuerda+1
afina=1
if cuerda=7 then
cuerda=1
afina=1
escoge=0
ENDIF
goto elija_afinacion
ENDIF
if (OK=1)&(fase=1)&(personal=1) then
nota=1
cuerda=1
goto elija_cuerda
endif
goto golpea
porta.1=1
return
"*******************************************************************************
"Subrrutina para escoger el modo de operación: automática o manual *
"*******************************************************************************
modo:
porta.2=1
if escoge=0 then
lcdout $FE,$80,1,"MODO:"
escoge=1
endif
if adelante=1 then auto=1
if atras=1 then auto=0
adelante=0
atras=0
;despliegue del LCD
if auto=1 then
lcdout $FE,$C3,"AUTOMATICO >" ; ________________
ENDIF ;|#####MODO:######|
;|AUTOMATICO_____>|
;|________________|
if auto=0 then
lcdout $FE,$C0,"< MANUAL "
ENDIF
IF (enter=1)&(escoge=1) THEN
fase=1
adelante=1
atras=0
escoge=0
endif
porta.2=0
gosub display
"*******************************************************************************
"Subrrutina para escoger el tipo de afinación: preestablecida o personalizada *
"*******************************************************************************
tipo:
if escoge=0 then
LCDOUT $FE,$80,1,"TIPO: "
escoge=1
endif
if adelante=1 then personal=0
if atras=1 then personal=1
;LCD
if personal=0 then
LCDOUT $FE,$C0,3,"PREESTABLECIDO >" ; ________________
endif ;|#####TIPO:######|
;|PREESTABLECIDO_>|
;|________________|
if personal=1 then ; ________________
LCDOUT $FE,$C0,3,"< PERSONALIZADO" ;|#####TIPO:######|
endif ;|<#PERSONALIZADO#|
;|________________|
IF enter=1 THEN
fase=2
enter=0
atras=0
adelante=1
escoge=0
endif
gosub display
"*******************************************************************************
"Subrrutina para elejir cuerda en tipo personalizada *
"*******************************************************************************
elija_cuerda:
if escoge=0 then
LCDOUT $FE,1
escoge=1
lcdout $FE,$84,"CUERDA:"
endif
if adelante=1 then cuerda=cuerda+1 max 6
if atras=1 then cuerda=cuerda-1 min 1
ADELANTE=0
ATRAS=0
"Rutina que busca las letras de la cuerda seleccionada para luego desplegarla
bcuerda:
lookup index,["0 PRIMERA >0< SEGUNDA >0< TERCERA >0< CUARTA >0< QUINTA >0< SEXTA 0"],letra
if (id=1)&(letra!="0"
then
gosub despliega
endif
if (id=1)&(letra="0"
then
goto salte
endif
if (id=0)&(letra="0"
then
index=index+1
if index=cuerda then
id=1
index=index+1
endif
endif
goto bcuerda
salte:
id=2
index=0
letra=0
espa=0
if enter=1 then
fase=2
enter=0
adelante=1
escoge=0
gosub cuerdas
LCDOUT $FE,1
endif
gosub display
"*******************************************************************************
"Subrrutina para elejir nota en tipo personalizada *
"*******************************************************************************
elija_nota:
lcdout $FE,$80," NOTA: "
if adelante=1 then nota=nota+1 max notamax
if atras=1 then nota=nota-1 min notamin
adelante=0
atras=0
gosub notas
busca:
lookup index,["0C20Cs2_Db20D20Ds2_Eb20E2_Fb20Es2_F20Fs2_Gb20G20Gs2_Ab20A20As2_Bb20B2_Cb20C3_Bs20Cs3_Df30D30Ds3_Ef30E3_Ff30F3_Es30Fs3_Gf30G30Gs3_Af30A30As3_Bf30B3_Cf40C4_Bs30Cs4_Df40D40Ds4_Ef40E4_Ff40F4_Es40Fs4_Gf40G4"],letra
if (id=1)&(letra!="0"
then
gosub despliega
endif
if (id=1)&(letra="0"
then
goto salte_2
endif
if (id=0)&(letra="0"
then
index=index+1
if index=nota then
id=1
index=index+1
endif
endif
goto busca
salte_2:
id=0
letra=0
espa=0
index=0
letra=0
if enter=1 then
fase=3
adelante=1
enter=0
LCDOUT $FE,1
endif
return
"*******************************************************************************
"Subrrutina para elejir afinación en tipo preestablecida *
"*******************************************************************************
elija_afinacion:
IF escoge=0 then
LCDOUT $FE,$80," AFINACION: "
pause 2000
LCDOUT $FE,2
escoge=1
endif
if adelante=1 then afina=afina+1 max 13
if atras=0 then afina=afina-1 min 1
adelante=0
atras=0
if afina=1 then
if cuerda=1 then nota=29
if cuerda=2 then nota=24
if cuerda=3 then nota=20
if cuerda=4 then nota=15
if cuerda=5 then nota=10
if cuerda=6 then nota=5
ENDIF
if afina=2 then
if cuerda=1 then nota=29
if cuerda=2 then nota=24
if cuerda=3 then nota=21
if cuerda=4 then nota=17
if cuerda=5 then nota=12
if cuerda=6 then nota=5
ENDIF
if afina=3 then
if cuerda=1 then nota=27
if cuerda=2 then nota=22
if cuerda=3 then nota=18
if cuerda=4 then nota=13
if cuerda=5 then nota=8
if cuerda=6 then nota=3
ENDIF
if afina=4 then
if cuerda=1 then nota=27
if cuerda=2 then nota=22
if cuerda=3 then nota=19
if cuerda=4 then nota=15
if cuerda=5 then nota=10
if cuerda=6 then nota=3
ENDIF
if afina=5 then
if cuerda=1 then nota=29
if cuerda=2 then nota=24
if cuerda=3 then nota=20
if cuerda=4 then nota=15
if cuerda=5 then nota=10
if cuerda=6 then nota=3
ENDIF
if afina=6 then
if cuerda=1 then nota=27
if cuerda=2 then nota=24
if cuerda=3 then nota=20
if cuerda=4 then nota=15
if cuerda=5 then nota=10
if cuerda=6 then nota=3
ENDIF
if afina=7 then
if cuerda=1 then nota=27
if cuerda=2 then nota=22
if cuerda=3 then nota=20
if cuerda=4 then nota=15
if cuerda=5 then nota=10
if cuerda=6 then nota=3
ENDIF
if afina=8 then
if cuerda=1 then nota=25
if cuerda=2 then nota=20
if cuerda=3 then nota=16
if cuerda=4 then nota=11
if cuerda=5 then nota=6
if cuerda=6 then nota=1
ENDIF
if afina=9 then
if cuerda=1 then nota=29
if cuerda=2 then nota=25
if cuerda=3 then nota=20
if cuerda=4 then nota=13
if cuerda=5 then nota=8
if cuerda=6 then nota=1
ENDIF
if afina=10 then
if cuerda=1 then nota=29
if cuerda=2 then nota=26
if cuerda=3 then nota=22
if cuerda=4 then nota=17
if cuerda=5 then nota=10
if cuerda=6 then nota=5
ENDIF
if afina=11 then
if cuerda=1 then nota=27
if cuerda=2 then nota=24
if cuerda=3 then nota=20
if cuerda=4 then nota=15
if cuerda=5 then nota=8
if cuerda=6 then nota=3
ENDIF
if afina=12 then
if cuerda=1 then nota=29
if cuerda=2 then nota=24
if cuerda=3 then nota=20
if cuerda=4 then nota=15
if cuerda=5 then nota=8
if cuerda=6 then nota=3
ENDIF
if afina=13 then
if cuerda=1 then nota=18
if cuerda=2 then nota=13
if cuerda=3 then nota=21
if cuerda=4 then nota=17
if cuerda=5 then nota=11
if cuerda=6 then nota=6
ENDIF
lcdout $FE,$C0,"cuer:",#cuerda
"Rutina para buscar los tipos de afinación y desplegarlos posteriormente
busca2:
lookup index,["0STANDARD E >0< OPEN E >0< STANDARD D >0< OPEN D >0< DROP D >0<DOUBLE DROP D >0< D SUSPENDED >0< STANDARD O >0< OPEN C >0< OPEN A >0< OPEN G >0< G6th >0< STANDARD F >0"],letra
if (id=1)&(letra!="0"
then
gosub despliega2
endif
if (id=1)&(letra="0"
then
id=2
index=0
letra=0
espa=0
goto busca2
endif
if (id=0)&(letra="0"
then
index=index+1
if index=afina then
id=1
index=index+1
endif
endif
goto busca2
busca2_1:
lookup index,["0EADGBE0EBEG#BE0DGCFAD0DADF#BE0DADGBE0DADGBD0DADGAD0CFBbEbGC0CGCGCE0EAEAC#E0DGDGBD0DGDGBE0FBbEG#CF0"],letra
if (id=3)&(letra!="0"
then
gosub despliega2
endif
if (id=3)&(letra="0"
then
goto salte_3
endif
if (id=2)&(letra="0"
then
index=index+1
if index=afina then
id=3
index=index+1
endif
endif
goto busca2_1
salte_3:
id=0
letra=0
espa=0
index=0
letra=0
if enter=1 then
enter=0
gosub cuerdas
gosub notas
fase=3
adelante=0
escoge=0
endif
gosub display
"*******************************************************************************
"Subrrutina que busca la nota pedida y la guarda *
"*******************************************************************************
notas:
lookup2 nota,[0,c2,Cs2_Db2,D2,Ds2_Eb2,E2_Fb2,Es2_F2,Fs2_Gb2,G2,Gs2_Ab2,A2,As2_Bb2,B2_Cb2,C3_Bs2,Cs3_Df3,D3,Ds3_Ef3,E3_Ff3,F3_Es3,Fs3_Gf3,G3,Gs3_Af3,A3,As3_Bf3,B3_Cf4,C4_Bs3,Cs4_Df4,D4,Ds4_Ef4,E4_Ff4,F4_Es4,Fs4_Gf4,G4],ncentral
return
"*******************************************************************************
"Rutinas de despliege en el LDC para notas, afinaciones y para cuerdas *
"*******************************************************************************
despliega:
lcdout $FE,$C0+espa,letra
espa=espa+1
index=index+1
return
despliega2:
if id=1 then
lcdout $FE,$80+espa,letra
endif
if id=3 then
lcdout $FE,$C8+espa,letra
endif
espa=espa+1
index=index+1
return
"*******************************************************************************
"Subrrutina que asigna las características de la cuerda a afinar *
"*******************************************************************************
cuerdas:
if cuerda=1 then
permin=229
permax=629
notamax=18
notamin=32
nota=notamin
pausa=0
divisor=1
z=2
endif
if cuerda=2 then
permin=324
permax=840
notamax=13
notamin=26
nota=notamin
pausa=10
divisor=2
z=1
endif
if cuerda=3 then
permin=409
permax=840
notamax=13
notamin=22
nota=notamin
pausa=50
divisor=3
Z=0
endif
if cuerda=4 then
permin=515
permax=1000
notamax=10
notamin=18
nota=notamin
PAUSA=800
divisor=3
Z=0
endif
if cuerda=5 then
permin=730
permax=1681
notamax=1
notamin=13
nota=notamin
PAUSA=800
divisor=3
Z=0
endif
if cuerda=6 then
permin=790
permax=1681
notamax=1
notamin=12
nota=notamin
PAUSA=800
divisor=3
z=0
endif
return
"*******************************************************************************
"Subrrutina que prepara al ususario para colocar el brazo y golpear la cuerda *
"*******************************************************************************
golpea:
LCDOUT $FE,$1
if (auto=1)&(escoge=0) then
lcdout $FE,$80,"COLOQUE EL BRAZO"
lcdout $FE,$C0,"EN LA CLAVIJA >"
high porta.1
escoge=1
ENDIF
IF adelante=1 THEN
lcdout $FE,$80,"GOLPEE LA CUERDA"
high porta.2
adelante=0
endif
gosub display
END