PIC16F877 Con MikroC
PIC16F877 Con MikroC
PIC16F877 Con MikroC
PIC16F877
CARACTERÍSTICAS
• Velocidad de operación: hasta 20 MHz de reloj
• 8K x 14 bits por palabra de memoria de programa FLASH
• 368 x 8 bytes de memoria de datos (RAM)
• 256 x 8 bytes de memoria de datos EEPROM
CARACTERÍSTICAS (2)
• 14 fuentes de interrupciones
• Memoria de pila ( stack) de 8 niveles de profundidad
• Protecciones:
• Power-on Reset ( POR)
• Power-up Timer ( PWRT)
• Oscillator Start-up Timer ( OST)
• Watchdog Timer ( WDT) independiente del cristal.
PUERTOS DE ENTRADA Y SALIDA
• PORTA ( RA5, RA4, RA3, RA2, RA1, RA0 )
• Puerto paralelo esclavo ( PSP) con 8-bits de ancho, con terminales de control RD,
WR y CS
ARQUITECTURA INTERNA
• Arquitectura HARVARD.
RC3 Ent. Digital Sal. Digital Reloj sincrono SPI Reloj síncrono I2C
RC4 Ent. Digital Sal. Digital Datos entrada SPI Datos I2C
• Hexadecimal
• Binario
• char dato = 0b00001111;
• short dat = 0b10101010;
• unsigned char sig = 0b11001100;
• ASCII
• char dat = ‘a’;
• char m = ‘5’;
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;
NOTA: Entre dos accesos a bits se debe tener un retardo mínimo de 2 microsegundos.
ENTRADA O SALIDA
• Si deseamos configurar el puerto C con la siguiente asignación:
RC0 entrada
RC1 entrada
RC2 entrada
RC3 entrada
RC4 salida
RC5 salida
RC6 salida
RC7 salida
ADCON1 = 0 0 0 0 0 1 1 0
ADCON1 = 6 ;
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 RD7 del puerto
D. El tiempo de encendido es de 1000 milisegundo y el de apagado de 300 milisegundos.
ENCENDIDO DE LED ( ALGORITMO)
1. Configurar el bit 7 del puerto D como salida de datos
2. Encendido del led
3. Retardo por software de 1000 milisegundos.
4. Apagado del led
5. Retardo por software de 300 milisegundos
6. 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 )
{
TRISD.F7 = 0;
while( 1 )
{
PORTD.F7 = 1;
Delay_ms( 1000 );
PORTD.F7 = 0;
Delay_ms( 300 );
}
}
ENCENDIDO DE LED ( PROGRAMA 2)
void main ( void )
{
TRISD = 0;
while( 1 )
{
PORTD = 0x80;
Delay_ms( 1000 );
PORTD = 0;
Delay_ms( 300 );
}
}
EJERCICIOS PROPUESTOS 1
1. El alumno encenderá y apagara en forma alternada
dos led’s ubicados en los bit’s 2 y 3 del puerto 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)
1. Configuración de puerto como salida de datos.
2. Envío de primer dato al puerto de salida
3. Envío de segundo dato al puerto de salida
4. 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
char numero[5];
short dato[8];
long temperatura[15];
unsigned peso[7];
Luces
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)
{
TRISB = 0; // Configura puerto
apunta = 0; // Limpia apuntador
while(1) // Ciclo infinito
{
PORTB = dato [ apunta ]; // Envía dato
Delay_ms(1000);
apunta ++; // Incrementa apuntador
if ( apunta > = 8 ) // Si apuntador ≥ 8
apunta = 0; // Limpia apuntador
}
}
EJERCICIOS PROPUESTOS 3
1. El alumno enviara una secuencia por el puerto B usando los valores almacenado en
un arreglo.
00000011
00000110
00001100
00011000
00110000
01100000
11000000
OPERADORES A NIVEL DE BITS
Operador operacion
AND; compara pares de bits y regresa 1 si ambos son 1’s,
& de otra manera regresa 0.
porque...
0x1234 : 0001 0010 0011 0100
0x5678: 0101 0110 0111 1000
-----------------------------------
&: 0001 0010 0011 0000 esto es, 0x1230
/* De forma similar: */
Inicializa variable si
variable = 0 Inicializa
variable
Envía variable
no
al puerto
LUCES CON DESPLAZAMIENTO
(PROGRAMA 1)
void main ( void )
{ unsigned short dato;
TRISD = 0;
dato = 0b00000001;
while ( 1 )
{
PORTD = dato;
Delay_ms ( 300 );
dato = dato << 1;
if ( dato == 0 )
dato = 0x01;
}
}
OPERACIONES ARITMÉTICAS
Operador Operación
+ Suma
- Resta
* Multiplicación
/ División
TRISD = 0;
dato = 1;
while ( 1 )
{
PORTD = dato;
Delay_ms (250);
dato = dato * 2;
if ( dato == 0 )
dato = 0x01;
}
}
EJERCICIOS PROPUESTOS 4
1. El alumno realizara un programa que envíe al puerto C los
siguientes valores utilizando para generarlas, las
instrucciones de desplazamiento y/o aritméticas.
• 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
RA0 = 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 };
void main ( void )
{
TRISD = 0;
ADCON1 = 6;
TRISA = 0x7F;
Contador = 0;
for ( ; ; )
{
Delay_ms ( 500 );
if ( PORTA.F0 = = 0 )
PORTD = izquierda [ contador];
else
PORTD = derecha [ contador];
contador + + ;
If ( contador = = 10 )
contador = 0;
}
}
EJERCICIOS PROPUESTOS 5
1. 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)
MOTOR A PASOS 1
• Unipolar.- Tiene 4 bobinas independientes (A, B, C, D) y una
terminal común a todas ellas.
MOTOR A PASOS 2
• Unipolar.- Tiene 4 bobinas independientes (A, B, C, D) y
dos terminales comunes.
MOTOR A PASOS 2
• Bipolar.- Tiene 2 bobinas (A – C, B – D)
SECUENCIAS DE ACTIVACIÓN 1
• Unipolar.- Movimiento de 1 paso por pulso (mayor
torque).
Paso A B C D
1 1 1 0 0
2 0 1 1 0
3 0 0 1 1
4 1 0 0 1
SECUENCIAS DE ACTIVACIÓN 2
• Unipolar.- Movimiento de 1 paso por pulso (mayor
velocidad).
Paso A B C D
1 1 0 0 0
2 0 1 0 0
3 0 0 1 0
4 0 0 0 1
SECUENCIAS DE ACTIVACIÓN 3
• Unipolar.- Movimiento de 1/2 paso por pulso.
Paso A B C D
0.5 1 0 0 0
1 1 1 0 0
1.5 0 1 0 0
2 0 1 1 0
2.5 0 0 1 0
3 0 0 1 1
3.5 0 0 0 1
4 1 0 0 1
SECUENCIAS DE ACTIVACIÓN 4
• Bipolar.- Movimiento de un paso
Paso A C B D
1 1 0 1 0
2 1 0 0 1
3 0 1 0 1
4 0 1 1 0
SECUENCIA DE ACTIVACIÓN 5
• Bipolar.- Movimiento de medio paso
Paso A C B D
0.5 1 0 1 0
1 1 0 0 0
1.5 1 0 0 1
2 0 0 0 1
2.5 0 1 0 1
3 0 1 0 0
3.5 0 1 1 0
4 0 0 1 0
CIRCUITO DE POTENCIA 1 (MOTOR
UNIPOLAR )
CIRCUITO DE POTENCIA 2
(MOTOR UNIPOLAR )
CIRCUITO DE POTENCIA 3
(MOTOR BIPOLAR )
Este mismo diagrama se repetiría para manejar la segunda bobina
CIRCUITO DE POTENCIA X
(MOTOR A PASOS )
Circuito integrado UCN 5804 Circuito integrado SAA1042
CIRCUITO DE POTENCIA X1
(MOTOR UNIPOLAR )
CIRCUITO DE POTENCIA X2
(MOTOR BIPOLAR )
EJERCICIOS PROPUESTOS 5
2.- El alumno desarrollara un programa que envíe la secuencia de activación de un motor a
pasos ubicado en el puerto D. Si la terminal ubicada en el puerto A, RA6, sea igual a
0, el motor debe girar a la derecha, en caso contrario debe girar a la izquierda.
EJERCICIOS PROPUESTOS 5
(ESQUEMÁTICO)
6.- DISPLAY DE 7 SEGMENTOS
• Realizar un programa en donde se implemente un contador de 00-99 desplegando en un
par de display’s de 7 segmentos. El programa 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)
1. Configurar los puertos, inicialización de variables (unidades = ‘0’ decenas = ‘0’)
2. Envío de decenas
3. Habilitación de decenas
4. Envío de unidades
5. Habilitación de unidades
6. Incremento de unidades
7. Si unidades mayor de ‘9’ entonces 9
8. Sigue 2
9. Unidades = ‘0’
10. Incrementa decenas
11. Si decenas mayor de ‘9’ entonces 12
12. Sigue 2
13. Decenas=‘0’
14. 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, 0x1B, 0x4F, 0x66, 0x6D, 0x5E, 0x07, 0x7F, 0x67 };
}
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 RE0 del puerto E.
EJERCICIO PROPUESTO 6 ( ESQUEMÁTICO)
DISPLAY DE CRISTAL LIQUIDO
LCD (FUNCIONES BUS 8 BITS)
• Lcd8_Config
• Lcd8_Init
• Lcd8_Out
• Lcd8_Out_Cp
• Lcd8_Chr
• Lcd8_Chr_Cp
• Lcd8_Cmd
LCD8_CONFIG
• Descripción: Inicializa el LCD usando un bus de datos de 8 bits. Los puertos de Control (ctrlport) y Datos
(dataport) usan la asignación de terminales especificada.
• Ejemplo:
-Imprime “Hello!” en el LCD en la linea 1, columna 3
Lcd8_Out(1, 3, "Hello!");
LCD8_OUT_CP
• Descripción: Imprime mensaje en el LCD en la posición actual del cursor.
Lcd8_Out_Cp( "Here!");
LCD8_CHR
• Descripción: Imprime un caracter en el LCD en la fila y
columna especificada (row y col).
char character );
Lcd8_Chr_Cp( 'e');
LCD8_CMD
• Descripción: Envía un comando al LCD. Se puede pasar a la función una de las
constantes predefinidas.
Inicializa puertos de
datos y control
Envía mensaje
Envía comando de
Corrimiento a la izq.
LCD 8 BITS ( ESQUEMÁTICO)
LCD 8 BITS ( PROGRAMA 1)
Void main(void)
{ TRISB = 0;
TRISC = 0;
Lcd8_Config(&PORTC,&PORTB,0,2,1,7,6,5,4,3,2,1,0);
while(1)
{
Lcd8_Cmd(LCD_SHIFT_LEFT);
Delay_ms(100);
}
}
LCD 8 BITS ( PROGRAMA 2)
char mensaje[ ] = “Programa numero 2”;
void main(void)
{ TRISB = 0;
TRISC = 0;
Lcd8_Config(&PORTC,&PORTB,0,2,1,7,6,5,4,3,2,1,0);
Lcd8_Out(1,1,mensaje);
while(1)
{
Lcd8_Cmd(LCD_SHIFT_LEFT);
Delay_ms(500);
}
}
LCD 8 BITS ( ESQUEMÁTICO)
LCD 8 BITS ( PROGRAMA 3)
char *mensaje3 = “mensaje tres”;
void main(void)
{ TRISB = 0;
TRISC = 0;
Lcd8_Init(&PORTC,&PORTB);
Lcd8_Out(1,1,mensaje3);
Lcd8_Out(2,1,”segunda fila”);
while(1)
{
Lcd8_Cmd(LCD_SHIFT_LEFT);
Delay_ms(50);
}
}
EJERCICIOS PROPUESTOS 7
1. Programa que forme la palabra ‘HOLA’ en un LCD,
configurado para utilizar un bus de 8 bits. Las letras
deben desplazarse de derecha a izquierda. Primero
debe aparecer la H, moviendose desde la derecha a
la primer columna a la izquierda. Enseguida debe
aparecer la O, tambien saliendo de la derecha y
terminando a la derecha de la letra H. Lo mismo
debe suceder para las letras L y A. El programa debe
ser ciclico.
EJERCICIO PROPUESTO 8
H H O HO L
.
H H O
.
.
H H O H O LA
LCD (FUNCIONES BUS 4 BITS)
• Lcd_Config
• Lcd_Init
• Lcd_Out
• Lcd_Out_Cp
• Lcd_Chr
• Lcd_Chr_Cp
• Lcd_Cmd
LCD_CONFIG
• Descripción: Inicializa LCD usando un bus de datos de 4 bits. El puerto
de Control (ctrlport) y Datos (dataport) tiene las asignaciones de
terminales especificadas.
• Ejemplo:
-Imprime “Hello!” en el LCD en la línea 1, columna 3
Lcd_Out(1, 3, "Hello!");
LCD_OUT_CP
• Descripción: Imprime mensaje en el LCD en la posición
actual del cursor.
• Ejemplo:
- Imprime “Here!” en la posición actual del cursor
Lcd_Out_Cp("Here!");
LCD_CHR
• Descripción: Imprime un caracter en el LCD en la fila y columna
especificada (row y col).
Ejemplo:
- Imprime la letra ‘i’ en el LCD en la línea 2,y columna 3
Lcd_Out(2, 3, 'i');
LCD_CHR_CP
• Descripción: Imprime un caracter en el LCD en la posición
actual del cursor.
• Ejemplo:
- Imprime la letra ‘e’ en la posición actual del cursor
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)
1. Inicialice los puertos de datos y control.
2. Envía mensaje a desplegar.
3. Envía comando de desplazamiento hacia la derecha.
4. 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 ( ESQUEMÁTICO CONFIG)
LCD 4 BITS ( PROGRAMA 1)
void main(void)
{ TRISD = 0;
Lcd_Config(&PORTD,0,2,1,7,6,5,4);
Lcd_Out(1,1,”Envio de datos”);
Lcd_Out(2,1,”Usando bus de 4 bits”);
while(1)
{
Lcd_Cmd(LCD_SHIFT_RIGHT);
Delay_ms(200);
}
}
LCD 4 BITS ( PROGRAMA 2)
char mensaje[11]={‘B’, ‘u’, ‘s’, ‘ ’, ‘4’, ‘ ’, ‘b’, ‘i’, ‘t’, ‘s’, ‘\0’};
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)
LCD 4 BITS ( PROGRAMA 3)
char *mensaje3 = “programa 3 usando bus 4 bits”;
void main(void)
{ TRISB = 0;
TRISC = 0;
Lcd8_Init(&PORTC,&PORTB);
Lcd8_Out(1,16,mensaje3);
Lcd8_Out(2,1,”fila=2 columna=5”);
while(1)
{
Lcd8_Cmd(LCD_SHIFT_LEFT);
Delay_ms(50);
}
}
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=“ “; //se inicializa un apuntador a 4 espacios
Ejemplo:
short t = -4;
char *txt=“ “; // Se inicializa un apuntador de 5 espacios
Ejemplo:
unsigned t = 437;
char *txt=“ “; // Inicializa un apuntador con 6 espacios
Ejemplo:
int j = -4220;
char *txt=“ “; // Inicializa un apuntador con 6 espacios
Ejemplo:
long jj = -3700000;
char *txt=“ “; // Inicializa un apuntador con 12 espacios
Ejemplo:
float ff = -374.2;
char *txt=“ “; // Inicializa un apuntador con 14 espacios
Inicializa puertos
(LCD)
Convierte contador
a ASCII
Inicializa contador
Envía a LCD
ASCII
Incrementa
contador
CONTADOR 0-9 ( PROGRAMA)
void main(void)
{ unsigned short contador;
char cadena[ 5 ] = “ “;
TRISD = 0;
Lcd_Config(&PORTD,0,2,1,7,6,5,4);
contador = 0;
Lcd_Out(1,1,”Contador 0-9”);
while(1)
{
ShortToStr ( 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
1. 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
1. 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)
1. Configuración de puertos (teclado y lcd).
2. Lectura de teclado
3. Conversión a ASCII
4. Envío al LCD
5. 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)
unsigned short kp, cnt;
char txt[5];
void main()
{ cnt = 0;
Keypad_Init(&PORTD);
Lcd8_Init(&PORTC, &PORTB, 0, 2, 1, 7, 6, 5, 4, 3, 2, 1, 0); // Inicializa LCD en puerto B y puerto C
Lcd8_Cmd(LCD_CLEAR); // Limpia display
Lcd8_Cmd(LCD_CURSOR_OFF); // Cursor apagado
Lcd8_Out(1, 1, "Key :");
Lcd8_Out(2, 1, "Times:");
do { kp = 0; // Espera a que se presione una tecla pressed
do kp = Keypad_Read();
while (!kp); // Prepara valor para salida
switch (kp)
{ case 10: kp = 42;
break; // '*'
case 11: kp = 48;
break; // '0'
case 12: kp = 35;
break; // '#'
default: kp += 48;
}
cnt++;
Lcd9_Chr(1, 10, kp);
if (cnt == 255) { cnt = 0; Lcd8_Out(2, 10, " "); } // Imprime en LCD
WordToStr(cnt, txt);
Lcd8_Out(2, 10, txt);
} while (1);
}
EJERCICIO PROPUESTO 9
1. El alumno realizara un programa que tome 3 números desde un teclado matricial, los
guarde en un arreglo, los convierta a un numero que se guarde en una variable tipo
entera. Con este numero el alumno deberá proporcionar el producto por 2 y división
entre 2 resultantes. Visualizando los resultados en un LCD.
EJERCICIO PROPUESTO 9