PIC16F877 Con MikroC

Embed Size (px)

Citation preview

CursoCurso-Taller programacin en lenguaje C para microcontroladores PICPIC16F877

Caractersticas Velocidad de operacin: 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

Caractersticas (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 ) PORTB ( RB7, RB6, RB5, RB4, RB3, RB2, RB1, RB0 ) PORTC ( RC7, RC6, RC5, RC4, RC3, RC2, RC1, RC0 ) PORTD ( RD7, RD6, RD5, RD4, RD3, RD2, RD1, RD0 ) PORTE ( RE2, RE1, RE0 )

Caractersticas (perifricos) Timer 0: timer/counter de 8 bits con un preescalador de 8 valores. Timer 1: 16-bit timer/counter con pre-escalador Timer 2: 8-bit timer/counter con registro de estado de 8-bit, pre-escalador y post-escalador Dos mdulos de Capture, Compare, PWM Capture es de 16-bit, max. resolucin es 12.5 ns Compare es de 16-bit, max. resolucin es 200 ns PWM max. resolucin de 10-bit

Caractersticas (perifricos 2) Convertidor analgico a digital de 10-bit multi-canal Puerto serial sncrono (SSP) con SPI. (modo maestro) e I2C (maestro/esclavo) Transmisor-Receptor sncrono-asncrono universal (USART/SCI) con 9-bit Puerto paralelo esclavo (PSP) con 8-bits de ancho, con terminales de control RD, WR yCS

Arquitectura interna Arquitectura HARVARD. Buses separados (datos e instrucciones). Memoria de programa : 14 bits. Memoria de datos: 8 bits. Recursos mapeados en memoria de datos.

Arquitectura interna

Terminales fisicas

PUERTOSPuertoPORTA

# funciones3

FuncionesEntradas digital Salidas digital Entradas analgicas Entradas digital Salidas digital Entradas digital Salidas digital Medios de comunicacin Entradas digital Salidas digital Puerto paralelo esclavo Entradas digital Salidas digital Entradas analgicas Control del puerto paralelo esclavo

PORTB

2

PORTC

3

PORTD

3

PORTE

4

FUNCIONES PORTATerminalRA0 RA1 RA2 RA3 RA4 RA5

FuncionesEnt. Digital Sal. Digital Ent. Analgica Ent. Digital Sal. Digital Ent. Analgica Ent. Digital Sal. Digital Ent. Analgica Ent. Digital Sal. Digital Ent. Analgica Ent. Digital Sal. Digital Ent. contador 1 Ent. Digital Sal. Digital Ent. Analgica VREF VREF +

FUNCIONES PORTBTerminal RB0 RB1 RB2 RB3 RB4 RB5 RB6 RB7 FuncionesEnt. Digital Sal. Digital Ent. Interrupcin 0 Ent. Digital Sal. Digital Ent. Digital Sal. Digital Ent. Digital Sal. Digital PGM ( funcin LVP ) Ent. Digital Sal. Digital Ent. Digital Sal. Digital Ent. Digital Sal. Digital PGC ( funcin LVP ) Ent. Digital Sal. Digital PGD ( funcin LVP )

FUNCION PORTCTerminal FuncionesEnt. Digital Sal. Digital Sal. Osc timer 1 Ent. Digital Sal. Digital Ent. Osc Timer 1 Ent. Digital Sal. Digital Ent. Digital Sal. Digital Reloj sincrono SPI Ent. Digital Sal. Digital Datos entrada SPI Ent. Digital Sal. Digital Datos salida SPI Ent. Digital Sal. Digital Transmisin USART Ent. Digital Sal. Digital Recepcin USART Ent. Contador 1 Captura/Comp/PWM 1 Captura/Comp/PWM 2 Reloj sncrono I2C Datos I2C

RC0 RC1 RC2 RC3 RC4 RC5 RC6 RC7

FUNCIONES PORTDTerminal RD0 RD1 RD2 RD3 RD4 RD5 RD6 RD7 FuncionesEnt. Digital Sal. Digital Ent. Digital Sal. Digital Ent. Digital Sal. Digital Ent. Digital Sal. Digital Ent. Digital Sal. Digital Ent. Digital Sal. Digital Ent. Digital Sal. Digital Ent. Digital Sal. Digital Bit 0 puerto paralelo esclavo Bit 1 puerto paralelo esclavo Bit 2 puerto paralelo esclavo Bit 3 puerto paralelo esclavo Bit 4 puerto paralelo esclavo Bit 5 puerto paralelo esclavo Bit 6 puerto paralelo esclavo Bit 7 puerto paralelo esclavo

FUNCIONES PORTETerminalRE0 RE1 RE2

FuncionesEnt. Digital Sal. Digital Ent. Analgica Lectura PSP Ent. Digital Sal. Digital Ent. Analgica Escritura PSP Ent. Digital Sal. Digital Ent. Analgica Habilitacin PSP

Tipos de datosTipo(unsigned) char signed char (signed) short (int) unsigned short (int) (signed) int unsigned (int) (signed) long (int) unsigned long (int)

bytes1 1 1 1 2 2 4 4

Rango0 .. 255 - 128 .. 127 - 128 .. 127 0 .. 255 -32768 .. 32767 0 .. 65535 -2147483648 .. 2147483647 0 .. 4294967295

Tipos de datos 2Tipo float double long double bytes 4 4 4 Rango 1.17549435082 x 10-38 .. 6.80564774407 x 1038 1.17549435082 x 10-38 .. 6.80564774407 x 1038 1.17549435082 x 10-38 .. 6.80564774407 x 1038

Asignacin de datos Decimal int i = 10; int j = -10; int p = 0; /* decimal 10 */ /* decimal -10 */ /* decimal 0 */

Hexadecimal short x = 0x37; short y = 0x7F; int z = 0x125; /* decimal 55 */ /* decimal 127 */ /* decimal 293 */

Asignacin de datos Octal int m = 023; short n = 016; /* 19 */ /* 14 */

Binario char dato = 0b00001111; short dat = 0b10101010; unsigned char sig = 0b11001100;

ASCII char dat = a; char m = 5;

Registros asociadosEntrada/salida PORTA PORTB PORTC PORTD PORTE Configuracin TRISA TRISB TRISC TRISD TRISE

Entrada o salida SALIDA DE DATOS : 0

ENTRADA DE DATOS: 1 La asignacin es individual correspondiente a cada terminal del puerto.

Acceso individual de bits 1 mikroC te permite acceso individual en variables de 8 bits (char and unsigned short). Simplemente usando el selector (.) seguido de uno de los identificadores F0, F1, , F7. Siendo F7 el bit mas significativo. Ejemplo: PORTC.F0 = 1; PORTD.F5 = 0; PORTB.F7 = 1;Los identificadores F0F7 no se reconocen en minsculas. NOTA: Entre dos accesos a bits se debe tener un retardo mnimo de 2 microsegundos.

Entrada o salida Si deseamos configurar el puerto C con la siguiente asignacin:RC0 RC1 RC2 RC3 RC4 RC5 RC6 RC7 entrada entrada entrada entrada salida salida salida salida

Posibles instrucciones a utilizar

TRISC = 0b00001111; TRISC = 0x0F; TRISC = 15;

o o

Entrada o salida Si deseamos configurar el puerto D con la siguiente asignacin:RD0 RD1 RD2 RD3 RD4 RD5 RD6 RD7 entrada salida entrada salida entrada salida entrada salida

Debemos utilizar cualquiera de las siguientes instrucciones

TRISD = 0b01010101; TRISD = 0x55; TRISD = 85;

o o

Entrada o salida Si deseamos configurar el puerto A con la siguiente asignacin:RA0 RA1 RA2 RA3 RA4 RA5 RA6 salida salida salida salida entrada entrada entrada

Posibles instrucciones a utilizar

\\ instruccin indispensable para usar el puerto A y el puerto E como entrada o salida de datos digitales TRISA = 0b01110000; o TRISA = 0x70; o TRISA = 112;

ADCON1 = 6;

ADCON1ADCON1 = 0 0 0 0 0 1 1 0

ADCON1 = 6 ;

Delay_ms (retardo por software) Descripcin: Crea un retardo por software dado el tiempo enmilisegundos (constante). El rango de constantes aplicables a la funcin depende de la frecuencia del oscilador. Es una funcin interna; El cdigo es generado en el lugar donde se hace la llamada, as que la llamada de esta funcin no cuenta dentro del limite de llamadas anidadas.

void Delay_ms(const time_in_ms) Ejemplo:Generar un retardo de 1 segundo

Delay_ms(1000);

/* Pausa de un segundo */

Estructura de un programa en C ( ciclo while )// Definicin de variables globales // Definicin de funciones void main(void) { // Definicin de variables locales // Configuracin de registros (recursos y puertos) // ciclo infinito while ( 1 ) { // Programa de usuario } }

Estructura de un programa en C ( ciclo for )// Definicin de variables globales // Definicin de funciones void main(void) { // Definicin de variables locales // Configuracin de registros (recursos y puertos) // ciclo infinito for ( ; ; ) { // Programa de usuario } }

Estructura de un programa en C ( ciclo do - while )// Definicin de variables globales // Definicin de funciones void main(void) { // Definicin de variables locales // Configuracin de registros (recursos y puertos) // ciclo infinito do { // Programa de usuario } while ( 1 ) ; }

1.- Encendido de LED 1. 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 Configura bit del puerto como salida Apaga bit

Enciende bit

Retardo de 300 ms

Retardo de 1000ms

Encendido de LED (esquemtico)

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 11. El alumno encender y apagara en forma alternada dos leds ubicados en los bits 2 y 3 del puerto B. Los retardos sern de 500 milisegundos (ambos). Usando asignacin directa a bits. 2. El alumno encender y apagara un led ubicado en el bit 5 del puerto C. Los retardos sern de 100 milisegundos y 2 segundos, respectivamente. Usando asignacin de byte.

2.- Luces secuenciales 2. Programa que enve la siguiente secuencia de datos al puerto de salida D. Secuencia : 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000

Luces secuenciales (algoritmo)1. 2. 3. 4. Configuracin de puerto como salida de datos. Envo de primer dato al puerto de salida Envo de segundo dato al puerto de salida Envo de tercer dato al puerto de salida

. . .9. Envo de ultimo dato al puerto de salida 10. Regresar a 2

Luces secuenciales (diagrama de flujo)Luces Configura puerto como salida Enva 00000100 Enva 00100000

Enva 00000001

Enva 00001000

Enva 01000000

Enva 00000010

Enva 00010000

Enva 10000000

Luces secuenciales (esquemtico)

Luces secuenciales (programa)void main(void) { TRISD = 0; while ( 1 ) { PORTD = 0b00000001; Delay_ms(500); PORTD = 0b00000010; Delay_ms(500); PORTD = 0b00000100; Delay_ms(500); PORTD = 0b00001000; Delay_ms(500); PORTD = 0b00010000; Delay_ms(500); PORTD = 0b00100000; Delay_ms(500); PORTD = 0b01000000; Delay_ms(500); PORTD = 0b10000000; Delay_ms(500); } } // CONFIGURACION COMO PUERTO DE SALIDA // CICLO INFINITO // ENVIA PRIMER DATO // ENVIA SEGUNDO DATO // ENVIA TERCER DATO

Ejercicios propuestos 21. El alumno enviara una secuencia de datos distinta por el puerto B, utilizando retardos por software de distintas duraciones, con incrementos de 100 milisegundos entre si. 2. El alumno enviara la secuencia de datos por el puerto A, utilizando retardos por software con duracin de 800 milisegundos.

100001 010010 001100 010010 100001

Arreglos (definiciones)#define int float float char short long MAX 50 vector_one[10]; vector_two[MAX]; vector_three[MAX - 20]; numero[5]; dato[8]; temperatura[15]; /* arreglo de 10 enteros */ /* arreglo 50 flotantes */ /* arreglo 30 flotantes */

unsigned peso[7]; unsigned short d[3];

Arreglos (Inicializando)/* Arreglo el cal contiene el nmero de das de cada mes */ int days[12] = {31,28,31,30,31,30,31,31,30,31,30,31}; /* La declaraciones es identica a la anterior */ int *days = {31,28,31,30,31,30,31,31,30,31,30,31}; /* Las dos declaraciones son identicas */ const char msg1[ ] = {'T', 'e', 's', 't', '\0'}; const char msg2[ ] = "Test";

Condicionante ifif (expresin) conjunto 1 [else conjunto 2] Cuando la expresin evaluada es verdadera, Las instrucciones del conjunto 1 son ejecutadas. Si la expresin es falso, las instrucciones del conjunto 2 es ejecutada. La expresin debe ser evaluada a un valor entero. Los parntesis que encierra la expresin son obligatorios. La palabra especial else conjunto 2 es opcional.

Smbolos de condicinOperador == != > < >= = 8 ) apunta = 0; } }

// Configura puerto // Limpia apuntador // Ciclo infinito // Enva dato // Incrementa apuntador // Si apuntador 8 // Limpia apuntador

Ejercicios propuestos 31. 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 bitsOperador operacion

& | ^ ~>

Ejemplos operadores lgicos0x1234 & 0x5678 porque... 0x1234 : 0x5678: &: /* Igual 0x1230 */

0001 0010 0011 0100 0101 0110 0111 1000 ----------------------------------0001 0010 0011 0000

esto es, 0x1230

/* De forma similar: */ 0x1234 | 0x5678; 0x1234 ^ 0x5678; ~ 0x1234; /* Igual 0x567C */ /* Igual 0x444C */ /* Igual 0xEDCB */

Ejemplos a nivel de bits000001 4; 0xFF56 >> 4; /* Igual 000040 */ /* Igual 0x8010, sobreflujo! */ /* Igual 0x002F */ /* Igual 0x0FF5 */

Corrimiento a la derecha division entre 2n. Corrimiento a la izquierda producto por 2n.

4.- Luces con desplazamiento 4.(algoritmo)1. 2. 3. 4. 5. 6. Configuracin de puerto como salida. Inicializa variable. Enva valor de la variable al puerto. Modifica la variable. Si variable es cero, Inicializa la variable. Regresa a 3.

Luces con desplazamiento (diagrama de flujo)Luces Configura puerto como salida Modifica variable

Inicializa variable variable = 0 Enva variable al puerto

si

Inicializa variable

no

Luces con desplazamiento (programa 1)void main ( void ) { unsigned short dato; TRISD = 0; dato = 0b00000001; while ( 1 ) { PORTD = dato; Delay_ms ( 300 ); dato = dato 9 no

si Decenas>9 no Limpia decenas

Display de 7 segmentos (programa)short numero[ ] = { 0x3F, 0x06, 0x1B, 0x4F, 0x66, 0x6D, 0x5E, 0x07, 0x7F, 0x67 }; void main ( void ) { TRISB = 0; TRISC = 0; unidades = decenas = 0; while ( 1 ) { PORTB = numero [ decenas ]; PORTC.F0 = 1; delay-ms( 10 ); PORTC.F0 = 0; PORTB = numero [ unidades ]; PORTC.F1 = 1; delay-ms( 10 ); PORTC.F1 = 0; unidades++; if ( unidades > 9 ) { unidades = 0; decenas++; if ( decenas > 9 ) { decenas = 0; } } } } // Programa principal // Configuracin de puertos // Inicializacin de variables // Programa de usuario // Enva decenas // Habilita el display de decenas

// Enva unidades // Habilita el display de decenas

// Incrementa unidades

// Reinicia unidades // Incrementa decenas

// Reinicie decenas

Display de 7 segmentos ( esquemtico )

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 (esquemtico)

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 Descripcin: Inicializa el LCD usando un bus de datos de 8 bits. Lospuertos de Control (ctrlport) y Datos (dataport) usan la asignacin de terminales especificada. void Lcd8_Config( unsigned short *ctrlport,unsigned short *dataport, unsigned short RS, unsigned short EN, unsigned short WR, unsigned short D7, unsigned short D6, unsigned short D5, unsigned short D4, unsigned short D3, unsigned short D2, unsigned short D1, unsigned short D0 );

Lcd8_Config 2Ejemplo: Lcd8_Config(&PORTC,&PORTD,0,1,2,0,1,2,3,4,5,6,7);

Lcd8_Init Descripcin: Inicializa el LCD usando un bus de 8 bits. Los puertos de Control (ctrlport) y Datos (dataport) usan la siguiente asignacin de terminales.E ctrlport.3 RS ctrlport.2 R/W ctrlport.0 D7 dataport.7 D6 dataport.6 D5 dataport.5 D4 dataport.4 D3 dataport.3 D2 dataport.2 D1 dataport.1 D0 dataport.0

void Lcd8_Init(unsigned short *ctrlport, unsigned short *dataport);

Lcd8_Init 2Ejemplo: Lcd8_Init(&PORTB, &PORTC);

Lcd8_Out Descripcin: Imprime mensaje en el LCD en la fila y columna especificada (row y col). void Lcd8_Out(unsigned short row, unsigned short col, char *text );

Ejemplo:-Imprime Hello! en el LCD en la linea 1, columna 3

Lcd8_Out(1, 3, "Hello!");

Lcd8_Out_Cp Descripcin: Imprime mensaje en el LCD en la posicin actual del cursor. void Lcd8_Out_Cp(char *text); Ejemplo: Imprime Here! en la posicin actual del cursor Lcd8_Out_Cp("Here!");

Lcd8_Chr Descripcin: Imprime un caracter en el LCD en la fila y columna especificada (row y col). void Lcd8_Chr( unsigned short row,unsigned short col, char character );

Ejemplo: Imprime la letra i en el LCD en la lnea 2,y columna 3 Lcd8_Out(2, 3, 'i');

Lcd8_Chr_Cp Descripcin: Imprime un caracter en el LCD en la posicin actual del cursor. void Lcd8_Chr_Cp(char character); Ejemplo: Imprime la letra e en la posicin actual del cursor Lcd8_Chr_Cp('e');

Lcd8_Cmd Descripcin: Enva un comando al LCD. Se puede pasar a la funcin una de las constantes predefinidas. void Lcd8_Cmd(unsigned short command); Ejemplo: Limpia el LCD Lcd8_Cmd(LCD_CLEAR);

Comandos predefinidosComandoLCD_FIRST_ROW LCD_SECOND_ROW LCD_THIRD_ROW LCD_FOURTH_ROW LCD_CLEAR LCD_RETURN_HOME LCD_CURSOR_OFF LCD_UNDERLINE_ON LCD_BLINK_CURSOR_ON LCD_MOVE_CURSOR_LEFT LCD_MOVE_CURSOR_RIGHT LCD_TURN_ON LCD_TURN_OFF LCD_SHIFT_LEFT LCD_SHIFT_RIGHT

FuncinMueve el cursor a la 1a. fila. Mueve el cursor a la 2a. fila. Mueve el cursor a la 3a. fila. Mueve el cursor a la 4a. fila. Limpia el display. Regresa el cursor a la posicin 1,1. Los datos de la RAM no son afectados. Apaga el cursor. Coloca el caracter subrayado. Parpadeo del cursor. Mueve el cursor hacia la izquierda sin cambiar la RAM Mueve el cursor hacia la derecha sin cambiar el contenido de la RAM Enciende el display Apaga el display Mueve el display hacia la izquierda sin cambiar el contenido de la RAM Mueve el display hacia la derecha sin cambiar el contenido de la RAM

7.- LCD 8 BITS 7. Disear el programa que inicialice un LCD, usando un bus de datos de 8 bits, y a continuacin mande un mensaje de bienvenida. El mensaje debe desplazarse hacia la izquierda en forma continua.

LCD 8 BITS (algoritmo)1. Inicialice los puertos de datos y control. 2. Enva mensaje a desplegar. 3. Enva comando de desplazamiento hacia la izquierda. 4. Repite el paso 3.

LCD 8 BITS (diagrama de flujo)LCD 8 bits Inicializa puertos de datos y control

Enva mensaje

Enva comando de Corrimiento a la izq.

LCD 8 BITS (esquemtico)

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); Lcd8_Out(1,1,Hola mundo cruel); 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 (esquemtico)

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 71. 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 8H H O HO L

H

H

O

. . .H O LA

H

H O

LCD (funciones bus 4 bits) Lcd_Config Lcd_Init Lcd_Out Lcd_Out_Cp Lcd_Chr Lcd_Chr_Cp Lcd_Cmd

Lcd_Config Descripcin: Inicializa LCD usando un bus de datosde 4 bits. El puerto de Control (ctrlport) y Datos (dataport) tiene las asignaciones de terminales especificadas. void Lcd_Config(unsigned short *ctrl_data_port, unsigned short RS, unsigned short EN, unsigned short WR, unsigned short D7, unsigned short D6, unsigned short D5, unsigned short D4

);

Lcd_Config 2Ejemplo: Lcd_Config(&PORTC,0,1,2,4,5,6,7);

Lcd_Init Descripcin: Inicializa el LCD usando un bus de 4 bits. El puerto de Control (ctrlport) y Datos (dataport) tiene la siguiente asignacin de terminales.E ctrl_data_port.3 RS ctrl_data_port.2 D7 ctrl_data_port.7 D6 ctrl_data_port.6 D5 ctrl_data_port.5 D4 ctrl_data_port.4 void Lcd_Init(unsigned short *ctrl_data_port);

Lcd_Init 2Ejemplo: Lcd_Init(&PORTB);

Lcd_Out Descripcin: Imprime mensaje en el LCD en la fila y columna especificada (row y col). void Lcd_Out(unsigned short row, unsigned short col, char *text );

Ejemplo:-Imprime Hello! en el LCD en la lnea 1, columna 3

Lcd_Out(1, 3, "Hello!");

Lcd_Out_Cp Descripcin: Imprime mensaje en el LCD en la posicin actual del cursor. void Lcd_Out_Cp(char *text); Ejemplo:- Imprime Here! en la posicin actual del cursor

Lcd_Out_Cp("Here!");

Lcd_Chr Descripcin: Imprime un caracter en el LCD en la fila y columna especificada (row y col). void Lcd_Chr(unsigned short row, unsigned short col, char character );

Ejemplo:- Imprime la letra i en el LCD en la lnea 2,y columna 3

Lcd_Out(2, 3, 'i');

Lcd_Chr_Cp Descripcin: Imprime un caracter en el LCD en la posicin actual del cursor. void Lcd_Chr_Cp(char character); Ejemplo:- Imprime la letra e en la posicin actual del cursor

Lcd_Chr_Cp('e');

Lcd_Cmd Descripcin: Enva un comando al LCD. Se puedepasar a la funcin una de las constantes predefinidas. Los comandos son los mismos para ambos modos de manejo del LCD (bus 8 o 4 bits).

void Lcd_Cmd(unsigned short command); Ejemplo: - Apaga el cursor, no aparece en el LCD Lcd_Cmd(LCD_CURSOR_OFF);

8.- LCD 4 BITS 8. Disear el programa que inicialice un LCD, usando un bus de datos de 4 bits, y a continuacin 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. Enva mensaje a desplegar. 3. Enva 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

Enva mensaje

Enva comando de Corrimiento a la der.

LCD 4 BITS (esquemtico 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 (esquemtico 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); } }

Conversin de tipo de datosTipo de dato a cadena ByteToStr ShortToStr WordToStr IntToStr LongToStr FloatToStr

ByteToStrDescripcion: Crea una cadena de salida de un pequeo numero sin signo (valor numrico menos a 0x100). La cadena esta ajustada a un ancho de 3 caracteres; Las posiciones a la izquierda que no se usan en la conversin se rellenan con espacios. void ByteToStr(unsigned short number, char *output); Ejemplo: unsigned short t = 24; char *txt= ; //se inicializa un apuntador a 4 espacios ByteToStr(t, txt); // txt es " 24" (un espacio en blanco)

ShortToStrDescripcin: Crea una cadena de salida de un numero pequeo con signo (valor numrico menor a 0x100). La cadena esta ajustada a un ancho de 4 caracteres; Las posiciones a la izquierda que no se usan en la conversin se rellenan con espacios.

void ShortToStr(short number, char *output);Ejemplo: short t = -4; char *txt= ; // Se inicializa un apuntador de 5 espacios ShortToStr(t, txt); // txt es " -4" (dos espacio en blanco)

WordToStrDescripcin: Crea una cadena de salida de un numero sin signo (Valor numrico de una variable unsigned). La cadena esta ajustada a un ancho de 5 caracteres; Las posiciones a la izquierda que no se usan en la conversin se rellenan con espacios. void WordToStr(unsigned number, char *output);Ejemplo: unsigned t = 437; char *txt= ; WordToStr(t, txt);

// Inicializa un apuntador con 6 espacios // txt es 437" (dos espacios vacios)

IntToStrDescripcin: Crea una cadena de salida de un numero con signo (Valor numrico de una variable int). La cadena esta ajustada a un ancho de 6 caracteres; Las posiciones a la izquierda que no se usan en la conversin se rellenan con espacios.

void IntToStr(int number, char *output);Ejemplo: int j = -4220; char *txt= ; IntToStr(j, txt);

// Inicializa un apuntador con 6 espacios // txt es " -4220" (un espacio en blanco)

LongToStrDescripcin: Crea una cadena de salida de un numero largo con

signo (Valor numrico de una variable long). La cadena esta ajustada a un ancho de 11 caracteres; Las posiciones a la izquierda que no se usan en la conversin se rellenan con espacios.

void LongToStr(long number, char *output);Ejemplo: long jj = -3700000; char *txt= ; LongToStr(jj, txt);

// Inicializa un apuntador con 12 espacios // txt es -3700000" (3 espacios en blanco)

FloatToStrDescripcin: Crea una cadena de salida de un numero de punto flotante. La cadena contiene un formato normalizado de un numero (mantisa entre 0 y 1) con signo en la primera posicin. La mantisa esta ajustada a un formato de 6 dgitos, 0.ddddd; Hay siempre 5 dgitos a continuacin del punto decimal.

void FloatToStr(float number, char *output);Ejemplo: float ff = -374.2; char *txt= FloatToStr(ff, txt);

;

// Inicializa un apuntador con 14 espacios // txt es "-0.37420e3"

9.- Contador 0-9 (problema) 9.0 Se quiere un programa que visualice un conteo de 0 a 9 en un LCD.

Contador 0-9 (algoritmo) 01. 2. 3. 4. 5. 6. Configura el LCD Inicializa el contador Convierte a ASCII el valor del contador Enva valor en ASCII al LCD Incrementa el contador Regresa a 3

Contador 0-9 (diagrama de flujo) 0teclado Inicializa puertos (LCD) Convierte contador a ASCII Inicializa contador Enva a LCD ASCII

Incrementa contador

Contador 0-9 (programa) 0void 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 (esquemtico) 0-

Contador 0-9 (funcionamiento) 0Contador 0-9 : 0 Contador 0-9 : 1 Contador 0-9 : 2

Contador 0-9 : 3

Contador 0-9 : 4

Contador 0-9 : 5

Contador 0-9 : 6

.

.

.

Contador 0-9 : 9

Ejercicio propuesto 81. Programa que utilice un LCD, configurado para usar un bus de 8 bits. En el LCD deben aparecer en forma secuencial, los nmeros 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 aritmticas. 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 8Serie de numeros Serie de numeros 1 Serie de numeros 1 2

Serie de numeros 1 2

4

Serie de numeros 8

Serie de numeros 8 16

Serie de numeros 8 16

32

.

.

.

Serie de numeros 8192 16384

32768

Ejercicio propuesto 91. El alumno diseara un programa en donde se muestre en un LCD los nmeros desde 00 hasta el 99. Con un intervalo de tiempo entre cambio igual a 500 milisegundos.

Ejercicio propuesto 9Contador 00-99 cada 500 mseg 00 Contador 00-99 cada 500 mseg 01 Contador 00-99 cada 500 mseg 02

Contador 00-99 cada 500 mseg 03

Contador 00-99 cada 500 mseg 04

Contador 00-99 cada 500 mseg 05

Contador 00-99 cada 500 mseg 06

.

.

.

Contador 00-99 cada 500 mseg 99

Teclado matricial (esquemtico)

Teclado matricial (funciones) Keypad_Init Keypad_Read Keypad_Released

Keypad_Init Descripcin: Inicializa el puerto para trabajar con el teclado. Las terminales del teclado deben estar conectadas de la siguiente forma:port.F0 port.F1 port.F2 port.F3 port.F4 port.F5 port.F6 port.F7 columna 1 columna 2 columna 3 columna 4 fila 1 fila 2 fila 3 fila 4

void Keypad_Init(unsigned *port);

Keypad_Init 2Ejemplo: Keypad_Init(&PORTB);

Keypad_Read Descripcin: Verifica si alguna tecla fue presionada. La funcinregresa 1 a 12, dependiendo la tecla presionada, o 0 si no existe tecla presionada.1 2 9 * 0 # 1 2 9 10 11 12

unsigned short Keypad_Read(void); Ejemplo: kp = Keypad_Read();

Keypad_Released Descripcin: La llamada a la funcin Keypad_Released esuna funcin blocking call: La funcin espera hasta que cualquier tecla sea presionada y liberada. Cuando se libera, la funcin regresa de 1 a 12, dependiendo de la tecla presionada.

unsigned short Keypad_Released(void); Ejemplo: Keypad_Released();

10.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. 2. 3. 4. 5. Configuracin de puertos (teclado y lcd). Lectura de teclado Conversin a ASCII Envo al LCD Regresar a 2

Teclado matricial (diagramas de flujo)teclado Inicializa puertos (LCD y teclado) Lee teclado

Convierte a ASCII

Enva a LCD

AHS1

Teclado matricial (esquemtico)

Slide 157 AHS1TEC, 2/8/2006

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); Lcd8_Cmd(LCD_CLEAR); Lcd8_Cmd(LCD_CURSOR_OFF); Lcd8_Out(1, 1, "Key :"); Lcd8_Out(2, 1, "Times:"); do { kp = 0; pressed do kp = Keypad_Read(); while (!kp); switch (kp) { case 10: kp = 42; break; case 11: kp = 48; break; case 12: kp = 35; break; default: kp += 48; } cnt++; Lcd9_Chr(1, 10, kp); if (cnt == 255) { cnt = 0; Lcd8_Out(2, 10, " "); } WordToStr(cnt, txt); Lcd8_Out(2, 10, txt); } while (1); } // Inicializa LCD en puerto B y puerto C // Limpia display // Cursor apagado

// Espera a que se presione una tecla // Prepara valor para salida

// '*' // '0' // '#'

// Imprime en LCD

Ejercicio propuesto 91. El alumno realizara un programa que tome 3 nmeros 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 divisin entre 2 resultantes. Visualizando los resultados en un LCD.

Ejercicio propuesto 9Cual es el numero de 3 cifras: Cual es el numero de 3 cifras: 025

Cual es el numero de 3 cifras: 025 El producto por 2 es: 050

Cual es el numero de 3 cifras: 025 El producto por 2 es: 050 La divisin entre 2 es: 012