Sie sind auf Seite 1von 38

w Manejo de Teclado

w Manejo de LCD

José Oliden Martínez


FILAS COLUMNAS
1234 1234

COL4

COL3

COL2

COL1

'1' '2' '3' 'UP'


FILA1

'4' '5' '6' 'DOWN'


FILA2

'7' '8' '9' '2ND'


FILA3

'CLEAR' '0' 'HELP' 'ENTER'


FILA4

José Oliden Martínez


José Oliden Martínez
José Oliden Martínez
El objetivo es capturar el código del teclado (en 4 bits por el puerto A)

Sabremos que se ha pulsado una tecla cuando se reciba un pulso por el pin DA del
74922

Este pulso lo utilizaremos como una interrupción externa por el RB0 de tal manera
que cuando ocurra leemos el puerto A y mediante una tabla codificaremos el valor a
una letra determinada para el LCD.

José Oliden Martínez


LeeTeclado:
ADDWF PCL,F
RETLW '1' ; código
RETLW '2' ; código
RETLW '3' ; código
RETLW 'U' ; código
RETLW '4' ; código
RETLW '5' ; código
RETLW '6' ; código
RETLW 'D' ; código
RETLW '7' ; código
RETLW '8' ; código
RETLW '9' ; código
RETLW 'F' ; código
RETLW 'C' ; código
RETLW '0' ; código
RETLW 'H' ; código
RETLW 'E' ; código

José Oliden Martínez


Hacer una programa que muestre en pantalla del LCD la tecla pulsada por el
teclado.

Recuerde:
Agregar la rutina de decodificación de teclado en la interrupción del RB0

El archivo se llama TecladoLCD.asm

José Oliden Martínez


José Oliden Martínez
LCD: En el módulo
LCD: Con el Microcontrolador

José Oliden Martínez


Para el manejo del LCD también se cuenta con un archivo que contiene las rutinas de
manejo de este

La rutina de inicialización del LCD :


Lcd_Init(); // inicializa la pantalla LCD

Para enviar caracteres se utiliza la rutina de envío de caracteres al LCD :


Lcd_Chr(char row, char column, char out_char);
Esta rutina separa el carácter entre el nibble (4bits) superior e inferior y los envía a la pantalla LCD,
nibble más alto primero. Ejm: Escribir el caracter "i“ en la fila 2, columna 3: Lcd_Chr(2, 3, 'i');

Para el envío de comando al LCD :


Lcd_Cmd(_LCD_COMANDO); La cual envía un comando a la pantalla LCD. Aquí también se
separa el comando en nibble superior e inferior y los envía a la pantalla.

Para el envío de cadenas:


Lcd_Out(char row, char column, char *text);
Envía el texto *text al LCD. Ejm: Lcd_Out(1, 3, "Hola!");

José Oliden Martínez


;************************************************************
;* Esta rutina inicializa la pantalla LCD *
;* Afecta: TEMP - retornado con busy/address *
;************************************************************
Inicio_LCD
Banco0
bcf CNTRL,E ; aclara lineas de control
bcf CNTRL,RW
bcf CNTRL,RS
movlw 0x0F ; aclara lineas de datos
movwf DATOS
;Configurar puertos DATOS[4..7] y CNTRL[1..3] como salidas
Banco1
movlw B'00001111' ;4 bits mas altos de DATOS
movwf TRISD
bcf TRISD,E ;bits de control como salidas
bcf TRISD,RW
bcf TRISD,RS
Banco0

José Oliden Martínez


Hacer una programa que muestre en pantalla del LCD:
“HOLA”
Recuerde:
Llamar a la subrutina Lcd_init para iniciar el LCD
Para enviar un comando utilizar la rutina Lcd_Cmd(COMANDO)
Para enviar una cadena y luego usar Lcd_Out(1,3,”Hola”);

José Oliden Martínez


w Conversor AD
Entradas Reset
Xtal
análogas

RS232

C
7
6
5
4
3
16F877A 2
1
CP

1 2 3
4 5 6
7 8 9 F
C 0 H E

Teclado
Muestreo y cuantización

1111
1110
1101
1100
1011 Error de cuantización
1010
OUTPUT 1001
DIGITAL 1000
0111 t
0110
0101
0100
0011
0010 ADC Output
0001 Función Seno
0000

4-bit (16 level) ADC sampling a sinewave input


1. Conversor analógico a digital de 10 bits

2. Tensión de referencia interna (VDD) o externa (AN3/Vref)

3. La conversión se realiza con uno de sus canales.

4. El resultado se deposita en el registro ADRESL y ADRESH y se


activa el señalizador ADIF, que provoca una interrupción si el bit de
permiso correspondiente está activado. Además, al terminar la
conversión el bit GO/DONE se pone a 0.

5. Se gobierna con dos registros: ADCON0 y ADCON1.


6. El primero controla la operación del módulo AD, selecciona el canal a
convertir con los bits CHS <2:0>, activa al conversor y contiene el
señalizador que avisa del fin de la conversión (ADON) y el bit
GO/DONE.
El ADCON1 establece las entradas que son digitales y analógicas,
el tipo de tensión de referencia (interna o externa).
(Ver manual)

El registro ADRES sirve para configurar la alineación de los


resultados (con el bit ADFM A/D Result Format Select bit)
El tiempo de conversión AD por bit es de TAD.
Se requiere 2TAD para iniciar la siguiente conversión. Es decir que
para convertir los 10 bits se necesitan 12TAD

Según la hoja técnica del PIC se tiene, a 16MHz:

TAD = 32xTOSC = 32x1/(16x106) = 2 us

Entonces para convertir un dato se necesitan 12xTAD = 24 us y


esperar 2xTAD y además un tiempo de adquisición o de seteo y carga
del condensador de mantenimiento (ver hoja técnica) de 19,72 us.

Todos estos tiempo sumados nos dan 47,72 us lo que es


aproximadamente 50 us.

Se limita el ancho de banda a 10 kHz por el teorema del muestreo.


1. Configurar el módulo AD.
#device adc=8
//Iniciar el ADC
void AD_init()
{ setup_adc_ports(ALL_ANALOG);
setup_adc(ADC_CLOCK_DIV_2);
}
2. Llamar a ADC_Read(CANAL)
set_adc_channel(0);
valor=read_adc();

3. Llamar seguir leyendo por mediante el paso 2.


Convertir el canal AN0 del A/D a 8bits y mostrar el valor cada 10ms por el LCD.

#device adc=8

#define LCD_ENABLE_PIN PIN_D2


#define LCD_RS_PIN PIN_D0
#define LCD_RW_PIN PIN_D1
#define LCD_TYPE 2
#include <lcd.c>

void AD_init()
{ setup_adc_ports(ALL_ANALOG);
setup_adc(ADC_CLOCK_DIV_2);}

void MCU_init()
{ lcd_init(); void main()
AD_init();} { int valor = 0;
MCU_init();
lcd_putc("\fConversor AN0...\n");
delay_ms(1000);
while(TRUE){
set_adc_channel(0);
delay_ms(10);
valor=read_adc();
output_c(valor);
printf(lcd_putc,"\f%4u",valor);}
}
w Comunicación Serial

José Oliden Martínez


•Emisión/ recepción de información.

•Dos grandes grupos: Ordenes y Datos (muestras).

•Conectar el PIC con el mundo externo a través de comunicación serial


en modo asíncrono.

José Oliden Martínez


El estándar RS232 define una serie de especificaciones para la
transmisión de señales de modo serial entre dos dispositivos, DTE
(Data Terminal Equipment, que se encarga de gestionar una
comunicación) y DCE (Data Comunication Equipment, que se ocupa
de enviar o recibir data).
El estándar RS232 es utilizado sólo en la comunicación entre el DTE
y DCE.

José Oliden Martínez


José Oliden Martínez
Una comunicación serial consiste en transmitir datos de un punto a otro
a través de un código o protocolo de comunicación que especifica
velocidad de envío de datos, número de bits enviados, si hay
reconocimiento o detección de error, etc. La transmisión serial la vamos
a realizar a través del conector DB9 y sus pines y funciones son los que
se muestran en la tabla del laboratorio, sirven para normar la
comunicación entre los puntos.

2 RX
3 TX
5 GND

José Oliden Martínez


RX RX
TX TX

GND GND

DTE 1 (MACHO) DTE 2 (MACHO)

José Oliden Martínez


RX TX
TX RX

GND GND

DTE (Macho) DCE (Hembra)

José Oliden Martínez


La trama o secuencia de bits para la transmisión de un byte de
información se muestra en la figura, Qué se aprecia?

A mayúscula cuyo valor en binario es 01000001

José Oliden Martínez


José Oliden Martínez
En el PIC16F877A contiene un módulo USART que le permite transferir información
de manera serial utilizando la norma RS-232.
Los datos se transmiten por el pin RC6/TX/CK y se reciben por el pin RC7/RX/DT, la
velocidad a la que viajan los datos se determina por un generador de baudios.
Los datos se transmiten con un bit de INICIO (‘0’ lógico), seguido de los 8 o 9 bits de
datos (comenzando por el bit de menor peso) y finalmente un bit de STOP (‘1’ lógico).
Para generar la velocidad de transferencia de los datos hay que grabar un valor en el
registro SPBRG y además considerar el valor del bit BRGH (bit 2 del registro TXSTA).
Si el bit BRGH=0 entonces la constante K=64.
Si el bit BRGH=1 entonces la constante K=16.

Frecuencia en baudios = Fosc / (K * (SPBRG + 1) )

Mirar el Data Sheet del microcontrolador y ubicar la tabla de velocidades


José Oliden Martínez
La transmisión se inicia cargando el dato en el registro TXREG, que pasan luego al
registro TSR que se encarga finalmente de transmitir el dato bit por bit por el pin RC6.
Cuando el buffer queda vacío, el bit TXIF se pone a ‘1’ para advertir que se puede
transmitir otro dato. Al escribirse otro dato en el registro TXREG, el bit TXIF se pone a
‘0’. También tenemos el bit TRMT que toma el valor de ‘1’ cuando el registro TSR
está vacío.

José Oliden Martínez


AQUI

Para iniciar la recepción se coloca el bit CREN=‘1’ (registro RCSTA). Los bits son
recibidos uno a uno y cuando se llena el buffer RSR considerando el bit No9 (RX9=1)
el señalizador RCIF se pone a 1, pudiendo generar una interrupción.

José Oliden Martínez


José Oliden Martínez
;****************************************************************************************************
; Inicialización del USART del PIC, ; deja habilitadas las interrupciones de Rx y Tx serial
; Vtx=19200 bps, asíncrona, 8 bits
; Operaciones del port habilitadas
;****************************************************************************************************
Iniciar_USART
bcf RCSTA,CREN ;aclara OVERRUN error bit
nop
bsf RCSTA,CREN
banco1
movlw B'00100000' ;operación asíncrona, 8bits, Tx on
movwf TXSTA
movlw .12 ;Vtx=19200 baudios; Xtal=16Mhz,
; movlw .25 ;Vtx= 9600 baudios; Xtal=16Mhz,
movwf SPBRG
banco0
movlw B'10010000' ;hab. operaciones en port serial,hab. recepción
movwf RCSTA
clrf TXREG ;aclarar buffers del port serial
clrf RCREG
return

José Oliden Martínez


;***********************************************
; Rutina de envío de caracteres
; el dato debe estar en el registro W (no se modifica)
;************************************************************
TxCar
nop ;asegura la estabilización del port
nop
bsf STATUS,RP0

TxCar1 btfss TXSTA,TRMT ;check estado del transmisor para enviar


goto TxCar1 ;si no esta listo intentar nuevamente
bcf STATUS,RP0
movwf TXREG ;transmitir un nuevo dato
return

José Oliden Martínez


; Rutina de recepción de caracteres
RxCar
movlw 06h ; enmascara. bits no deseados
andwf RCSTA,W ; chequeo de errores
btfss STATUS,Z
goto RxError ; error! flag
btfss PIR1,RCIF ; chequeo por dato listo
return ; NO, regresa
movf RCREG,W ; SI, lee el contenido del reg. serial
bsf regrx,0 ; setea flag de recepción
return

RxError:
bcf RCSTA,CREN ; aclara OVERRUN error bit
nop
bsf RCSTA,CREN
movlw "X"
call EnviaCarLCD
call ret300ms
movlw "E"
call EnviaCarLCD
call ret300ms
return
José Oliden Martínez
; Rutina de recepción de caracteres

#use delay(clock=20000000)
#use rs232(baud=9600, xmit=PIN_C6,rcv=PIN_C7)

void main()
{
int valor = 0;
MCU_init();
lcd_putc("\fConversor AN0\n");
printf(“\fConversor AN0\n”);
delay_ms(1000);

while(TRUE){
set_adc_channel(0);
delay_ms(10);
valor=read_adc();
output_c(valor);
printf(lcd_putc,"\f%4u",valor);
printf("\f%4u",valor);
}
}

José Oliden Martínez

Das könnte Ihnen auch gefallen