Está en la página 1de 10

FILAS COLUMNAS

1234 1234

w Manejo de Teclado COL4

COL3

w Manejo de LCD 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 José Oliden Martínez


LeeTeclado:
ADDWF PCL,F
El objetivo es capturar el código del teclado (en 4 bits por el puerto A) RETLW '1' ; código
RETLW '2' ; código
Sabremos que se ha pulsado una tecla cuando se reciba un pulso por el pin DA del RETLW '3' ; código
74922 RETLW 'U' ; código
RETLW '4' ; código
Este pulso lo utilizaremos como una interrupción externa por el RB0 de tal manera
RETLW '5' ; código
que cuando ocurra leemos el puerto A y mediante una tabla codificaremos el valor a
RETLW '6' ; código
una letra determinada para el LCD.
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 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 Para el manejo del LCD también se cuenta con un archivo que contiene las rutinas de
manejo de este
LCD: Con el Microcontrolador

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 José Oliden Martínez

;************************************************************
;* Esta rutina inicializa la pantalla LCD *
Hacer una programa que muestre en pantalla del LCD:
;* Afecta: TEMP - retornado con busy/address *
;************************************************************
“HOLA”
Inicio_LCD
Banco0
Recuerde:
bcf
bcf
CNTRL,E
CNTRL,RW
; aclara lineas de control
Llamar a la subrutina Lcd_init para iniciar el LCD
bcf CNTRL,RS
movlw 0x0F ; aclara lineas de datos
Para enviar un comando utilizar la rutina Lcd_Cmd(COMANDO)
movwf DATOS
;Configurar puertos DATOS[4..7] y CNTRL[1..3] como salidas
Para enviar una cadena y luego usar Lcd_Out(1,3,”Hola”);
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 José Oliden Martínez


Entradas Reset
Xtal
análogas

w Conversor AD
RS232

C
7
6
5
4
16F877A 3
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 1. Conversor analógico a digital de 10 bits
1011 Error de cuantización
1010 2. Tensión de referencia interna (VDD) o externa (AN3/Vref)
OUTPUT 1001
DIGITAL 1000 3. La conversión se realiza con uno de sus canales.
0111 t
0110
0101 4. El resultado se deposita en el registro ADRESL y ADRESH y se
0100 activa el señalizador ADIF, que provoca una interrupción si el bit de
0011 permiso correspondiente está activado. Además, al terminar la
0010 ADC Output conversión el bit GO/DONE se pone a 0.
0001 Función Seno
0000 5. Se gobierna con dos registros: ADCON0 y ADCON1.
6. El primero controla la operación del módulo AD, selecciona el canal a
4-bit (16 level) ADC sampling a sinewave input 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 1. Configurar el módulo AD.
para convertir los 10 bits se necesitan 12TAD #device adc=8
//Iniciar el ADC
Según la hoja técnica del PIC se tiene, a 16MHz: void AD_init()
{ setup_adc_ports(ALL_ANALOG);
TAD = 32xTOSC = 32x1/(16x106) = 2 us setup_adc(ADC_CLOCK_DIV_2);
}
2. Llamar a ADC_Read(CANAL)
Entonces para convertir un dato se necesitan 12xTAD = 24 us y set_adc_channel(0);
esperar 2xTAD y además un tiempo de adquisición o de seteo y carga valor=read_adc();
del condensador de mantenimiento (ver hoja técnica) de 19,72 us.
3. Llamar seguir leyendo por mediante el paso 2.
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.


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>
w Comunicación Serial
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);}
} José Oliden Martínez

•Emisión/ recepción de información. El estándar RS232 define una serie de especificaciones para la
transmisión de señales de modo serial entre dos dispositivos, DTE
•Dos grandes grupos: Ordenes y Datos (muestras). (Data Terminal Equipment, que se encarga de gestionar una
comunicación) y DCE (Data Comunication Equipment, que se ocupa
•Conectar el PIC con el mundo externo a través de comunicación serial de enviar o recibir data).
en modo asíncrono. 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 José Oliden Martínez

RX RX RX TX
TX TX TX RX

GND GND GND GND

DTE 1 (MACHO) DTE 2 (MACHO) DTE (Macho) DCE (Hembra)

José Oliden Martínez 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 La transmisión se inicia cargando el dato en el registro TXREG, que pasan luego al
de manera serial utilizando la norma RS-232. registro TSR que se encarga finalmente de transmitir el dato bit por bit por el pin RC6.
Los datos se transmiten por el pin RC6/TX/CK y se reciben por el pin RC7/RX/DT, la Cuando el buffer queda vacío, el bit TXIF se pone a ‘1’ para advertir que se puede
velocidad a la que viajan los datos se determina por un generador de baudios. 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
Los datos se transmiten con un bit de INICIO (‘0’ lógico), seguido de los 8 o 9 bits de
está vacío.
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 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 ;***********************************************
;**************************************************************************************************** ; Rutina de envío de caracteres
Iniciar_USART ; el dato debe estar en el registro W (no se modifica)
bcf RCSTA,CREN ;aclara OVERRUN error bit ;************************************************************
nop TxCar
bsf RCSTA,CREN nop ;asegura la estabilización del port
banco1 nop
movlw B'00100000' ;operación asíncrona, 8bits, Tx on bsf STATUS,RP0
movwf TXSTA
movlw .12 ;Vtx=19200 baudios; Xtal=16Mhz, TxCar1 btfss TXSTA,TRMT ;check estado del transmisor para enviar
; movlw .25 ;Vtx= 9600 baudios; Xtal=16Mhz, goto TxCar1 ;si no esta listo intentar nuevamente
movwf SPBRG bcf STATUS,RP0
banco0 movwf TXREG ;transmitir un nuevo dato
movlw B'10010000' ;hab. operaciones en port serial,hab. recepción return
movwf RCSTA
clrf TXREG ;aclarar buffers del port serial
clrf RCREG
return

José Oliden Martínez José Oliden Martínez


; Rutina de recepción de caracteres ; Rutina de recepción de caracteres
RxCar
movlw 06h ; enmascara. bits no deseados #use delay(clock=20000000)
andwf RCSTA,W ; chequeo de errores #use rs232(baud=9600, xmit=PIN_C6,rcv=PIN_C7)
btfss STATUS,Z
goto RxError ; error! flag void main()
btfss PIR1,RCIF ; chequeo por dato listo {
return ; NO, regresa int valor = 0;
movf RCREG,W ; SI, lee el contenido del reg. serial MCU_init();
bsf regrx,0 ; setea flag de recepción lcd_putc("\fConversor AN0\n");
return printf(“\fConversor AN0\n”);
delay_ms(1000);
RxError:
bcf RCSTA,CREN ; aclara OVERRUN error bit while(TRUE){
nop set_adc_channel(0);
bsf RCSTA,CREN delay_ms(10);
movlw "X" valor=read_adc();
call EnviaCarLCD output_c(valor);
call ret300ms printf(lcd_putc,"\f%4u",valor);
movlw "E" printf("\f%4u",valor);
call EnviaCarLCD }
call ret300ms }
return
José Oliden Martínez José Oliden Martínez

También podría gustarte