Programar puerto serie o puertos de expansion del Spectrum

Foro dedicado a la programación en todo tipo de sistemas clásicos.
REHome
Amstrad PCW 8256
Amstrad PCW 8256
Mensajes: 145
Registrado: 19 Abr 2013, 22:01
Sistema Favorito: Spectrum +2
primer_sistema: Spectrum +2
Gracias dadas: 3 veces
Gracias recibidas: 2 veces

Programar puerto serie o puertos de expansion del Spectrum

Mensajepor REHome » 27 Abr 2013, 09:28

Hola:

Tengo un ZX Spectrum +2A 128K negro. Veo que tiene el puerto serie. Para comunicarlo con los demás dispositivos externo e incluso enviar mensajes por ahí para comunicarlo con otro Spectrum por poner un ejemplo.

Sólo necesito usar el pin 2, 3 y masa, con eso me basta para hacer experimento con él. Quiero hacerles unas preguntas.

1) El estandar en baudios del puerto RS232 es 9600 baudios. ¿Es capaz el Spectrum alcanzar esa velocidad?

2) ¿Qué velocidad alcanza como máximo?

Se que es para imprimir en la impresora, mi idea es enviar carácteres a la salida del RS232 del Spectrum, por ejemplo una letra como la "A", o que mensaje que diga: "Hola mundo".

Quiero hacer un ejemplo en Basic 128K que en pantalla mueste 4 letras, por ejemplo.

Pulse estas teclas:
A) Envía la letra "A".
B) Envía la letra "B".
C) Envía la letra "C".
D) Envía la letra "D".

En pantalla, abajo o arriba que ponga un texto que muestre. "Haz pulsado la tecla C".

No se programación Basic. ¿Es muy complejo de hacer?

Un cordial saludo.
Última edición por REHome el 10 Dic 2013, 01:58, editado 1 vez en total.

Avatar de Usuario
mcleod_ideafix
Amiga 2500
Amiga 2500
Mensajes: 5316
Registrado: 06 Oct 2009, 04:12
Sistema Favorito: Spectrum 16Kb/48Kb
primer_sistema: Spectrum 16Kb/48Kb
consola_favorita: Vectrex
Primera consola: TV Games/Pong Clone
Ubicación: Jerez de la Frontera
Gracias dadas: 12 veces
Gracias recibidas: 53 veces
Contactar:

Re: Programar puerto serie

Mensajepor mcleod_ideafix » 27 Abr 2013, 11:04

REHome escribió:No se programación Basic. ¿Es muy complejo de hacer?

Un cordial saludo.


Yo nunca he neceitado el puerto serie, así que no sé exactamente cómo se hace, pero eso debería venir explicado en el manual de BASIC del 128K. ¿Le has echado un vistazo?
Recuerda: cada vez que se implementa un sistema clásico en FPGA, Dios mata a un purista

Avatar de Usuario
zup
Amiga 2500
Amiga 2500
Mensajes: 2967
Registrado: 04 Sep 2009, 20:07
Sistema Favorito: Spectrum 16Kb/48Kb
primer_sistema: Spectrum 16Kb/48Kb
consola_favorita: Nintendo DS/3DS
Primera consola: Nintendo GameBoy
Ubicación: Navarra
Gracias dadas: 68 veces
Gracias recibidas: 322 veces
Contactar:

Re: Programar puerto serie

Mensajepor zup » 27 Abr 2013, 11:24

Según el manual (inglés) del +3:

- FORMAT LINE <baudios> para cambiar velocidad.
- FORMAT LPRINT "R" para que LPRINT imprima por puerto serie.
- LPRINT "loquesea" para imprimir.

También puedes usar el canal "p" para mandar datos a la impresora, pero de entrada quizás no quieras complicarte tanto la vida.

Otras cosillas son que el +3 siempre usa hardware flow control, lo que significa que tu cable debería tener también DTR/DSR y CTS/RTS bien conectados (en el manual dicen cortocircuitar los pines 4 y 5). Lo que no veo por ninguna parte es cuántos bits transmite por byte, tipo de paridad y bits de parada (y cómo, si es que se pueden, cambiar estos parámetros).

En cuanto a velocidad... creo que el máximo absoluto teórico eran los 38400, pero algún bug (no sé si de firmware o de hardware) impedía utilizarlos. Me suena que en condiciones "normales" 19200 era el máximo, y en el manual dicen que 9600 es la velocidad por defecto (así que te debería funcionar siempre).
I have traveled across the universe and through the years to find Her. Sometimes going all the way is just a start.
Además vendo cosas!

REHome
Amstrad PCW 8256
Amstrad PCW 8256
Mensajes: 145
Registrado: 19 Abr 2013, 22:01
Sistema Favorito: Spectrum +2
primer_sistema: Spectrum +2
Gracias dadas: 3 veces
Gracias recibidas: 2 veces

Re: Programar puerto serie

Mensajepor REHome » 27 Abr 2013, 12:20

Hola:

En el manual le he echado el ojo, no te explica demasiado. Como dices, falta la paridad, si son datos asíncronos o síncronos, cosas así. De todas maneras, con el HyperTerminal de Windows lo puedo averiguar haciendo pruebas. Intentaré aprender algo de BASIC para Spectrum, hasta la calculadora CASIO de 32K que tengo usa Basic.

Me imagino que pondré para el puerto serie:

Código: Seleccionar todo

10 FORMAT LPRINT "R" REM Seleccionar puerto serie.
20 PRINT "Zona de pruebas"
30 PRINT "A) Envía letra A."
30 PRINT "B) Envía letra B."
30 PRINT "C) Envía letra C."
30 PRINT "D) Envía letra D."
40 LPRINT "A"


No se como hacerlo en BASIC, voy a leer el manual. Tengo que lograr esto que si se hacer en C#.
Hay que usar while para que leer completo el menú mostrado en pantalla y switch para escoger las opociones.

En resumen de lo que quiero hacer.
En la pantalla debe aparecer el menú escrito arriba. Por cada botón que pulse, por ejemplo la letra "A" del teclado, envía por el puerto serie la letra "A", de paso, en la pantalla del TV debe aparecer este mensaje algo así:

Haz pulsado la letra "A".

Todo esto programado bajo BASIC del Spectrum. Ahora mismo echo un vistazo al libro para manejar bien la introducción de datos como entrada y salida, bueno, salida es PRINT, LPRINT para puerto serie. Los que quieran aprotar código en bienvenido.

Cuando consiga manejar el menú o envío de carácteres, me encargo de la electrónica que mostaré en fotos.

Gracias por reponder.

Avatar de Usuario
zup
Amiga 2500
Amiga 2500
Mensajes: 2967
Registrado: 04 Sep 2009, 20:07
Sistema Favorito: Spectrum 16Kb/48Kb
primer_sistema: Spectrum 16Kb/48Kb
consola_favorita: Nintendo DS/3DS
Primera consola: Nintendo GameBoy
Ubicación: Navarra
Gracias dadas: 68 veces
Gracias recibidas: 322 veces
Contactar:

Re: Programar puerto serie

Mensajepor zup » 27 Abr 2013, 18:47

En el BASIC de Sinclair no existe un "caso de..." (switch), pero se puede simular. La forma más sencilla es poner algo así:

Código: Seleccionar todo

100 LET A$=INKEY$
110 IF A$="A" OR A$="a" THEN LPRINT "A": GO TO 100
110 IF A$="B" OR A$="b" THEN LPRINT "B": GO TO 100
120 IF A$="C" OR A$="c" THEN LPRINT "C": GO TO 100
130 IF A$="D" OR A$="d" THEN LPRINT "D": GO TO 100
140 GO TO 100


El BASIC de Sinclair tampoco tiene bucles tipo "mientras" o "repetir... hasta". Solo dispones de bucles "para" (FOR) y de la sentencia GO TO. Como siempre, se pueden simular. Te pongo unos cuantos bucles de ejemplo (todo de memorieta):

Bucle FOR (muy diferente del de C), para 100 iteraciones

Código: Seleccionar todo

100 FOR I=1 TO 100
110 PRINT I; " ";
120 NEXT I

Se imprimirán los números del 1 al 100 separados por espacios.

Bucle FOR, para los números entre 20 y 40 con paso 4.

Código: Seleccionar todo

100 FOR I=20 TO 40 STEP 4
110 PRINT I; " ";
120 NEXT I

Se imprimirán los números 20, 24, 28, 32, 36 y 40 (separados por espacios).

Bucle repetir...hasta.

Código: Seleccionar todo

10 LET A=0

100 LET A$=INKEY$
110 IF A$<>"" THEN LET A=A+1
120 PRINT A$;
130 IF A<>15 THEN GO TO 100

200 PRINT AT 10,10;A

Primero se inicializa el contador de iteraciones. El bucle "repetir" empieza en la línea 100 y el "hasta" está en la 130. El bucle cuenta cuántas veces tiene una tecla pulsada, y se repite hasta que ha acumulado 15 teclas (NOTA: Si pasas dos veces por el INKEY$ sin soltar la tecla, cuenta como dos pulsaciones). Por último, se imprime el valor de A (y si lo he hecho bien, debería ser 15).

Bucle mientras.

Código: Seleccionar todo

10 LET A=0
20 PAUSE 0

100 IF A$<>"a" THEN GO TO 150
110 LET A=A+1
120 LET A$=INKEY$
130 GO TO 100

200 PRINT AT 10,10;A

Las líneas 10 y 20 inicializan el contador A y esperan hasta que se pulse una tecla. El bucle "mientras" empieza en la línea 100 y acaba en la 130. Este bucle contará las vueltas que da mientras se esté pulsando la tecla "a". Del bucle se sale saltando a una línea por detrás de la última (la 130). En este caso, como la línea 150 no existe, seguiría por la 200 e imprimiría el contador de vueltas.

Espero no equivocarme en nada.
I have traveled across the universe and through the years to find Her. Sometimes going all the way is just a start.
Además vendo cosas!

REHome
Amstrad PCW 8256
Amstrad PCW 8256
Mensajes: 145
Registrado: 19 Abr 2013, 22:01
Sistema Favorito: Spectrum +2
primer_sistema: Spectrum +2
Gracias dadas: 3 veces
Gracias recibidas: 2 veces

Re: Programar puerto serie

Mensajepor REHome » 08 Dic 2013, 08:01

Hola:

Muchas gracias zup por los códigos de arriba, también los que han aportado información. Tendré que ponerme en forma.

Retornando otra vez al Spectrum (por fin reparado del todo) quiero hacer un menú como indican arriba. Me he olvidado hasta de lo más básico y debo aprender de nuevo. Para los que tienen soltura en basic 128 K, quieran ayudar y hacer códigos, mi propuesta es esta. Hacer un buen menú principal del Spectrum, consiste en controlar le puerto serie del Spectrum para salidas y entradas de datos. En otras palabras, para jugar con él, curiosidad y hacer cosas nuevas que al parecer no usan mucho por estos foros el puerto serie, por ahora y que yo sepa. ;)

Voy a controlar el puerto serie con un microcontrolador, usaré un display de 16x2 para probar y otro más grande 20x4. Por ahora estoy haciendo un simulador y funciona desde el PIC.
Imagen

Preguntas en el spoiler.
Spoiler: Mostrar
1) ¿De qué se trata?
Consiste que desde el menú del Spectrum sea capaz de controlar el puerto serie.

2) ¿Qué controla Spectrum?
Controla un microcontrolador, por ahora como salida y entrada de datos. Por ahora controla encender y apagar Led. También detecta cuando se ha pulsado un botón desde el PIC y Spectrum lee dichos datos y lo muestra en pantalla, todo por puerto serie.

3) ¿Para qué un LCD?
Para mostrar información en tiempo real cuando un Led, ventilador, relés, motores, altavoz, sensores de temperatura y muchos dispositivos más. También se verán reflejados en el TV bajo del Spectrum.

4) ¿Por qué usar pantalla TV y LCD al mismo tiempo?
No es necesario usar las dos pantallas al mismo tiempo. Spectrum podrá visualizar desde el LCD sin usar el TV el control del dispositivo a través del puerto serie. Si quieres que Spectrum haga de autómata o domótica y el PIC de actuador a las 24 horas como, por poner un ejemplo, tengo un jardín, al lado hay un cuarto de cristal con otro jardín solo para bonsáis. En él, Spectrum controla el regadía automático solo de 00:00 hasta las 02:00 de la mañana. Sabe cuando es de día o de noche. Cuando hace mucho calor o la temperatura ambiente es muy alta, si la temperaturta es alta, se abren las ventanas del techo con un motor dedicado a ello, se activan los ventiladores en su interior y mil cosas más, hasta donde te llega la imaginación. En el LCD solo se muestran números y letras, en el TV gracias al Spectrum, muestra dibujos, se puede hacer una simulación en dibujo con coordenadas, el jardín, abriendo las ventanas, ventilador girando, etc.

5) ¿Habiendo autómatas, Raspberry Pi y Arduino, para qué usar Spectrum?
Por temas didacticos, a aprender nuevas experiencas con el tema de los ordenadores de antes y un largo etc.

6) ¿Spectrum controla o es el microcontrolador?
Depende como lo programes, puede hacer Spectrum como autómata y microcontrolador como actuador. Sólo lo gobierna Spectrum. Spectrum puede hacer solo de consola para pulsar botones para dar órdenes, pero los timepos y programas el microcontrolador puede controlar Spectrum y el jardín si así se desea. El PIC controla la situación y envía datos al Spectrum que refleja en el TV. Hay muchas ideas en la imaginación. Como quieras programarlo. El PIC no necesita Spectrum para hacer el trabajo del jardín de los bonsáis si se le programa así.

7) Querido lector, ¿alguna pregunta o sugerencia?


Código en asm para el PIC16F887 para los que le pican la curiosidad. (Aún en proceso de desarrollo).
Spoiler: Mostrar

Código: Seleccionar todo

; ZONA DE DATOS *******************************************************

   LIST      P=16F887
   INCLUDE      <P16F887.INC>
   __CONFIG    _CONFIG1, _LVP_OFF & _FCMEN_OFF & _IESO_OFF & _BOR_OFF & _CPD_OFF & _CP_OFF & _MCLRE_ON & _PWRTE_ON & _WDT_OFF & _XT_OSC
   __CONFIG    _CONFIG2, _WRT_OFF & _BOR21V
   __IDLOCS   0x1234
   ERRORLEVEL   -302   

   CBLOCK   0x20      
   TeclaPulsada               ; Va a guardar el contenido de la tecla pulsada.
   MensajeApuntado               ; Va a guarda la dirección del mensaje apuntado.
   Relays                     ; Estado de los relays
   Estado                     ; Estado general
   ENDC         

#DEFINE      PEntradasB   PORTB      ; Define puerto de salidas.
#DEFINE      EntradaR1B   0         ; Define dónde se sitúa cada salidas.
#DEFINE      EntradaR2B   1         
#DEFINE      EntradaR3B   2         
#DEFINE      EntradaR4B   3
#DEFINE      EntradaR5B   4         
#DEFINE      EntradaR6B   5         
#DEFINE      EntradaR7B   6
#DEFINE      EntradaR8B   7
#DEFINE      PSalidasD   PORTD   
#DEFINE      SalidaR1D   0         
#DEFINE      SalidaR2D   1         
#DEFINE      SalidaR3D   2         
#DEFINE      SalidaR4D   3
#DEFINE      SalidaR5D   4         
#DEFINE      SalidaR6D   5         
#DEFINE      SalidaR7D   6
#DEFINE      SalidaR8D   7
#DEFINE      Seleccion   PORTE,2      ; Selección manual/serie con un pulsador.


TECLA_RELE_1_ON      EQU   'q'         ; Código de las teclas utilizadas.
TECLA_RELE_1_OFF   EQU   'a'
TECLA_RELE_2_ON      EQU   'w'
TECLA_RELE_2_OFF   EQU   's'
TECLA_RELE_3_ON      EQU   'e'
TECLA_RELE_3_OFF   EQU   'd'
TECLA_RELE_4_ON      EQU   'r'
TECLA_RELE_4_OFF   EQU   'f'
TECLA_RELE_5_ON      EQU 't'
TECLA_RELE_5_OFF   EQU 'g'
TECLA_RELE_6_ON      EQU 'y'
TECLA_RELE_6_OFF   EQU 'h'
TECLA_RELE_7_ON      EQU 'u'
TECLA_RELE_7_OFF   EQU 'j'
TECLA_RELE_8_ON      EQU 'i'
TECLA_RELE_8_OFF   EQU 'k'
TECLA_INICIO      EQU 'z'
TECLA_PARADA      EQU   ' '         ; Código de la tecla espaciadora, (hay un espacio,
                           ; tened cuidado al teclear el programa).
TECLA_INFO         EQU 'n'         
                           
ENTER            EQU   0x0A      ; Código de tecla "Enter" o "Retorno de Carro".
CAMBIO_LINEA      EQU   0x0D      ; Código para el cambio de línea.

   ORG   0x2100                  ; Corresponde a la dirección 0 de la zona EEPROM
                           ; de datos.
   DE   0x00,2,3

;****************************************************************************
;*                        ZONA DE CODIGOS                        *
;****************************************************************************

;****************************************************************************
;*                        Rutina Principal                     *
;****************************************************************************

   ORG   0x00
   goto   Inicio

;   ORG   4                     ; Aquí se sitúa el vector de interrupción para
;   goto   LeeEntradasVisualiza   ; atender las subrutinas de interrupción.


Inicio
   call   LCD_Inicializa         ; Inicializa el display LCD
   call   RS232_Inicializa      ; Inicializa RS232.                                     
   bsf      PEntradasB,EntradaR1B   
   bsf      PEntradasB,EntradaR2B   
   bsf      PEntradasB,EntradaR3B   
   bsf      PEntradasB,EntradaR4B   
   bsf      PEntradasB,EntradaR5B   
   bsf      PEntradasB,EntradaR6B   
   bsf      PEntradasB,EntradaR7B   
   bsf      PEntradasB,EntradaR8B               
   bcf      PSalidasD,SalidaR1D
   bcf      PSalidasD,SalidaR2D
   bcf      PSalidasD,SalidaR3D
   bcf      PSalidasD,SalidaR4D
   bcf      PSalidasD,SalidaR5D
   bcf      PSalidasD,SalidaR6D
   bcf      PSalidasD,SalidaR7D
   bcf      PSalidasD,SalidaR8D
   BANKSEL   CM1CON0
   movlw   b'00000111'
   movwf   CM1CON0
   movwf   CM2CON0
   movwf   CM2CON1                 
    BANKSEL   ANSEL
    clrf   ANSEL
    clrf   ANSELH
    BANKSEL   TRISB
   movlw   b'11111111'
    movwf   TRISB
   clrw
   clrf   TRISD
    BANKSEL   PORTD

   call   Parado               ; En principio todas las salidas deben estar
   movlw   0x02
   call   EEPROM_LeeDato
   movwf   Relays   
   call   Ejecutar            ; Enciende o apaga reles seleccionados
   call   Mensaje_Reles
   call    Visualiza            ; Muestra mensaje en el display

   call   RS232_LineasBlanco      ; Visualiza unas cuantas líneas en blanco
   call   RS232_LineasBlanco      ; para limpiar la pantalla.
;   movlw   b'10001000'            ; Habilita la interrupción RBI y la general.
;   movwf   INTCON

;   btfss   PEntradasC,EntradaR1C            ; ¿Bit 0 del PORTA es "1"?
;   goto   D1_OFF
;   bsf      PSalidasD,SalidaR1D
;   goto   Principal
;D1_OFF
;   bcf      PSalidasD,SalidaR1D


;Aqui
;   btfss   Seleccion
;   goto   Principal
;   goto   LeeEntradasVisualiza
;   sleep
;   goto   Aqui

Principal                     ; apagadas.
   call   RS232_LeeDato         ; Espera a recibir un carácter.
   call   TesteaTeclado         ; Verifica caracter recibido y ejecuta accion
   call   Ejecutar            ; Enciende o apaga reles seleccionados
   call    Visualiza            ; Muestra mensaje en el display

   call   Guardar_EEPROM

;   btfsc   Seleccion
;   goto   Aqui
   goto   Principal            ; Loop Infinito

;****************************************************************************
;*                        Mensajes                           *
;****************************************************************************
Mensajes
   addwf   PCL,F
MensajeParado
   DT "Sistema DESACTIVADO ", 0x00
Mensaje_Reles
   DT " 1 2 3 4 5 6 7 8 RL ", 0x00
Mensaje_ON
   DT " 1", 0x00
Mensaje_OFF
   DT " O", 0x00
Mensaje_Cambiolinea
   DT ENTER, CAMBIO_LINEA, 0x00
Mensaje_Mostrarlinea
   DT "----------------", 0x00
Mensaje_Info
   DT "FirmWare v2.15  ", 0x00
   DT ENTER, CAMBIO_LINEA
;   call   LCD_Linea2
;   DT " PIC16F887      "
;   DT ENTER, CAMBIO_LINEA
;   call   Retardo_2s
;   call   LCD_Linea1
;   DT " metaconta      "
;   DT ENTER, CAMBIO_LINEA
;   call   LCD_Linea2
;   DT " @gmail.com     ", 0x00
   call   Retardo_2s
Mensaje_Activar
   DT "   Todos ACTIVOS    ", 0x00
Mensaje_IN
   DT " IN", 0x00
Mensaje_OUT
   DT " OUT", 0x00
Mensaje_Avisos
   DT "***    ALARMA    ***", 0x00
MensajeEntradas
   DT ENTER, CAMBIO_LINEA
   DT " 1 2 3 4 5 6 7 8 IN"
   DT ENTER, CAMBIO_LINEA
   DT "-------------------"
   DT ENTER, CAMBIO_LINEA, 0x00
FinTablaASCII

;****************************************************************************
;*                        Testea Teclado y sensores               *
;*                                                         *
;*   Verifica caracer recibido y decide que accion ejecutar               *
;****************************************************************************

TesteaTeclado   
   movwf   TeclaPulsada         ; Guarda el contenido de la tecla pulsada.
   xorlw   TECLA_RELE_1_ON         ; ¿Es la tecla del movimiento hacia adelante?
   btfsc   STATUS,Z            ;
   goto   R1_ON               ; Sí, se desea movimiento hacia adelante.

   movf   TeclaPulsada,W         ; Recupera el contenido de la tecla pulsada.
   xorlw   TECLA_RELE_1_OFF      ; ¿Es la tecla del movimiento hacia atrás?
   btfsc   STATUS,Z            ;
   goto   R1_OFF               ; Sí, se desea movimiento hacia atrás.

   movf   TeclaPulsada,W         ; Recupera el contenido de la tecla pulsada.
   xorlw   TECLA_RELE_2_ON         ; ¿Es la tecla del movimiento hacia la izquierda?
   btfsc   STATUS,Z            ;
   goto   R2_ON               ; Sí, se desea movimiento hacia la izquierda.

   movf   TeclaPulsada,W         ; Recupera el contenido de la tecla pulsada.
   xorlw   TECLA_RELE_2_OFF      ; ¿Es tecla del movimiento hacia la derecha?
   btfsc   STATUS,Z            ;
   goto   R2_OFF               ; Sí, se desea movimiento hacia la derecha.

   movf   TeclaPulsada,W         ;
   xorlw   TECLA_RELE_3_ON         ;
   btfsc   STATUS,Z            ;
   goto   R3_ON               ;

   movf   TeclaPulsada,W         ;
   xorlw   TECLA_RELE_3_OFF      ;
   btfsc   STATUS,Z            ;
   goto   R3_OFF               ;

   movf   TeclaPulsada,W         ;
   xorlw   TECLA_RELE_4_ON         ;
   btfsc   STATUS,Z            ;
   goto   R4_ON               ;

   movf   TeclaPulsada,W         ;
   xorlw   TECLA_RELE_4_OFF      ;
   btfsc   STATUS,Z            ;
   goto   R4_OFF               ;

   movf   TeclaPulsada,W         ;
   xorlw   TECLA_RELE_5_ON         ;
   btfsc   STATUS,Z            ;
   goto   R5_ON               ;

   movf   TeclaPulsada,W         ;
   xorlw   TECLA_RELE_5_OFF      ;
   btfsc   STATUS,Z            ;
   goto   R5_OFF               ;

   movf   TeclaPulsada,W         ;
   xorlw   TECLA_RELE_6_ON         ;
   btfsc   STATUS,Z            ;
   goto   R6_ON               ;

   movf   TeclaPulsada,W         ;
   xorlw   TECLA_RELE_6_OFF      ;
   btfsc   STATUS,Z            ;
   goto   R6_OFF               ;

   movf   TeclaPulsada,W         ;
   xorlw   TECLA_RELE_7_ON         ;
   btfsc   STATUS,Z            ;
   goto   R7_ON               ;

   movf   TeclaPulsada,W         ;
   xorlw   TECLA_RELE_7_OFF      ;
   btfsc   STATUS,Z            ;
   goto   R7_OFF               ;

   movf   TeclaPulsada,W         ;
   xorlw   TECLA_RELE_8_ON         ;
   btfsc   STATUS,Z            ;
   goto   R8_ON               ;

   movf   TeclaPulsada,W         ;
   xorlw   TECLA_RELE_8_OFF      ;
   btfsc   STATUS,Z            ;
   goto   R8_OFF               ;

   movf   TeclaPulsada,W         ;
   xorlw   TECLA_INICIO         ;
   btfsc   STATUS,Z            ;
   goto   Activar               ;

   movf   TeclaPulsada,W         ;
   xorlw   TECLA_INFO            ;
   btfsc   STATUS,Z            ;
   goto   Info               ;

   movf   TeclaPulsada,W         ; Recupera el contenido de la tecla pulsada.
   xorlw   TECLA_PARADA         ; ¿Es la tecla de parada?.
   btfss   STATUS,Z
   return                     ; No es ninguna tecla de movimiento. Sale.

;------------------------------------------------------------------------------------------------

Parado
   movlw   0x02               ; Muestra mensaje 02
   movwf   Estado               ;
   movlw   0x00               ; Como se ha pulsado la tecla de parada se
   movwf   Relays               ; desactivan todas las salidas.
   return

R1_ON
   movlw   0x00               ; Muestra estado relays
   movwf   Estado               ;
   bsf      Relays,SalidaR1D         ; Activa Relay 1
   return                     ;

R1_OFF
   movlw   0x00               ; Muestra estado relays
   movwf   Estado               ;
   bcf      Relays,SalidaR1D         ; Desctiva Relay 1
   return                     ;

R2_ON
   movlw   0x00               ; Muestra estado relays
   movwf   Estado               ;
   bsf      Relays,SalidaR2D         ; Activa Relay 2
   return                     ;

R2_OFF
   movlw   0x00               ; Muestra estado relays
   movwf   Estado               ;
   bcf      Relays,SalidaR2D         ; Desctiva Relay 2
   return                     ;

R3_ON
   movlw   0x00               ; Muestra estado relays
   movwf   Estado               ;
   bsf      Relays,SalidaR3D         ; Activa Relay 3
   return                     ;

R3_OFF
   movlw   0x00               ; Muestra estado relays
   movwf   Estado               ;
   bcf      Relays,SalidaR3D         ; Desctiva Relay 3
   return                     ;

R4_ON
   movlw   0x00               ; Muestra estado relays
   movwf   Estado               ;
   bsf      Relays,SalidaR4D         ; Activa Relay 4
   return                     ;

R4_OFF
   movlw   0x00               ; Muestra estado relays
   movwf   Estado               ;
   bcf      Relays,SalidaR4D      ; Desctiva Relay 4
   return                     ;

R5_ON
   movlw   0x00               ; Muestra estado relays
   movwf   Estado               ;
   bsf      Relays,SalidaR5D      ; Desctiva Relay 5
   return

R5_OFF
   movlw   0x00               ; Muestra estado relays
   movwf   Estado               ;
   bcf      Relays,SalidaR5D      ; Desctiva Relay 5
   return

R6_ON
   movlw   0x00               ; Muestra estado relays
   movwf   Estado               ;
   bsf      Relays,SalidaR6D      ; Desctiva Relay 6
   return

R6_OFF
   movlw   0x00               ; Muestra estado relays
   movwf   Estado               ;
   bcf      Relays,SalidaR6D      ; Desctiva Relay 6
   return

R7_ON
   movlw   0x00               ; Muestra estado relays
   movwf   Estado               ;
   bsf      Relays,SalidaR7D      ; Desctiva Relay 7
   return

R7_OFF
   movlw   0x00               ; Muestra estado relays
   movwf   Estado               ;
   bcf      Relays,SalidaR7D      ; Desctiva Relay 7
   return

R8_ON
   movlw   0x00               ; Muestra estado relays
   movwf   Estado               ;
   bsf      Relays,SalidaR8D      ; Desctiva Relay 8
   return

R8_OFF
   movlw   0x00               ; Muestra estado relays
   movwf   Estado               ;
   bcf      Relays,SalidaR8D      ; Desctiva Relay 8
   return

Activar
   movlw   0x03               ; Muestra mensaje 03
   movwf   Estado               ;
   bsf      Relays,SalidaR1D         ; Activa Relay 1
   bsf      Relays,SalidaR2D         ; Activa Relay 2
   bsf      Relays,SalidaR3D         ; Activa Relay 3
   bsf      Relays,SalidaR4D         ; Activa Relay 4
   bsf      Relays,SalidaR5D         ; Activa Relay 6
   bsf      Relays,SalidaR6D         ; Activa Relay 7
   bsf      Relays,SalidaR7D         ; Activa Relay 8
   bsf      Relays,SalidaR8D         ; Activa Relay 9
   return

Info
   movlw   0x01               ; Muestra mensaje 01
   movwf   Estado               ;
   return

;****************************************************************************
;*                        Ejecutar                           *
;*   Obtiene estado de los relays y los activa en el puerto adecuado         *
;****************************************************************************
Ejecutar
   movf   Relays,W            ; Carga estado de relays
   movwf   PSalidasD            ; en el puerto asignado
   Return

;****************************************************************************
;*                        Visualiza                           *
;* Según el estado de las salidas visualiza el estado del sistema en el      *
;* visualizador LCD y en el monitor del ordenador.                     *
;****************************************************************************
Visualiza
   movf   Estado,W            ; Mensaje 00?
   xorlw   0x00               ;
   btfsc   STATUS,Z            ;
   goto   MostrarRelays         ; Si, muestra estado de relays

   movf   Estado,W            ; Mensaje 01?
   xorlw   0x01               ;
   btfsc   STATUS,Z            ;
   goto   MostrarVersion         ; Si, muestra version

   movf   Estado,W            ; Mensaje 02?
   xorlw   0x02               ;
   btfsc   STATUS,Z            ;
   goto   MostrarParado         ; Si, muestra parado

   movf   Estado,W            ; Mensaje 03?
   xorlw   0x03               ;
   btfsc   STATUS,Z            ;
   goto   MostrarActivado         ; Si, muestra activado

   clrf   Estado               ; ERROR!!!!, Reinicia variable de estado

MostrarRelays
   call   LCD_Borra            ; Borra la pantalla del modulo LCD.
   movlw   Mensaje_Reles         ; Muestra primera linea de mensaje
   call   LCD_Mensaje            ; " R1 R2 R3 R4"
   call   LCD_Linea3            ; Selecciona 3a linea de display

   call   RS232_LineasBlanco      ; Borra la pantalla del ordenador.
   movlw   Mensaje_Mostrarlinea   ;
   call   RS232_Mensaje
   movlw   Mensaje_Cambiolinea
   call   RS232_Mensaje
   movlw   Mensaje_Reles         ; Lo visualiza en el HyperTerminal.
   call   RS232_Mensaje
   call   RS232_LineasBlanco
   movlw   Mensaje_Cambiolinea
   call   RS232_Mensaje

   btfss   Relays,SalidaR1D         ; Rele 1 encendido?
   goto   Mnsj_R1_OFF            ; No, Escribe OFF

   movlw   Mensaje_ON            ;
   call   LCD_Mensaje            ;
   movlw   Mensaje_ON            ;
   call   RS232_Mensaje
   goto   Mnsj_R2               ;

Mnsj_R1_OFF
   movlw   Mensaje_OFF            ;
   call   LCD_Mensaje            ;
   movlw   Mensaje_OFF            ;
   call   RS232_Mensaje

Mnsj_R2
   btfss   Relays,SalidaR2D         ; Rele 2 encendido?
   goto   Mnsj_R2_OFF            ; No, Escribe OFF

   movlw   Mensaje_ON            ;
   call   LCD_Mensaje            ;
   movlw   Mensaje_ON            ;
   call   RS232_Mensaje
   goto   Mnsj_R3               ;

Mnsj_R2_OFF
   movlw   Mensaje_OFF            ;
   call   LCD_Mensaje            ;
   movlw   Mensaje_OFF            ;
   call   RS232_Mensaje

Mnsj_R3
   btfss   Relays,SalidaR3D         ; Rele 2 encendido?
   goto   Mnsj_R3_OFF            ; No, Escribe OFF

   movlw   Mensaje_ON            ;
   call   LCD_Mensaje            ;
   movlw   Mensaje_ON            ;
   call   RS232_Mensaje
   goto   Mnsj_R4               ;

Mnsj_R3_OFF
   movlw   Mensaje_OFF            ;
   call   LCD_Mensaje            ;
   movlw   Mensaje_OFF            ;
   call   RS232_Mensaje

Mnsj_R4
   btfss   Relays,SalidaR4D         ; Rele 3 encendido?
   goto   Mnsj_R4_OFF            ; No, Escribe OFF

   movlw   Mensaje_ON            ;
   call   LCD_Mensaje            ;
   movlw   Mensaje_ON            ;
   call   RS232_Mensaje
   goto   Mnsj_R5               ;

Mnsj_R4_OFF
   movlw   Mensaje_OFF            ;
   call   LCD_Mensaje            ;
   movlw   Mensaje_OFF            ;
   call   RS232_Mensaje

Mnsj_R5
   btfss   Relays,SalidaR5D         ; Rele 2 encendido?
   goto   Mnsj_R5_OFF            ; No, Escribe OFF

   movlw   Mensaje_ON            ;
   call   LCD_Mensaje            ;
   movlw   Mensaje_ON            ;
   call   RS232_Mensaje
   goto   Mnsj_R6               ;

Mnsj_R5_OFF
   movlw   Mensaje_OFF            ;
   call   LCD_Mensaje            ;
   movlw   Mensaje_OFF            ;
   call   RS232_Mensaje

Mnsj_R6
   btfss   Relays,SalidaR6D         ; Rele 2 encendido?
   goto   Mnsj_R6_OFF            ; No, Escribe OFF

   movlw   Mensaje_ON            ;
   call   LCD_Mensaje            ;
   movlw   Mensaje_ON            ;
   call   RS232_Mensaje
   goto   Mnsj_R7               ;

Mnsj_R6_OFF
   movlw   Mensaje_OFF            ;
   call   LCD_Mensaje            ;
   movlw   Mensaje_OFF            ;
   call   RS232_Mensaje

Mnsj_R7
   btfss   Relays,SalidaR7D         ; Rele 2 encendido?
   goto   Mnsj_R7_OFF            ; No, Escribe OFF

   movlw   Mensaje_ON            ;
   call   LCD_Mensaje            ;
   movlw   Mensaje_ON            ;
   call   RS232_Mensaje
   goto   Mnsj_R8               ;

Mnsj_R7_OFF
   movlw   Mensaje_OFF            ;
   call   LCD_Mensaje            ;
   movlw   Mensaje_OFF            ;
   call   RS232_Mensaje

Mnsj_R8
   btfss   Relays,SalidaR8D         ; Rele 4 encendido?
   goto   Mnsj_R8_OFF            ; No, Escribe OFF

   movlw   Mensaje_ON            ;
   call   LCD_Mensaje            ;
   movlw   Mensaje_ON            ;
   call   RS232_Mensaje
   movlw   Mensaje_Cambiolinea
   call   RS232_Mensaje
   return                     ; Vuelve al programa principal.

Mnsj_R8_OFF
   movlw   Mensaje_OFF            ;
   call   LCD_Mensaje            ;
   movlw   Mensaje_OFF            ;
   call   RS232_Mensaje
   movlw   Mensaje_Cambiolinea
   call   RS232_Mensaje
   return                     ; Vuelve al programa principal.

MostrarVersion
   movlw   Mensaje_Info
   movwf   MensajeApuntado         ; Guarda la posición del mensaje.
   call   LCD_Borra            ; Borra la pantalla del modulo LCD.
   movf   MensajeApuntado,W      ; Visualiza el mensaje en la pantalla
   call   LCD_Mensaje            ; del visualizador LCD.
   call   RS232_LineasBlanco      ; Borra la pantalla del ordenador.
   movf   MensajeApuntado,W
   call   RS232_Mensaje         ; Lo visualiza en el HyperTerminal.
   call   RS232_LineasBlanco
   return

MostrarParado
   call   Parado
   call   MostrarRelays
   movlw   MensajeParado
   movwf   MensajeApuntado         ; Guarda la posición del mensaje.
;   call   LCD_Borra            ; Borra la pantalla del modulo LCD.
   call   LCD_Linea4            ; Seleccionar la línea 4.
   movf   MensajeApuntado,W      ; Visualiza el mensaje en la pantalla
   call   LCD_Mensaje            ; del visualizador LCD.
   call   RS232_LineasBlanco      ; Borra la pantalla del ordenador.
   movf   MensajeApuntado,W
   call   RS232_Mensaje         ; Lo visualiza en el HyperTerminal.
   call   RS232_LineasBlanco
   return

MostrarActivado
   call   Activar
   call   MostrarRelays
   movlw   Mensaje_Activar
   movwf   MensajeApuntado         ; Guarda la posición del mensaje.
;   call   LCD_Borra            ; Borra la pantalla del modulo LCD.
   call   LCD_Linea4            ; Seleccionar la línea 4.
   movf   MensajeApuntado,W      ; Visualiza el mensaje en la pantalla
   call   LCD_Mensaje            ; del visualizador LCD.
   call   RS232_LineasBlanco      ; Borra la pantalla del ordenador.
   movf   MensajeApuntado,W
   call   RS232_Mensaje         ; Lo visualiza en el HyperTerminal.
   call   RS232_LineasBlanco
   return

;****************************************************************************
; Interrupción
;****************************************************************************

;****************************************************************************
; Subrutina
;****************************************************************************
Guardar_EEPROM
   movlw   .02
      movwf   EEADR
      movf   Relays,W
      call   EEPROM_EscribeDato
   return

;   btfss   PEntradasC,EntradaR1C            ; ¿Bit 0 del PORTA es "1"?
;   goto   D1_OFF
;   bsf      PSalidasD,SalidaR1D
;   goto   Principal
;D1_OFF
;   bcf      PSalidasD,SalidaR1D



; ---------------------------------------------------------------------------

   IF   (FinTablaASCII>0xFF)
      ERROR   "¡CUIDADO!: La tabla ha superado el tamaño de los"
      MESSG   "primeros 256 bytes de memoria ROM. No funcionará correctamente."
   ENDIF

   INCLUDE  <RS232.INC>
   INCLUDE  <RS232MEN.INC>
   INCLUDE  <LCD_4BIT.INC>
   INCLUDE  <LCD_MENS.INC>
   INCLUDE  <RETARDOS.INC>
   INCLUDE  <EEPROM.INC>
   END


Sólo necesito mientras estoy entretenido en programar asm para el PIC, buscar tiendas on-line para comprar componentes necesarios para este proyecto. Por otro lado, para aquellas que sepan muy bien programar basic para Spectrum 128 K se pueden animar en diseñar un buen menú principal cuyas carácterísteicas les pediré ahora.

Spectrum debe tener un menú principal, se lo muestro en forma de diagrama de flujos para hacer una idea, en él se muestra algo así:
Spoiler: Mostrar
Imagen


Los valores que se cambian en tiempo real como indican abajo son los 1, los 0 y los mensajes de avisos y alarmas cuando se envía desde el PIC al Spectrum algún dato por puerto serie. Así que Spectrum parece que estará siempre leyendo.
Spoiler: Mostrar
Imagen


Los que deseen programar el Spectrum, pueden empezar por el menú principal y la opción B). Cuando esté listo esa parte, haré pruebas sólidas con el PIC y les mostarré fotos y vídeos. Ahora tengo las herramientas adecuadas, la mayoría para practicar, solo me faltan algunos componentes como LCD 20x4 verde, por ahora me conformo con el simulador de PIC y el LCD de 16x2 en azul.

Ver foto en este spoiler, solo me hace falta el menú del Spectrum para empezar.
Spoiler: Mostrar
Imagen


Me falta por explicar cada menú.

Ánimos y adelante...
Última edición por REHome el 08 Dic 2013, 12:35, editado 4 veces en total.

Avatar de Usuario
Zardoz
MSX Turbo R
MSX Turbo R
Mensajes: 283
Registrado: 09 Sep 2013, 19:04
Sistema Favorito: (Otro)
primer_sistema: (Otro)
consola_favorita: Nintendo NES/Clónica
Primera consola: Nintendo NES/Clónica
Ubicación: Madrid
Contactar:

Re: Programar puerto serie

Mensajepor Zardoz » 08 Dic 2013, 10:40

Código: Seleccionar todo

110 IF A$="A" OR A$="a" THEN LPRINT "A": GO TO 100


Siempre había asumido que de ser la condición falsa, ejecutaría el GOTO ...

REHome escribió:Código en asm para el PIC16F887 para los que le pican la curiosidad. (Aún en proceso de desarrollo).

Hay que tener ganas para programar ASM de los PIC =D>
Yep, I have a blog :zardoz.es
Emulador DCPU-16 VM
Emulador Trillek

REHome
Amstrad PCW 8256
Amstrad PCW 8256
Mensajes: 145
Registrado: 19 Abr 2013, 22:01
Sistema Favorito: Spectrum +2
primer_sistema: Spectrum +2
Gracias dadas: 3 veces
Gracias recibidas: 2 veces

Re: Programar puerto serie

Mensajepor REHome » 08 Dic 2013, 13:36

Hola Zardoz:

Hoy tengo ganas para todo, tanto asm para PIC y Basic para ZX Spectrum +2 de 128 K para hacer cosas con él. :matrix2: =D> :D

Aprender rápido el Basic para Spectrum solo para estas navidades del 2013 no me da tiempo, ejejjejej. Por eso necesito colaboración.

Explicaré paso a paso que hay que hacer en cada menú del Spectrum. Por ahora me centraré en dos, el menú principal y la opción [2] o la B) que antes la llamaba así.
Spoiler: Mostrar
Imagen


Nada más encender el Spectrum, en realidad cargar la cinta, muestra el menú principal de abajo.
********** Menú principal **********
[1] Sistema de monitorización.
[2] Sistema de gobierno desde Spectrum.
[3] Modo sistema de gobierno gráfico .
[4] Test.
[5] Información.
[6] Ayuda.


Al pulsar el botón número [2], accede directamente a otro menú llamado:
*** Sistema de gobierno desde Spectrum ***
RL1 RL2 RL3 RL4 RL5 RL6 RL7 RL8
0 1 1 0 1 0 1 0
Mensajes de avisos o alarmas
Para salir pulse "P".


Lo que hay que hacer aquí es, que los 1 y los 0 son datos que detecta en el puerto serie del ZX Spectrum +2A 128 K, significa activado para el 1 y desactivado para el 0. RL1 significa Relé 1 que controla el PIC. La imagen de abajo es una placa que en el fututo diseñaré algo similar, con los 8 relés.
Spoiler: Mostrar
Imagen


Los mensajes de avisos llegan desde el PIC, al igual que los unos y ceros.
También para abreviar se puede hacer así:
*** Sistema de gobierno desde Spectrum ***
1 2 3 4 5 6 7 8 RL
0 1 1 0 1 0 1 0 OUT
Mensajes de avisos o alarmas
Para salir pulse "P".


Puedes diseñar la primera parte del programa como quieran, incluido la presentación, sólo indico la idea, cada uno con su imaginación. El problema que tengo ahora, ¿quién está dispuesto a codear esta aventura un poco dura?

Un saludo.

Avatar de Usuario
scooter
Amiga 1200
Amiga 1200
Mensajes: 1031
Registrado: 17 Jul 2012, 09:25
primer_sistema: C64
Ubicación: Alicante

Re: Programar puerto serie

Mensajepor scooter » 08 Dic 2013, 21:50

Ya puestos a hacer el boticario yo le pondria una uart hardware, eso facilita muuuuuucho ; con un 8052 a 1mip he comunicado sin pegas a 115kbps todo lo que sean uarts software es tumbar el sistema mientras comunica.

REHome
Amstrad PCW 8256
Amstrad PCW 8256
Mensajes: 145
Registrado: 19 Abr 2013, 22:01
Sistema Favorito: Spectrum +2
primer_sistema: Spectrum +2
Gracias dadas: 3 veces
Gracias recibidas: 2 veces

Re: Programar puerto serie

Mensajepor REHome » 09 Dic 2013, 03:02

Buenas:

No te preocupes en la electrónica. Llevará la comunicación hacia el PIC <--MAX232--> Spectrum la electrónica necesaria. La UART se hará físicamente, no te preocupes.

He hecho pruebas con el PIC16F84A, 16F88, 16F886, 16F887, 18F2550 y el 18F4550, todos de maravilla. Me falta Arduino, al tener la placa haré pruebas, incluyendo Raspberry Pi.

Vídeos:
Spoiler: Mostrar
Este lo hice hace tiempo y funciona de maravilla. Spectrum solo envía un carácter en forma hexadecimal hacia le puerto serie, luego lo interpreta como apagar o encender un Led, motor, lo que quieras.


Aquí con la entrenadora de PIC, estoy usando Teensy ++ 2.0, haciendo pruebas de encender y apagar un Led y ventilador. Son tonterías que al final aprenderás hacer muchas cosas interesantes y complejas.


Voy a intentar hacer la primera pantalla del menú principal para Spectrum.

Edito:
Menú principal, soso pero se ve y se entiende. Lo que tengo que hacer algo en la señal de vídeo, ya que uso un cable directamente al vídeo amarillo del RCA.
Imagen

El programa hecho pero no es funcional. Debo aprender al menos como cambio de pantalla una a otra y luego volver, así poder hacer fucniones después.
Imagen

Por cierto, al guardar el programa, escribí al final de código:

save "RS232"

Al recuperarlo, no encontró nada en la cinta, solo otros programas ya realizados hace tiempo. Que me recuerde alguien si es con save como se guarda. Con cargar es LOAD "RS232". Otra cosa. ¿Cómo se interrumpe un programa?

Cualquier ayuda es bienvenida.


PD: ZX Spectrum: Grabar juegos en cintas de cassette con Spectaculator y ZXSpin

-- Actualizado 10 Dic 2013, 02:54 --

Hola de nuevo.

No se programar para Spectrum pero si para C# y ensamblador para PIC, jejejejeje. He hecho como un emulador no funcional para le puerto serie (cosa que si me animo lo haré funcional en todos los aspectos pero debo dejarlo bonito).

En el Spectrum veo que tiene "E/S EXPANSION", puerto paralelo, joyStick, así que lo miraré a fondo que se pueden hacer cosillas, cualquier sugerencia es bienvenida, estoy a tiempo para recibir ideas.

Imagen

El ejecutable quien quiera mirarlo a fondo me lo dicen y se los paso por correo.

Hecho bajo Visual C# 2013 Express.

Código: Seleccionar todo

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Spectrum_Menu
{
    class Program
    {
        static void Main(string[] args)
        {
            // Muestra título de la ventana del programa.
            Console.Title = "ZX Spectrum +2A 128 K (Sinclair) - Zona de Pruebas";
            Console.BackgroundColor = ConsoleColor.White; // Fondo de las letras blanco.
            Console.ForegroundColor = ConsoleColor.Black;

            while (true)
            {
                Console.Clear(); // Limpia la pantalla y se pone blanco indicado arriba.
                Console.WriteLine(@"********** MENÚ PRINCIPAL **********

(1) Sistema de monitorización.

(2) Sistema de gobierno desde ZX Spectrum.

(3) Modo sistema de gobierno gráfico.

(4) Test.

(5) Información.

(6) Ayuda.
");

                string menu = Console.ReadKey(true).KeyChar.ToString(); // Lectura del teclado para las opciones del menú.
                int switch_menu;

                if (!int.TryParse(menu, out switch_menu)) continue;
                Console.Clear();

                switch (switch_menu)
                {
                    case 1:
                        Console.WriteLine(@"****************** Sistema de monitorización ******************

IN 1      IN2     IN 3      IN 4      IN 5     IN 6      IN 7      IN 8
----     ----     ----      ----      ----     ----      ----      ----
 0        1        0         0         1        0         0         1




Para salir pulse 'P'.
");
                        break;

                    case 2:
                        Console.WriteLine(@"*** Sistema de gobierno desde Spectrum ***

RL1  RL2    RL3   RL4   RL5   RL6    RL7   RL8
0     1      1     0     1     0      1     0
Mensajes de avisos o alarmas



Para salir pulse 'P'.
");
                        break;

                    case 3:
                        Console.WriteLine(@"**** Modo sistema de gobierno gráfico ****

");
                        break;

                    case 4:
                        Console.WriteLine(@"**************** Test ****************

Todo lo que escribas aquí se enviará por puerto
serie y se visualiza en el LCD.

Para salir pulsa la letra 'P'.

");
                        break;

                    case 5:
                        Console.WriteLine(@"************* Información *************

Desde que pulse 'I' o 'i' muestra información
en forma de texto leído desde Spectrum y el
microcontrolador como versión del programa,
firmware, contacto, foro de información como
Zona de Pruebas, etc.

Lo que se nos ocurra. 'P para salir'.

");
                        break;

                    case 6:
                        Console.WriteLine(@"*************** Ayuda ***************

En esta ventana se mostrarán textos y
explicaciones de ayudas sobre los menús.

Ya lo explicaré más adelante.

");
                        break;

                    default:
                        Console.WriteLine("Pulsa solo 'P' o 'p' para salir al menú  principal");
                        break;

                }
                while (Console.ReadKey(true).Key != ConsoleKey.P) ;
            }
        }
    }
}


Basic + del Spectrum por ahora me parece complicado hacer menús. Quien se anime a echarme una mano o dar pistas.

Un saludo.


Volver a “Programación”

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 8 invitados