;*******************************************************************************
; A_PRINTER_6.ASM
;
; Impresión de tiques.
;
; Autor: Joaquín Ferrero
; Fecha: 23 julio 2014
;
; Para micro impresora térmica, por puerto paralelo. Papel de 58 mm
;
; Atención: Hay que conectar las dos líneas siguientes
; STROBE
; BUSY
;
; Funcionamiento:
; Lee el pulsador
; Escribe el mensaje
; Incrementa el contador
;
; Formato del tique:
; +--------------------------+
; | *********** | [ asteriscos ]
; | |
; | |
; | |
; | EMPRESA |
; | |
; | 0 1 | [ NÚMERO EN GRANDE ]
; | |
; | |
; | YOUR TURN | [ MISMO TAMAÑO DEL NÚMERO ]
; | |
; | RESIDENCE & NATIONALITY |
; | |
; | |
; | *********** | [ asteriscos ]
; | |
; | |
; | |
; +--------------------------+
;
; Indentación: 4 spaces
; MPASM v5.56
;
;*******************************************************************************
; Listado y condiciones de ensamblado
processor 16F876A ; 4 Mhz
radix dec
errorlevel -302 ; Turn off banking message
;*******************************************************************************
; Bibliotecas
include p16f876a.inc
extern Retardo_100ms,Retardo_4µs
;*******************************************************************************
; Fusibles
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_OFF & _HS_OSC & _LVP_OFF & _BODEN_OFF; & _MCLRE_ON
;*******************************************************************************
; Definiciones globales
;*******************************************************************************
; Conector puerto paralelo
;
;Signal Name Register Bit DB-25 E/S dirección (desde PIC)
;
;¬Strobe ¬A0 1 Output Dato disponible
;Data Bit 0 B0 2 Output Dato
;Data Bit 1 B1 3 Output
;Data Bit 2 B2 4 Output
;Data Bit 3 B3 5 Output
;Data Bit 4 B4 6 Output
;Data Bit 5 B5 7 Output
;Data Bit 6 B6 8 Output
;Data Bit 7 B7 9 Output
;Acknowledge 10 Input Impresora procesó dato o está en línea
;¬Busy ¬A1 11 Input Está escribiendo/Fuera de línea/Procesando código de control
;Paper End 12 Input No hay papel
;Select In 13 Input Impresora en línea preparada para recibir
;¬Line Feed 14 Output Hace un FF (expulsa la hoja)
;Error 15 Input Impresora fuera de línea
;Reset 16 Output Inicializar impresora
;¬Select 17 Output Poner impresora en línea (si no hay error)
;Ground - 18-25
#DEFINE ¬STROBE PORTA,RA0
#DEFINE BUSY PORTA,RA1
#DEFINE PULSADOR PORTA,RA4
#DEFINE PUERTO_IMPRESORA PORTB
;*******************************************************************************
; Macros
; Imprimir una cadena de bytes terminada en 0x00 almacenados en el programa
imprime_msg macro direccion
movlw high(direccion) ; Byte alto
movwf PRINT_STRING_ADDR_H
movlw low(direccion) ; Byte bajo
movwf PRINT_STRING_ADDR_L
call print_string
endm
; Imprimir un carácter
imprime_chr macro caracter
movlw caracter
call print_chr
endm
;*******************************************************************************
; Espacio de memoria compartida
udata_shr
CONTADOR1 res 1 ; contadores de visitas. Byte bajo
CONTADOR2 res 1 ; Byte alto
;*******************************************************************************
; Vectores
VECcode code 0x0000
nop ; 0x0000 (Este nop es necessario para operar con ICD)
goto Inicio ; 0x0001 (Inicio de programa)
nop ; 0x0002
nop ; 0x0003
goto _ISR ; 0x0004 (Rutina de interrupción)
; Rutina de interrupción
ISRcode code
_ISR: retfie
; Programa principal
PRGcode code
Inicio:
; Inicialización del hardware
banksel PORTA ; bank 0
clrf PORTA
clrf PORTB
bcf ADCON0, ADON ; desactivar todo A/D
; Inicialización de las variables
clrf CONTADOR1
clrf CONTADOR2
; Definiciones de las E/S
bsf STATUS, RP0 ; bank 1
movlw B'00000110' ; E/S analógicas como digitales
movwf ADCON1
movlw B'00111010' ; 0: salida. 1: entrada
movwf TRISA
movlw B'00000000'
movwf TRISB
; Iniciar impresora
bcf STATUS, RP0 ; bank 0
bsf ¬STROBE ; no hay carácter a imprimir
;
imprime_chr H'1B'
imprime_chr '@'
call Retardo_100ms ; Esperar estabilización
call Retardo_100ms
call Retardo_100ms
call Retardo_100ms
call Retardo_100ms
imprime_chr "\n"
; Bucle principal. Siempre en bank 0
Principal:
; Bucle de espera de la pulsación de PULSADOR
Espera_pulsacion:
call Retardo_100ms ; Esperar la pulsación del pulsador
btfss PULSADOR ; ¿Botón pulsado?
goto Espera_pulsacion ; No, esperar
Espera_no_pulsacion:
call Retardo_100ms ; Esperar la suelta del pulsador
btfsc PULSADOR ; ¿Botón levantado?
goto Espera_no_pulsacion ; No, esperar
; Incrementa contador de visitas
incf CONTADOR1,F ; incrementar unidades
movf CONTADOR1,W
sublw 10 ; ¿hemos llegado a diez?
btfss STATUS,Z
goto Imprimir_tique ; no
clrf CONTADOR1 ; poner a cero las unidades
incf CONTADOR2,F ; incrementar decenas
movf CONTADOR2,W
sublw 10 ; ¿hemos llegado a diez?
btfss STATUS,Z
goto Imprimir_tique ; no
clrf CONTADOR2 ; poner a cero las decenas
; Impresión del tique
Imprimir_tique:
imprime_msg msg_asteriscos
imprime_chr "\n"
imprime_chr "\n"
imprime_msg msg_empresa
imprime_chr "\n"
imprime_chr H'1B' ; activa letra grande
imprime_chr '!'
imprime_chr 16+32
imprime_msg msg_espacios
movf CONTADOR2,W ; leemos las decenas actuales
addlw '0'
call print_chr
movf CONTADOR1,W ; leemos las unidades actuales
addlw '0'
call print_chr
imprime_chr "\n"
imprime_chr "\n"
imprime_msg msg_su_turno
imprime_chr H'1B' ; cancela letra grande
imprime_chr '!'
imprime_chr 0
imprime_chr "\n"
imprime_msg msg_lugar
imprime_chr "\n"
imprime_msg msg_asteriscos
imprime_chr "\n"
imprime_chr "\n"
imprime_chr "\n"
goto Principal
; ******************************************************************************
; Subrutinas
; ------------------------------------------------------------------------------
; print_string
;
; Impresión de una cadena de bytes terminada en 0x00.
;
; La cadena está almacenada en la zona de memoria del programa Flash.
;
; Se sale quedando en el bank 0.
;
; Variables
print_string_mem: udata_shr
PRINT_STRING_ADDR_H res 1 ; Puntero a cadena a pintar
PRINT_STRING_ADDR_L res 1
PRINT_STRING_BYTE_H res 1 ; bytes que leemos de
PRINT_STRING_BYTE_L res 1 ; la memoria del programa
; Código
print_string_code: code
print_string:
banksel EEADRH ; bank 2
movf PRINT_STRING_ADDR_H, W
movwf EEADRH
movf PRINT_STRING_ADDR_L, W
movwf EEADR
bsf STATUS, RP0 ; bank 3
bsf EECON1, EEPGD ; Acceso a memoria de programa
print_loop:
bsf EECON1, RD ; Iniciar acceso
nop ; espera obligada
nop
bcf STATUS, RP0 ; bank 2
incfsz EEADR, F ; incrementar byte bajo
goto print_read_bytes
incf EEADRH, F ; incrementar byte alto
; Leemos dos bytes, que contienen 14 bits, que son dos caracteres de 7 bits, que
; es la forma de empaquetar la información que tiene la directiva 'da'.
print_read_bytes:
movlw 0x7F
andwf EEDATA, W ; byte bajo, menos el bit más alto
movwf PRINT_STRING_BYTE_L ; guardar
rlf EEDATA, W ; rotar byte bajo y en C queda bit 7
rlf EEDATH, W ; que se mete como bit 0 en byte alto
movwf PRINT_STRING_BYTE_H ; guardar
bcf STATUS, RP1 ; bank 0
; movf PRINT_STRING_BYTE_H, W
; truco: W ya tiene el byte, así que
; sólo hay que ver si es 0. Hacemos
; un test directo del registro
addlw 0
btfsc STATUS, Z ; ¿Se acabó?
return ; Sí
call print_chr ; impresión
movf PRINT_STRING_BYTE_L, W
btfsc STATUS, Z ; ¿Se acabó?
return ; Sí
call print_chr ; impresión
banksel EECON1 ; bank 3
goto print_loop ; repetir
; ------------------------------------------------------------------------------
; print_chr
;
; Impresión de un carácter (un byte).
;
; Se supone que estamos en el bank 0.
;
print_chr:
btfsc BUSY ; ¿Impresora ocupada?
goto $-1 ; sí, seguir esperando
movwf PUERTO_IMPRESORA ; Envía el dato a la impresora
bcf ¬STROBE ; Señalar que hay un dato disponible
call Retardo_4µs
bsf ¬STROBE
return
; ******************************************************************************
; Datos y mensajes
; Ancho impresora: |123456789012345678901234567890|
msg_asteriscos: da " ***********\n",0
msg_empresa: da " ALVAREZ ELECTRONICS\n",0
msg_espacios: da " ",0
msg_su_turno: da " YOUR TURN\n", 0
msg_lugar: da " BELIZE BELMOPAN\n", 0
;*******************************************************************************
; El archivo con los retardos es incorporado por el make
; por lo que no hace falta la instrucción siguiente.
; include retardos.asm
end