Curso-Taller programación en lenguaje C para microcontroladores PIC PIC16F877 http://www.scribd.com/karlozmxmty 2010
Views 197 Downloads 10 File size 3MB
Curso-Taller programación en lenguaje C para microcontroladores PIC PIC16F877
http://www.scribd.com/karlozmxmty
2010
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
http://www.scribd.com/karlozmxmty
2010
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. http://www.scribd.com/karlozmxmty
2010
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 ) http://www.scribd.com/karlozmxmty
2010
Características (periféricos) • 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 módulos de Capture, Compare, PWM – Capture es de 16-bit, max. resolución es 12.5 ns – Compare es de 16-bit, max. resolución es 200 ns – PWM max. resolución de 10-bit http://www.scribd.com/karlozmxmty
2010
Características (periféricos 2) • Convertidor analógico a digital de 10-bit multicanal • Puerto serial síncrono (SSP) con SPI. (modo maestro) e I2C (maestro/esclavo) • Transmisor-Receptor síncrono-asíncrono universal (USART/SCI) con 9-bit • Puerto paralelo esclavo (PSP) con 8-bits de ancho, con terminales de control RD, WR y CS http://www.scribd.com/karlozmxmty
2010
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. http://www.scribd.com/karlozmxmty
2010
Arquitectura interna
http://www.scribd.com/karlozmxmty
2010
Terminales fisicas
http://www.scribd.com/karlozmxmty
2010
PUERTOS Puerto
# funciones
Funciones
PORTA
3
Entradas digital Salidas digital Entradas analógicas
PORTB
2
Entradas digital Salidas digital
PORTC
3
Entradas digital Salidas digital Medios de comunicación
PORTD
3
Entradas digital Salidas digital Puerto paralelo esclavo
PORTE
4
Entradas digital Salidas digital Entradas analógicas Control del puerto paralelo esclavo http://www.scribd.com/karlozmxmty
2010
FUNCIONES PORTA Terminal
Funciones
RA0
Ent. Digital Sal. Digital Ent. Analógica
RA1
Ent. Digital Sal. Digital Ent. Analógica
RA2
Ent. Digital Sal. Digital Ent. Analógica
VREF -
RA3
Ent. Digital Sal. Digital Ent. Analógica
VREF +
RA4
Ent. Digital Sal. Digital Ent. contador 1
RA5
Ent. Digital Sal. Digital Ent. Analógica http://www.scribd.com/karlozmxmty
2010
FUNCIONES PORTB Terminal RB0 RB1 RB2 RB3 RB4 RB5 RB6 RB7
Funciones Ent. Digital Sal. Digital Ent. Interrupción 0 Ent. Digital Sal. Digital Ent. Digital Sal. Digital Ent. Digital Sal. Digital PGM ( función LVP ) Ent. Digital Sal. Digital Ent. Digital Sal. Digital Ent. Digital Sal. Digital PGC ( función LVP ) Ent. Digital Sal. Digital PGD ( función LVP ) http://www.scribd.com/karlozmxmty
2010
FUNCION PORTC Terminal
RC0 RC1 RC2 RC3 RC4 RC5 RC6 RC7
Funciones Ent. Digital Sal. Digital Sal. Osc timer 1
Ent. Contador 1
Ent. Digital Sal. Digital Ent. Osc Timer 1
Captura/Comp/PWM 1
Ent. Digital Sal. Digital
Captura/Comp/PWM 2
Ent. Digital Sal. Digital Reloj sincrono SPI
Reloj síncrono I2C
Ent. Digital Sal. Digital Datos entrada SPI
Datos I2C
Ent. Digital Sal. Digital Datos salida SPI Ent. Digital Sal. Digital Transmisión USART Ent. Digital Sal. Digital Recepción USART
http://www.scribd.com/karlozmxmty
2010
FUNCIONES PORTD Terminal RD0 RD1 RD2 RD3 RD4 RD5 RD6 RD7
Funciones Ent. Digital Sal. Digital
Bit 0 puerto paralelo esclavo
Ent. Digital Sal. Digital
Bit 1 puerto paralelo esclavo
Ent. Digital Sal. Digital
Bit 2 puerto paralelo esclavo
Ent. Digital Sal. Digital
Bit 3 puerto paralelo esclavo
Ent. Digital Sal. Digital
Bit 4 puerto paralelo esclavo
Ent. Digital Sal. Digital
Bit 5 puerto paralelo esclavo
Ent. Digital Sal. Digital
Bit 6 puerto paralelo esclavo
Ent. Digital Sal. Digital
Bit 7 puerto paralelo esclavo
http://www.scribd.com/karlozmxmty
2010
FUNCIONES PORTE Terminal
Funciones
RE0
Ent. Digital Sal. Digital Ent. Analógica Lectura PSP
RE1
Ent. Digital Sal. Digital Ent. Analógica Escritura PSP
RE2
Ent. Digital Sal. Digital Ent. Analógica Habilitación PSP
http://www.scribd.com/karlozmxmty
2010
Tipos de datos Tipo (unsigned) char 1 signed char (signed) short (int) unsigned short (int) (signed) int unsigned (int) 2 (signed) long (int) unsigned long (int)
bytes
Rango 0 .. 255
1 1 1 2 4 4
- 128 .. 127 - 128 .. 127 0 .. 255 -32768 .. 32767 0 .. 65535 -2147483648 .. 2147483647 0 .. 4294967295
http://www.scribd.com/karlozmxmty
2010
Tipos de datos 2 Tipo
bytes
Rango
float
4
±1.17549435082 x 10-38 .. ±6.80564774407 x 1038
double
4
±1.17549435082 x 10-38 .. ±6.80564774407 x 1038
long double
4
±1.17549435082 x 10-38 .. ±6.80564774407 x 1038
http://www.scribd.com/karlozmxmty
2010
Asignación 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 */
http://www.scribd.com/karlozmxmty
2010
Asignación 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’; http://www.scribd.com/karlozmxmty
2010
Registros asociados Entrada/salida • PORTA
Configuración TRISA
• PORTB
TRISB
• PORTC
TRISC
• PORTD
TRISD
• PORTE
TRISE http://www.scribd.com/karlozmxmty
2010
Entrada o salida • SALIDA DE DATOS : 0 • ENTRADA DE DATOS: 1 • La asignación es individual correspondiente a cada terminal del puerto.
http://www.scribd.com/karlozmxmty
2010
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 F0–F7 no se reconocen en minúsculas. NOTA: Entre dos accesos a bits se debe tener un retardo mínimo de 2 microsegundos. http://www.scribd.com/karlozmxmty
2010
Entrada o salida • Si deseamos configurar el puerto C con la siguiente asignación: RC0 RC1 RC2 RC3 RC4 RC5 RC6 RC7 •
entrada entrada entrada entrada salida salida salida salida
Posibles instrucciones a utilizar
TRISC = 0b’00001111’; TRISC = 0x0F; TRISC = 15; http://www.scribd.com/karlozmxmty
o o
2010
Entrada o salida • Si deseamos configurar el puerto D con la siguiente asignación: RD0 RD1 RD2 RD3 RD4 RD5 RD6 RD7 •
entrada salida entrada salida entrada salida entrada salida
Debemos utilizar cualquiera de las siguientes instrucciones
TRISD = 0b’01010101’; TRISD = 0x55; TRISD = 85; http://www.scribd.com/karlozmxmty
o o
2010
Entrada o salida • Si deseamos configurar el puerto A con la siguiente asignación: RA0 RA1 RA2 RA3 RA4 RA5 RA6 •
salida salida salida salida entrada entrada entrada
Posibles instrucciones a utilizar
ADCON1 = 6; \\ instrucción indispensable para usar el puerto A y el puerto E como entrada o salida de datos digitales TRISA = 0b’01110000’; o TRISA = 0x70; o TRISA = 112; http://www.scribd.com/karlozmxmty
2010
ADCON1 ADCON1 =
0
0
0
0
0
ADCON1 = 6 ;
http://www.scribd.com/karlozmxmty
2010
1
1
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.
• void Delay_ms(const time_in_ms) • Ejemplo: Generar un retardo de 1 segundo
Delay_ms(1000);
http://www.scribd.com/karlozmxmty
/* Pausa de un segundo */
2010
Estructura de un programa en C ( ciclo while ) // Definición de variables globales // Definición de funciones void main(void) { // Definición de variables locales // Configuración de registros (recursos y puertos) // ciclo infinito while ( 1 ) { // Programa de usuario } } http://www.scribd.com/karlozmxmty
2010
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 // Configuración de registros (recursos y puertos) // ciclo infinito for ( ; ; ) { // Programa de usuario } } http://www.scribd.com/karlozmxmty
2010
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 // Configuración de registros (recursos y puertos) // ciclo infinito do { // Programa de usuario } while ( 1 ) ; } http://www.scribd.com/karlozmxmty
2010
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.
http://www.scribd.com/karlozmxmty
2010
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
http://www.scribd.com/karlozmxmty
2010
Encendido de LED (diagrama de flujo) Led Configura bit del puerto como salida
Apaga bit
Enciende bit
Retardo de 300 ms
Retardo de 1000ms
http://www.scribd.com/karlozmxmty
2010
Encendido de LED (esquemático)
http://www.scribd.com/karlozmxmty
2010
Encendido de LED (programa) void main ( void ) { TRISD.F7 = 0; while( 1 ) { PORTD.F7 = 1; Delay_ms( 1000 ); PORTD.F7 = 0; Delay_ms( 300 ); } } http://www.scribd.com/karlozmxmty
2010
Encendido de LED (programa 2) void main ( void ) { TRISD = 0; while( 1 ) { PORTD = 0x80; Delay_ms( 1000 ); PORTD = 0; Delay_ms( 300 ); } } http://www.scribd.com/karlozmxmty
2010
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. 2. El alumno encenderá y apagara un led ubicado en el bit 5 del puerto C. Los retardos serán de 100 milisegundos y 2 segundos, respectivamente. Usando asignación de byte. http://www.scribd.com/karlozmxmty
2010
2.- Luces secuenciales • Programa que envíe la siguiente secuencia de datos al puerto de salida D. Secuencia : – 00000001 – 00000010 – 00000100 – 00001000 – 00010000 – 00100000 – 01000000 – 10000000 http://www.scribd.com/karlozmxmty
2010
Luces secuenciales (algoritmo) 1. 2. 3. 4.
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 http://www.scribd.com/karlozmxmty
2010
Luces secuenciales (diagrama de flujo) Luces Configura puerto como salida
Envía 00000100
Envía 00100000
Envía 00000001
Envía 00001000
Envía 01000000
Envía 00000010
Envía 00010000
Envía 10000000
http://www.scribd.com/karlozmxmty
2010
Luces secuenciales (esquemático)
http://www.scribd.com/karlozmxmty
2010
Luces secuenciales (programa) void main(void) { TRISD = 0;
// CONFIGURACION COMO PUERTO DE SALIDA
while ( 1 ) // CICLO INFINITO { PORTD = 0b00000001; // ENVIA PRIMER DATO Delay_ms(500); PORTD = 0b00000010; // ENVIA SEGUNDO DATO Delay_ms(500); PORTD = 0b00000100; // ENVIA TERCER DATO 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); } }
http://www.scribd.com/karlozmxmty
2010
Ejercicios propuestos 2 1. 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 duración de 800 milisegundos.
100001 010010 001100 010010 100001 http://www.scribd.com/karlozmxmty
2010
Arreglos (definiciones) #define
MAX 50
int
vector_one[10];
/* arreglo de 10 enteros */
float
vector_two[MAX];
/* arreglo 50 flotantes */
float
vector_three[MAX - 20];
/* arreglo 30 flotantes */
char
numero[5];
short
dato[8];
long
temperatura[15];
unsigned peso[7]; unsigned short d[3]; http://www.scribd.com/karlozmxmty
2010
Arreglos (Inicializando) /* Arreglo el cúal contiene el número de días 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";
http://www.scribd.com/karlozmxmty
2010
Condicionante if if (expresión) conjunto 1 [else conjunto 2] • Cuando la expresión evaluada es verdadera, Las instrucciones del conjunto 1 son ejecutadas. Si la expresión es falso, las instrucciones del conjunto 2 es ejecutada. La expresión debe ser evaluada a un valor entero. Los paréntesis que encierra la expresión son obligatorios. • La palabra especial “else conjunto 2” es opcional. http://www.scribd.com/karlozmxmty
2010
Símbolos de condición Operador == != > < >= = 8 ) apunta = 0; } }
// Configura puerto // Limpia apuntador // Ciclo infinito // Envía dato // Incrementa apuntador // Si apuntador ≥ 8 // Limpia apuntador
http://www.scribd.com/karlozmxmty
2010
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 http://www.scribd.com/karlozmxmty
2010
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.
|
OR (inclusive); compara pares de bits y regresa 1 si uno o ambos son 1’s, de otra manera regresa 0.
^
OR (exclusiva); compara pares de bits y regresa 1 si los bits son complementarios, de otra manera regresa 0.
~
Complemento (unitario); invierte cada bit
>
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. http://www.scribd.com/karlozmxmty
2010
Ejemplos operadores lógicos 0x1234 & 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 */ http://www.scribd.com/karlozmxmty
2010
Ejemplos a nivel de bits 000001 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. http://www.scribd.com/karlozmxmty
2010
4.- Luces con desplazamiento (algoritmo) 1. 2. 3. 4. 5. 6.
Configuración de puerto como salida. Inicializa variable. Envía valor de la variable al puerto. Modifica la variable. Si variable es cero, Inicializa la variable. Regresa a 3.
http://www.scribd.com/karlozmxmty
2010
Luces con desplazamiento (diagrama de flujo) Luces Configura puerto como salida
Modifica variable
si
Inicializa variable variable = 0 Envía variable al puerto
no
http://www.scribd.com/karlozmxmty
2010
Inicializa variable
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’
Envía decena Envía unidad Incrementa unidad
no Limpia decenas
si Unidades>’9’ no http://www.scribd.com/karlozmxmty
2010
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;
// Programa principal // Configuración de puertos // Inicialización de variables // Programa de usuario // Envía decenas // Habilita el display de decenas
// Envía unidades // Habilita el display de decenas
unidades++;
// Incrementa unidades if ( unidades > ’9’ )
{ unidades = ‘0’; decenas if ( decenas > ’9’ ) { decenas = ‘0’; }
// Reinicia unidades decenas++;
// Reinicie decenas
}
} http://www.scribd.com/karlozmxmty
2010
// Incrementa
Display de 7 segmentos ( esquemático )
http://www.scribd.com/karlozmxmty
2010
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.
http://www.scribd.com/karlozmxmty
2010
Ejercicio propuesto 6 (esquemático)
http://www.scribd.com/karlozmxmty
2010
Display de cristal liquido
http://www.scribd.com/karlozmxmty
2010
LCD (funciones bus 8 bits) • • • • • • •
Lcd8_Config Lcd8_Init Lcd8_Out Lcd8_Out_Cp Lcd8_Chr Lcd8_Chr_Cp Lcd8_Cmd http://www.scribd.com/karlozmxmty
2010
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.
•
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 ); http://www.scribd.com/karlozmxmty
2010
Lcd8_Config 2 Ejemplo: Lcd8_Config(&PORTC,&PORTD,0,1,2,0,1,2,3,4,5,6,7);
http://www.scribd.com/karlozmxmty
2010
Lcd8_Init • Descripción: Inicializa el LCD usando un bus de 8 bits. Los puertos de Control (ctrlport) y Datos (dataport) usan la siguiente asignación 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); http://www.scribd.com/karlozmxmty
2010
Lcd8_Init 2 Ejemplo: Lcd8_Init(&PORTB, &PORTC);
http://www.scribd.com/karlozmxmty
2010
Lcd8_Out • Descripción: 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!"); http://www.scribd.com/karlozmxmty
2010
Lcd8_Out_Cp • Descripción: Imprime mensaje en el LCD en la posición actual del cursor. • void Lcd8_Out_Cp(char *text); • Ejemplo: Imprime “Here!” en la posición actual del cursor Lcd8_Out_Cp("Here!"); http://www.scribd.com/karlozmxmty
2010
Lcd8_Chr • Descripción: 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 línea 2,y columna 3 Lcd8_Out(2, 3, 'i'); http://www.scribd.com/karlozmxmty
2010
Lcd8_Chr_Cp • Descripción: Imprime un caracter en el LCD en la posición actual del cursor. • void Lcd8_Chr_Cp(char character); • Ejemplo: Imprime la letra “e” en la posición actual del cursor Lcd8_Chr_Cp('e'); http://www.scribd.com/karlozmxmty
2010
Lcd8_Cmd • Descripción: Envía un comando al LCD. Se puede pasar a la función una de las constantes predefinidas. • void Lcd8_Cmd(unsigned short command); • Ejemplo: Limpia el LCD Lcd8_Cmd(LCD_CLEAR); http://www.scribd.com/karlozmxmty
2010
Comandos predefinidos Comando
Función
LCD_FIRST_ROW
Mueve el cursor a la 1a. fila.
LCD_SECOND_ROW
Mueve el cursor a la 2a. fila.
LCD_THIRD_ROW
Mueve el cursor a la 3a. fila.
LCD_FOURTH_ROW
Mueve el cursor a la 4a. fila.
LCD_CLEAR
Limpia el display.
LCD_RETURN_HOME
Regresa el cursor a la posición 1,1. Los datos de la RAM no son afectados.
LCD_CURSOR_OFF
Apaga el cursor.
LCD_UNDERLINE_ON
Coloca el caracter subrayado.
LCD_BLINK_CURSOR_ON
Parpadeo del cursor.
LCD_MOVE_CURSOR_LEFT
Mueve el cursor hacia la izquierda sin cambiar la RAM
LCD_MOVE_CURSOR_RIGHT
Mueve el cursor hacia la derecha sin cambiar el contenido de la RAM
LCD_TURN_ON
Enciende el display
LCD_TURN_OFF
Apaga el display
LCD_SHIFT_LEFT
Mueve el display hacia la izquierda sin cambiar el contenido de la RAM http://www.scribd.com/karlozmxmty
2010
LCD_SHIFT_RIGHT
Mueve el display hacia la derecha sin cambiar el contenido de la RAM
http://www.scribd.com/karlozmxmty
2010
7.- LCD 8 BITS • Diseñar el programa que inicialice un LCD, usando un bus de datos de 8 bits, y a continuación mande un mensaje de bienvenida. El mensaje debe desplazarse hacia la izquierda en forma continua.
http://www.scribd.com/karlozmxmty
2010
LCD 8 BITS (algoritmo) 1. Inicialice los puertos de datos y control. 2. Envía mensaje a desplegar. 3. Envía comando de desplazamiento hacia la izquierda. 4. Repite el paso 3.
http://www.scribd.com/karlozmxmty
2010
LCD 8 BITS (diagrama de flujo) LCD 8 bits Inicializa puertos de datos y control
Envía mensaje
Envía comando de Corrimiento a la izq.
http://www.scribd.com/karlozmxmty
2010
LCD 8 BITS (esquemático)
http://www.scribd.com/karlozmxmty
2010
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); } } http://www.scribd.com/karlozmxmty
2010
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); } } http://www.scribd.com/karlozmxmty
2010
LCD 8 BITS (esquemático)
http://www.scribd.com/karlozmxmty
2010
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); } } http://www.scribd.com/karlozmxmty
2010
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. http://www.scribd.com/karlozmxmty
2010
Ejercicio propuesto 8 H
H
H
H
H
O
HO
. . .
O
HO LA
H O
http://www.scribd.com/karlozmxmty
L
2010
LCD (funciones bus 4 bits) • • • • • • •
Lcd_Config Lcd_Init Lcd_Out Lcd_Out_Cp Lcd_Chr Lcd_Chr_Cp Lcd_Cmd http://www.scribd.com/karlozmxmty
2010
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.
• 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 http://www.scribd.com/karlozmxmty
2010
);
Lcd_Config 2 Ejemplo: Lcd_Config(&PORTC,0,1,2,4,5,6,7);
http://www.scribd.com/karlozmxmty
2010
Lcd_Init • Descripción: Inicializa el LCD usando un bus de 4 bits. El puerto de Control (ctrlport) y Datos (dataport) tiene la siguiente asignación 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); http://www.scribd.com/karlozmxmty
2010
Lcd_Init 2 Ejemplo: Lcd_Init(&PORTB);
http://www.scribd.com/karlozmxmty
2010
Lcd_Out • Descripción: 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 línea 1, columna 3
Lcd_Out(1, 3, "Hello!"); http://www.scribd.com/karlozmxmty
2010
Lcd_Out_Cp • Descripción: Imprime mensaje en el LCD en la posición actual del cursor. • void Lcd_Out_Cp(char *text); • Ejemplo: - Imprime “Here!” en la posición actual del cursor
Lcd_Out_Cp("Here!"); http://www.scribd.com/karlozmxmty
2010
Lcd_Chr • Descripción: 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 línea 2,y columna 3
Lcd_Out(2, 3, 'i'); http://www.scribd.com/karlozmxmty
2010
Lcd_Chr_Cp • Descripción: Imprime un caracter en el LCD en la posición actual del cursor. • void Lcd_Chr_Cp(char character); • Ejemplo: - Imprime la letra ‘e’ en la posición actual del cursor
Lcd_Chr_Cp('e'); http://www.scribd.com/karlozmxmty
2010
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).
• void Lcd_Cmd(unsigned short command); • Ejemplo: - Apaga el cursor, no aparece en el LCD Lcd_Cmd(LCD_CURSOR_OFF); http://www.scribd.com/karlozmxmty
2010
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.
http://www.scribd.com/karlozmxmty
2010
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.
http://www.scribd.com/karlozmxmty
2010
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.
http://www.scribd.com/karlozmxmty
2010
LCD 4 BITS (esquemático Config)
http://www.scribd.com/karlozmxmty
2010
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); } } http://www.scribd.com/karlozmxmty
2010
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); } } http://www.scribd.com/karlozmxmty
2010
LCD 4 BITS (esquemático Init)
http://www.scribd.com/karlozmxmty
2010
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); } } http://www.scribd.com/karlozmxmty
2010
Conversión de tipo de datos Tipo de dato a cadena • ByteToStr • ShortToStr • WordToStr • IntToStr • LongToStr • FloatToStr http://www.scribd.com/karlozmxmty
2010
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. 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)
http://www.scribd.com/karlozmxmty
2010
ShortToStr Descripción: Crea una cadena de salida de un numero pequeño con signo (valor numérico menor a 0x100). La cadena esta ajustada a un ancho de 4 caracteres; Las posiciones a la izquierda que no se usan en la conversión 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)
http://www.scribd.com/karlozmxmty
2010
WordToStr Descripción: Crea una cadena de salida de un numero sin signo (Valor numérico 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 conversión se rellenan con espacios. void WordToStr(unsigned number, char *output); Ejemplo: unsigned t = 437; char *txt=“ “; // Inicializa un apuntador con 6 espacios WordToStr(t, txt);
// txt es “ 437" (dos espacios vacios) http://www.scribd.com/karlozmxmty
2010
IntToStr Descripción: Crea una cadena de salida de un numero con signo (Valor numérico 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 conversión se rellenan con espacios.
void IntToStr(int number, char *output); Ejemplo: int j = -4220; char *txt=“ “; // Inicializa un apuntador con 6 espacios IntToStr(j, txt);
// txt es " -4220" (un espacio en blanco)
http://www.scribd.com/karlozmxmty
2010
LongToStr Descripción: Crea una cadena de salida de un numero largo con signo
(Valor numérico 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 conversión 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)
http://www.scribd.com/karlozmxmty
2010
FloatToStr Descripción: 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 posición. La mantisa esta ajustada a un formato de 6 dígitos, 0.ddddd; Hay siempre 5 dígitos a continuación 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"
http://www.scribd.com/karlozmxmty
2010
9.- Contador 0-9 (problema) • Se quiere un programa que visualice un conteo de 0 a 9 en un LCD.
http://www.scribd.com/karlozmxmty
2010
Contador 0-9 (algoritmo) 1. 2. 3. 4. 5. 6.
Configura el LCD Inicializa el contador Convierte a ASCII el valor del contador Envía valor en ASCII al LCD Incrementa el contador Regresa a 3
http://www.scribd.com/karlozmxmty
2010
Contador 0-9 (diagrama de flujo) teclado Inicializa puertos (LCD) Convierte contador a ASCII Inicializa contador Envía a LCD ASCII
Incrementa contador
http://www.scribd.com/karlozmxmty
2010
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); } } http://www.scribd.com/karlozmxmty
2010
Contador 0-9 (esquemático)
http://www.scribd.com/karlozmxmty
2010
Contador 0-9 (funcionamiento) Contador 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
.
.
http://www.scribd.com/karlozmxmty
. 2010
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. http://www.scribd.com/karlozmxmty
2010
Ejercicio propuesto 8 Serie de numeros
Serie de numeros 1
Serie de numeros 1 2
Serie de numeros 1 2
Serie de numeros 8
Serie de numeros 8 16
Serie de numeros 8 16
4
32
.
.
http://www.scribd.com/karlozmxmty
. 2010
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.
http://www.scribd.com/karlozmxmty
2010
Ejercicio propuesto 9 Contador 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
.
.
http://www.scribd.com/karlozmxmty
. 2010
Contador 00-99 cada 500 mseg 99
Teclado matricial (esquemático)
http://www.scribd.com/karlozmxmty
2010
Teclado matricial (funciones) • Keypad_Init • Keypad_Read • Keypad_Released
http://www.scribd.com/karlozmxmty
2010
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 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); http://www.scribd.com/karlozmxmty
2010
Keypad_Init 2 Ejemplo: Keypad_Init(&PORTB);
http://www.scribd.com/karlozmxmty
2010
Keypad_Read • Descripción: Verifica si alguna tecla fue presionada. La función regresa
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(); http://www.scribd.com/karlozmxmty
2010
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.
• unsigned short Keypad_Released(void); • Ejemplo: Keypad_Released(); http://www.scribd.com/karlozmxmty
2010
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).
http://www.scribd.com/karlozmxmty
2010
Teclado matricial (algoritmo) 1. 2. 3. 4. 5.
Configuración de puertos (teclado y lcd). Lectura de teclado Conversión a ASCII Envío al LCD Regresar a 2
http://www.scribd.com/karlozmxmty
2010
Teclado matricial (diagramas de flujo) teclado Inicializa puertos (LCD y teclado) Lee teclado
Convierte a ASCII
Envía a LCD
http://www.scribd.com/karlozmxmty
2010
Teclado matricial (esquemático)
http://www.scribd.com/karlozmxmty
2010
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; 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);
// Inicializa LCD en puerto B y puerto C // Limpia display // Cursor apagado
http://www.scribd.com/karlozmxmty
// Espera a que se presione una tecla pressed // Prepara valor para salida
// '*' // '0' // '#'
// Imprime en LCD
2010
Lcd8_Out(2, 10, txt); } while (1); }
http://www.scribd.com/karlozmxmty
2010
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. http://www.scribd.com/karlozmxmty
2010
Ejercicio propuesto 9 Cual 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 división entre 2 es: 012
http://www.scribd.com/karlozmxmty
2010