Documentos de Académico
Documentos de Profesional
Documentos de Cultura
PIC16F887
QUE ES UN MICROCONTROLADOR?
• Arquitectura RISC
• Frecuencia de Operación 0-20 MHz
• Oscilador interno de precisión calibrado de fábrica +/- 1%
• Selección de frecuencia por Software con un rango de
8MHz a 31KHz
• Voltaje de alimentación de 2.0-5.5V
• 35 Pines de Entrada/Salida
-Alta corriente de salida (source/sink) para operar
directamente un LED
-Resistencias de pull-up programables individualmente
por software
Principales características (2)
FUNCIONES FUNCION
DEL PORTB
RB0 Ent. Digital Sal digital Ent. Interrupción 0
RB1 Ent. Digital Sal Digital
RB2 Ent. Digital Sal Digital
RB3 Ent. Digital Sal Digital PGM(función LVP)
RB4 Ent. Digital Sal Digital
RB5 Ent. Digital Sal Digital
RB6 Ent. Digital Sal Digital PGC (función LUP)
RB7 Ent. Digital Sal Digital PGD( función LVP)
FUNCIONES DEL PORTC
TERMINAL FUNCION
RC0 Ent. Digital Sal. Digital Sal. Osc Terminal1
Terminal Funciones
Las variables bit permiten almacenar un valor lógico es decir verdadero o falso, 0 ó 1.
Las variables char se utilizan para almacenar caracteres codificados con el código ASCII, son útiles para
guardar letras o textos.
Una variable short almacena un número entero de 8 bits corto puede valer de: -127 a 127.
Las variables tipo int guardan números enteros de 16 bits, está variable permite guardar números de: -32767
a 32767.
La variable tipo long almacena números enteros largos de 32 bits, su rango puede ser de:
-2147483647 a 2147483647.
Las variables tipo float y double permiten guardar números con punto decimal.
En la siguiente tabla se pueden apreciar las características de las
variables Tipo de variable Tamaño en Bytes Valores que soporta
bit 1 0ó1
char 1 -127 a 127
short 1 -127 a 127
int 2 - 32767 a 32767
long 4 - 2147483647 a 2147483647
float 4 -1.5x10^45 a 3.4x10^38
double 4 -1.5x10^45 a 3.4x10^38
unsigned char 1 0 a 255
unsigned short 1 0 a 255
unsigned int 2 0 a 65535
unsigned long 4 0 a 4294967295
• La declaración de variables se realiza indicando el tipo de variable seguido de un nombre
que el desarrollador asigna arbitrariamente a la variable. En el punto de la declaración de
una variable es posible dar un valor inicial a cada una de las variables sin embargo
este último no es estrictamente necesario. Por último la declaración debe culminar con el
carácter punto y coma (;).
• En los siguientes ejemplos se puede apreciar como se hacen las declaraciones:
• · Suma
• · Resta
• · Multiplicación
• · División
• · Modulo
La suma aritmética entre dos o más números, se puede hacer como se ve en el siguiente ejemplo:
int A; int B; int C;
C = A+B; //Está expresión guarda la suma de A y B en la variable C.
C = A+B+C; //Está expresión guarda la suma de A, B y C en la variable C.
La resta aritmética entre dos o más números, se puede hacer como se ve en el siguiente ejemplo:
int A; int B; int C;
C = A-B; //Está expresión guarda la diferencia entre A y B en la variable C.
C = A-B-C; //Está expresión guarda la diferencia entre A, B y C en la variable C.
La operación matemática de multiplicación se puede realizar entre dos o más
números, la operación se relaciona con el carácter asterisco (*), está expresión se
puede apreciar con mayor claridad en los siguientes ejemplos:
int A; int B; int C;
C = A*B; //Está expresión guarda la multiplicación entre A y B en la variable C.
C = A*B*C; //Está expresión guarda la multiplicación entre A, B y C en la variable C.
Operación lógica OR, o inclusiva, está se denota con el carácter barra vertical (|);
unsigned short VALOR1=0b01010000; //Variable inicializada en binario con el
número 80. unsigned short VALOR2=0b01011111; //Variable inicializada en binario
con el número 95. unsigned short RESULTADO;
RESULTADO = VALOR1|VALOR2; //El valor de la operación lógica o, es
guardado en
//RESULTADO, 95.
Operación lógica XOR, o exclusiva, está se denota con el carácter acento
circunflejo (^); unsigned short VALOR1=0b01010000; //Variable
inicializada en binario con el número 80. unsigned short
VALOR2=0b01011111; //Variable inicializada en binario con el número
95. unsigned short RESULTADO;
RESULTADO = VALOR1^VALOR2; //El valor de la operación lógica
AND
//es guardado en RESULTADO, 15.
Una función es una fracción de código que realiza una tarea específica cada vez que
está es invocada por el flujo del programa principal. Las funciones cuentan con dos
características fundamentales, uno o más parámetros de entrada, y un parámetro de
salida. Cualquiera de estás dos características puede ser una variable o un arreglo de
ellas, de igual manera estos parámetros de entrada y salida pueden ser vacíos.
Los nombres que se designan a las funciones cumplen con las mismas reglas para nombrar las variables. El siguiente
ejemplo muestra una función que es capaz de calcular el producto de dos números con punto decimal:
Una función puede recurrir a otra función para realizar funciones más complejas, para demostrar está situación se
puede ver el siguiente ejemplo, que realiza el cálculo del área de una circunferencia en función de su radio:
El á ea de la i u fe e ia se al ula po edio de la e ua ió A=π ², do de el valo
de π es
aproximadamente 3,1416.
En el caso en que una función requiera variables internas está declaración se debe
hacer al principio de la misma, antes de realizar cualquier otra acción o instrucción.
float Area_Circunferencia ( float Radio ) //Función para calcular el área del circulo.
{ // Apertura de la función con corchete.
float Area;
La sentencia condicional if e if
else
La estructura de la sentencia if evalúa una condición lógica y ejecuta
una porción de código si y solo si el resultado de la evaluación es
verdadera. Observe la estructura del la sentencia if en el siguiente
ejemplo:
short Valor;
if( Valor>100 ) //Este if evalúa si la variable Valor es mayor que 100.
{
// Porción de código que se ejecuta si el if es verdadero.
}
short CONT=0; //Declaración de variable entera que cuenta hasta 100. while( CONT<100 )
//Declaración del ciclo while.
{
CONT++; //Incremento de la variable CONT.
}
short CONT=0; //Declaración de variable entera que cuenta hasta 100. while( CONT<100 )
//Declaración del ciclo while.
{
CONT++; //Incremento de la variable CONT.
}
Hexadecimal
• short x = 0x37; /* decimal 55 */
• short y = 0x7F; /* decimal 127 */
• int z = 0x125; /* decimal 293 */
Asignación de datos
Octal
• int m = 023; /* 19 */
• short n = 016; /* 14 */
Binario
• char dato = 0b00001111;
• short dat = 0b10101010;
• unsigned char sig = 0b11001100;
ASCII
• ha dat = a ;
• ha = ;
Registros asociados
Entrada/salida Configuración
PORTA TRISA
PORTB TRISB
PORTC TRISC
PORTD TRISD
PORTE TRISE
Entrada o salida
SALIDA DE DATOS : 0
ENTRADA DE DATOS: 1
Ejemplo:
PORTC.F0 = 1;
PORTD.F5 = 0;
PORTB.F7 = 1;
ANSEL = 0B00000011;
ANSELH = 0;
Delay_ms (retardo por software)
Descripción: Crea un retardo por software dado el tiempo en
milisegundos (constante). El rango de constantes aplicables a la función
depende de la frecuencia del oscilador. Es una función interna; El código es
generado en el lugar donde se hace la llamada, así que la llamada de esta
función no cuenta dentro del limite de llamadas anidadas.
Ejemplo:
Generar un retardo de 1 segundo
// Definición de funciones
void main(void)
{
// Definición de variables locales
// ciclo infinito
while ( 1 )
{
// Programa de usuario
}
}
Estructura de un programa en C
( ciclo for )
// Definición de variables globales
// Definición de funciones
void main(void)
{
// Definición de variables locales
// ciclo infinito
for ( ; ; )
{
// Programa de usuario
}
}
Estructura de un programa en C
( ciclo do - while )
// Definición de variables globales
// Definición de funciones
void main(void)
{
// Definición de variables locales
// ciclo infinito
do
{
// Programa de usuario
} while ( 1 ) ;
}
1.- Encendido de LED
Crear un programa que encienda y apague un led, ubicado en la
terminal RC7 del puerto C. El tiempo de encendido es de 1000
milisegundo y el de apagado de 300 milisegundos.
Encendido de LED (algoritmo)
• Configurar el bit 7 del puerto C como salida de
datos
• Encendido del led
• Retardo por software de 1000 milisegundos.
• Apagado del led
• Retardo por software de 300 milisegundos
• Repetir el paso 2
Encendido de LED (diagrama de flujo)
Led
Retardo de 1000ms
Encendido de LED (esquemático)
Encendido de LED (programa)
Void main (void)
{
ANSEL= 0;//
ANSELH = 0;
TRISE = 0;
PORTE = 1;
PORTC= 0;
TRISC.F7 = 0;
while( 1 )
{
PORTC.F7 = 1;
Delay_ms( 500 );
PORTC.F7 = 0;
Delay_ms( 300 );
}
}
Encendido de LED (programa 2)
Void main (void)
{
ANSEL= 0;
ANSELH = 0;
TRISE = 0;
PORTE = 1;
PORTC= 0;
TRISC = 0;
while( 1 )
{
PORTC = 0x80;
Delay_ms( 500 );
PORTC = 0;
Delay_ms( 300 );
}
}
Ejercicios propuestos 1
• El alumno encenderá y apagara en forma alternada
dos led s u i ados e los it s y del pue to B.
Los retardos serán de 500 milisegundos (ambos).
Usando asignación directa a bits.
Secuencia :
• 00000001
• 00000010
• 00000100
• 00001000
• 00010000
• 00100000
• 01000000
• 10000000
Luces secuenciales (algoritmo)
• Configuración de puerto como salida de datos.
• Envío de primer dato al puerto de salida
• Envío de segundo dato al puerto de salida
• Envío de tercer dato al puerto de salida
.
.
.
9. Envío de ultimo dato al puerto de salida
10. Regresar a 2
Luces secuenciales (diagrama de flujo)
Luces
Configura puerto
como salida Envía 00000100 Envía 00100000
Limpia apuntador si
apuntador ≥ 8 Limpia
apuntador
Envía dato
no
apuntado
Luces con arreglo (programa)
short dato [ 8 ] = {1, 2, 4, 8, 16, 32, 64, 128};
short apunta;
void main(void)
{
ANSEL= 0;
ANSELH = 0;
TRISE = 0;
PORTE = 1;
PORTC= 0;
TRISC = 0;
AND; compara pares de bits y regresa 1 si ambos son 1’s, de otra manera
regresa 0.
&
OR (inclusive); compara pares de bits y regresa 1 si uno o ambos son 1’s, de otra
manera regresa 0.
|
<< Corrimiento hacia la izquierda; mueve los bits hacia la izquierda, descartando el
bit mas a la izquierda y asignando ceros al bit a la derecha.
>> Corrimiento hacia la derecha; mueve los bits hacia la derecha, descartando el bit
mas a la derecha y asignando ceros al bit a la izquierda.
Ejemplos operadores lógicos
0x1234 & 0x5678 /* Igual 0x1230 */
porque...
0x1234 : 0001 0010 0011 0100
0x5678: 0101 0110 0111 1000
-----------------------------------
&: 0001 0010 0011 0000 esto es, 0x1230
/* De forma similar: */
Luces
Inicializa variable si
variable = 0 Inicializa
variable
Envía variable
no
al puerto
Luces con desplazamiento (programa 1)
void main ( void )
{unsigned short dato;
ANSEL= 0;
ANSELH = 0;
TRISE = 0;
PORTE = 1;
PORTC= 0;
TRISC = 0;
dato = 0b00000001;
while ( 1 )
{
PORTC = dato;
Delay_ms ( 300 );
dato = dato << 1;
if ( dato == 0 )
dato = 0x01;
}
}
Operaciones aritméticas
Operador Operación
+ Suma
- Resta
* Multiplicación
/ División
% Resto, regresa el residuo de la división entera (no puede ser usado con
variables flotantes
Ejemplo:
// Si RB0 es uno, colocar en uno la terminal RC0:
if ( PORTB.F0 )
PORTC.F0 = 1;
Incrementa
Limpia contador contador
si
si Contador = 10 Limpia
RD0 = 0 contador
Envía no
no Secuencia_derecha
Secuencias condicionadas (programa)
short izquierda[10] = { 0, 1, 3, 6, 12, 24, 48, 96, 192, 128 };
short derecha[10] = { 128, 192, 226, 102, 56, 28, 14, 7, 3, 1 };
Short contador = 0;
void main ( void )
{
TRISD.F0 = 1;
ANSEL= 0;
ANSELH = 0;
TRISE = 0;
PORTE = 1;
TRISC = 0;
for ( ; ; )
{
Delay_ms ( 500 );
if ( PORTD.F0 == 0 )
PORTC = izquierda [ contador];
else
PORTC = derecha [ contador];
contador ++ ;
If ( contador == 10 )
contador = 0;
}
}
Ejercicios propuestos 5
• El alumno desarrollara un programa que envíe una secuencia de
números BCD a un display de 7 segmentos ubicados en el puerto
D. Si la terminal RA1 ubicada en el puerto A, es igual a 0, la
numeración debe ser incremental; en caso contrario debe
decrementarse.
Ejercicios propuestos 5 (esquemático)
6.- Display de 7 segmentos
Realizar un programa en donde se implemente un contador de 00-
desplega do e u pa de display s de seg e tos. El p og a a
debe realizar la visualización utilizando el multiplexaje de los datos,
utilizando el puerto B como bus de datos y las terminales RC0 y RC1
como terminales de habilitación de display.
Display de 7 segmentos (algoritmo)
• Co figu a los pue tos, i i ializa ió de va ia les u idades =
de e as =
• Envío de decenas
• Habilitación de decenas
• Envío de unidades
• Habilitación de unidades
• Incremento de unidades
• “i u idades ayo de e to es
• Sigue 2
• U idades =
• Incrementa decenas
• “i de e as ayo de e to es
• Sigue 2
• De e as=
• Sigue 2
Display de 7 segmentos (diagrama de flujo)
Display
Limpia unidades
Incrementa decenas
Configura puertos
Inicia variables
si
Envía decena Decenas>’9’
Envía unidad
Incrementa unidad no
si Limpia decenas
Unidades>’9’
no
Display de 7 segmentos (programa)
short numero[ ] = { 0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F };
short unidades , decenas = 0;
void main() {
TRISC = 0;
ANSEL= 0;
TRISA.F4 = 0;
TRISA.F5 = 0;
while ( 1 )
{
PORTC = numero [ decenas ]; // Envía decenas
PORTA.F4 = 1; // Habilita el display de decenas
Delay_ms( 100 );
PORTA.F4 = 0;
PORTC = numero [ unidades ]; // Envía unidades
PORTA.F5 = 1; // Habilita el display de unidades
delay_ms( 100 );
PORTA.F5 = 0;
unidades++; // Incrementa unidades
if ( unidades > 9 )
{
unidades = 0; // Reinicia unidades
decenas++; // Incrementa decenas
if ( decenas > 9 )
{
decenas = 0; // Reinicie decenas
}
}
}
}
Display de 7 segmentos ( esquemático )
Ejercicio propuesto 6 (d7seg)
El alumno modificara el programa elaborado de tal forma que se
cambie el incremento por decremento, al usar un interruptor. Si el
interruptor esta apagado el conteo será incremental, en caso
contrario, el conteo será decremental. El interruptor estará ubicado
en la terminal RD0 del puerto D.
Ejercicio propuesto 6 (esquemático)
Contador 7 segmentos usando interrupciones
unsigned short unidades,decenas, digit_no;
unsigned int cnt ; // Definir la variable cnt
short numero[ ] = { 0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F };
void interrupt() {
cnt++; // Con una interrupción la cnt se incrementa en 1
if (digit_no == 0) {
PORTA.F4 = 0; // Apagar ambos visualizadores
PORTA.F5 = 0;
PORTC = numero [ unidades ]; // Envía unidades
PORTA.F5 = 1; // Habilita el display de unidades
digit_no = 1;
}
else{
PORTA.F4 = 0; // Apagar ambos visualizadores
PORTA.F5 = 0;
PORTC = numero [decenas]; // Colocar máscara para visualizar decenas en el
PORTA.F4 = 1; // Habilita el display de unidades
digit_no = 0;
}
TMR0 = 96; // El valor inicial se devuelve en el temporizador TMR0
INTCON = 0x20; // Bit T0IE se pone a 1, el bit T0IF se pone a 0
}
Contador 7 segmentos usando interrupciones
void main (void) {
unsigned short dato , led;
ANSEL= 0;
TRISA.F3 = 0;
TRISA.F4 = 0;
TRISA.F5 = 0;
TRISC = 0;
unidades, decenas, digit_no = 0;
OPTION_REG = 0x84; // Pre-escalador se le asigna al temporizador TMR0
TMR0 = 96; // Temporizador T0 cuenta de 96 a 255
INTCON = 0xA0; // Habilitada interrupción TMR0
while(1) { //Ciclo inifinito
delay_ms(500);
unidades ++;
if (unidades > 9) {
unidades = 0;
decenas ++ ;
if ( decenas > 9 ) {
decenas = 0;
}
}
}
}
Display de cristal liquido
Comandos predefinidos
Comando
Función
_LCD_RETURN_HOME Regresa el cursor a la posición 1,1. Los datos de la RAM no son afectados.
Lcd_Init
Lcd_Out
Lcd_Out_Cp
Lcd_Chr
Lcd_Chr_Cp
Lcd_Cmd
Lcd_Out
Descripción: Imprime mensaje en el LCD en la fila y
columna especificada (row y col).
Ejemplo:
-I p i e Hello! e el LCD e la lí ea , olu a
Lcd_Out(1, 3, "Hello!");
Lcd_Out_Cp
Descripción: Imprime mensaje en el LCD en la
posición actual del cursor.
Ejemplo:
- I p i e He e! e la posi ió a tual del u so
Lcd_Out_Cp("Here!");
Lcd_Chr
Descripción: Imprime un caracter en el LCD en la fila
y columna especificada (row y col).
Ejemplo:
- I p i e la let a i e el LCD e la lí ea ,y olu a
Lcd_Chr(2, 3, 'i');
Lcd_Chr_Cp
Descripción: Imprime un caracter en el LCD en la
posición actual del cursor.
Ejemplo:
- I p i e la let a e e la posi ió a tual del u so
Lcd_Chr_Cp('e');
Lcd_Cmd
Descripción: Envía un comando al LCD. Se puede pasar a la
función una de las constantes predefinidas. Los comandos son
los mismos para ambos modos de manejo del LCD (bus 8 o 4
bits).
Ejemplo:
- Apaga el cursor, no aparece en el LCD
Lcd_Cmd(_LCD_CURSOR_OFF);
8.- LCD 4 BITS
Diseñar el programa que inicialice un LCD, usando un bus de datos
de 4 bits, y a continuación mande un mensaje cualquiera de
bienvenida. El mensaje debe desplazarse hacia la derecha en forma
continua.
LCD 4 BITS (algoritmo)
• Inicialice los puertos de datos y control.
• Envía mensaje a desplegar.
• Envía comando de desplazamiento hacia la derecha.
• Repite el paso 3.
LCD 4 BITS (diagrama de flujo)
LCD 8 bits
Inicializa puertos de
datos y control
Envía mensaje
Envía comando de
Corrimiento a la der.
LCD 4 BITS (programa 1)
void main(){
ANSEL = 0; // Configura los pins AN como e/s digital
ANSELH = 0;
C1ON_bit = 0; // Desabilita comparadores
C2ON_bit = 0;
Lcd_Init(); // Initializa el LCD
Lcd_Cmd(_LCD_CLEAR); // Borra el display
Lcd_Cmd(_LCD_CURSOR_OFF); // Apaga el Cursor
Lcd_Out(1,6,txt3); // Escribe text in first row
Lcd_Out(2,6,txt4); // Write text in second row
Delay_ms(2000);
Lcd_Cmd(_LCD_CLEAR); // Clear display
Lcd_Out(1,1,txt1); // Write text in first row
Lcd_Out(2,5,txt2); // Write text in second row
Delay_ms(2000);
for(i=0; i<4; i++) { // Move text to the right 4 times
Lcd_Cmd(_LCD_SHIFT_RIGHT);
Move_Delay();
}
LCD 4 BITS (programa 1)
void main(void)
{ TRISD = 0;
Lcd_Config(&PORTD,0,2,1,7,6,5,4);
Lcd_Out(1, 6, mensaje);
while(1)
{
Lcd_Cmd(LCD_SHIFT_RIGHT);
Delay_ms(200);
}
}
LCD 4 BITS (esquemático Init)
Conversión de tipo de datos
Tipo de dato a cadena
ByteToStr
ShortToStr
WordToStr
IntToStr
LongToStr
FloatToStr
ByteToStr
Descripcion: Crea una cadena de salida de un pequeño numero sin
signo (valor numérico menos a 0x100). La cadena esta ajustada a un
ancho de 3 caracteres; Las posiciones a la izquierda que no se usan
en la conversión se rellenan con espacios.
Ejemplo:
unsigned short t = 24;
char txt[4]; //se declara arreglo con 4 lugares
Ejemplo:
short t = -4;
char txt[5]; // Se inicializa un apuntador de 5 espacios
Ejemplo:
unsigned int t = 437;
char txt=[6]; // Se declara arreglo con 6 lugares
Ejemplo:
int j = -4220;
char txt[7]; // Se declara arreglo con 7 lugares
Ejemplo:
long jj = -3700000;
char txt[12]; // Se declara arreglo con 12 espacios
Ejemplo:
float ff = -374.2;
char txt[14]; // Se declara arreglo con 14 espacios
Inicializa puertos
(LCD)
Convierte contador
a ASCII
Inicializa contador
Envía a LCD
ASCII
Incrementa
contador
Contador 0-9 (programa)
sbit LCD_RS at RD2_bit;
sbit LCD_EN at RD3_bit;
sbit LCD_D4 at RD4_bit;
sbit LCD_D5 at RD5_bit;
sbit LCD_D6 at RD6_bit;
sbit LCD_D7 at RD7_bit;
sbit LCD_RS_Direction at TRISD2_bit;
sbit LCD_EN_Direction at TRISD3_bit;
sbit LCD_D4_Direction at TRISD4_bit;
sbit LCD_D5_Direction at TRISD5_bit;
sbit LCD_D6_Direction at TRISD6_bit;
sbit LCD_D7_Direction at TRISD7_bit;
void main(void){
char cadena[ 4] ;
unsigned short contador = 0;
Lcd_init();
Lcd_Out , ,”Co tador - ”;
while(1)
{
ByteToStr ( contador , cadena );
Lcd_Out ( 2 , 8 , cadena );
contador ++;
Delay_ms(500);
}
}
Contador 0-9 (esquemático)
Contador 0-9 (funcionamiento)
Contador 0-9 : Contador 0-9 : Contador 0-9 :
0 1 2
Contador 0-9 :
6
. . . Contador 0-9 :
9
Ejercicio propuesto 8
• Programa que utilice un LCD, configurado para usar
un bus de 8 bits. En el LCD deben aparecer en
forma secuencial, los números de la secuencia 1 – 2
– 4 – 8 – 16 – 32 – 64 – 128 – 256 – 512 – 1024 – 2048 –
4096 – 8192 – 16384 - 32768. Los numero deben ser
generados por operaciones aritméticas. El
desplegado debe hacerse de la forma mostrada en
las siguientes figuras. Se utiliza la segunda fila,
presentando hasta 3 numeros consecutivos, un
numero a la izquierda, uno mas al centro y otro a la
derecha.
Ejercicio propuesto 8
Serie de numeros
8 16 32
. . . Serie de numeros
8192 16384 32768
Ejercicio propuesto 9
• El alumno diseñara un programa en donde se muestre en un LCD
los números desde 00 hasta el 99. Con un intervalo de tiempo
entre cambio igual a 500 milisegundos.
Ejercicio propuesto 9
Contador 00-99 cada 500 mseg Contador 00-99 cada 500 mseg Contador 00-99 cada 500 mseg
00 01 02
Contador 00-99 cada 500 mseg Contador 00-99 cada 500 mseg Contador 00-99 cada 500 mseg
03 04 05
Keypad_Init
Keypad_Read
Keypad_Released
Keypad_Init
Descripción: Inicializa el puerto para trabajar con el teclado.
Las terminales del teclado deben estar conectadas de la
siguiente forma:
port.F0 columna 1
port.F1 columna 2
port.F2 columna 3
port.F3 columna 4
port.F4 fila 1
port.F5 fila 2
port.F6 fila 3
port.F7 fila 4
Ejemplo:
kp = Keypad_Read();
Keypad_Released
Descripción: La llamada a la función Keypad_Released es una función
blocking call: La función espera hasta que cualquier tecla sea presionada y
liberada. Cuando se libera, la función regresa de 1 a 12, dependiendo de la
tecla presionada.
Ejemplo:
Keypad_Released();
10.- Teclado matricial (problema)
Se desea un programa con el cual se muestre en un LCD (bus 8 bits
en puerto B y puerto C como control) la tecla presionada en un
teclado matricial (puerto D).
Teclado matricial (algoritmo)
• Configuración de puertos (teclado y lcd).
• Lectura de teclado
• Conversión a ASCII
• Envío al LCD
• Regresar a 2
Teclado matricial (diagramas de flujo)
teclado
Inicializa puertos
(LCD y teclado)
Lee teclado
Convierte a ASCII
Envía a LCD
Teclado matricial (esquemático)
Teclado matricial (programa)
// Conexiones del Modulo LCD
sbit LCD_RS at RD2_bit;
sbit LCD_EN at RD3_bit;
sbit LCD_D4 at RD4_bit;
sbit LCD_D5 at RD5_bit;
sbit LCD_D6 at RD6_bit;
sbit LCD_D7 at RD7_bit;
sbit LCD_RS_Direction at TRISD2_bit;
sbit LCD_EN_Direction at TRISD3_bit;
sbit LCD_D4_Direction at TRISD4_bit;
sbit LCD_D5_Direction at TRISD5_bit;
sbit LCD_D6_Direction at TRISD6_bit;
sbit LCD_D7_Direction at TRISD7_bit;
// Fin de conexiones del modulo LCD
// definicion de conexiones del teclado
char keypadPort at PORTB;
// esta conectado al puerto B
char kp, contador=0;
void main(){
ANSEL = 0; // Deshabilita entradas analogicas 0-7
ANSELH = 0; // Deshabilita entradas analógicas 8-11
Keypad_Init(); //Inicializa el teclado.
Lcd_Init(); //Inicializa el LCD.
Lcd_Cmd(_LCD_CLEAR); //Borra el display.
Lcd_Cmd(_LCD_CURSOR_OFF); //Apaga el cursor.
Teclado matricial (programa)