Programar PIC`s en lenguaje C18 En 64 horas. El siguiente material está desarrollado como complemento didáctico para la materia de microcontroladores, puede ser utilizados por docentes y estudiantes con disciplina de autoaprendizaje. Autor: Ramdhar Hadit Yusseff Vanegas Esp. En control e instrumentación industrial Esta obra está bajo una Licencia Creative Commons Atribución-NoComercial-CompartirIgual 2.5 Colombia.Licencia Creative Commons Atribución-NoComercial-CompartirIgual 2.5 Colombia
Tema 11
El display LCD es un dispositivo que permite visualizar un contenido de forma grafica o alfanumérica, por medio de símbolos y caracteres establecidos en la memoria en código ASCII. Normalmente se encuentra gobernada por un microcontrolador para configurar su funcionamiento. LCD Display de Cristal Liquido 2x16 Clase
Conexión de la LCD Clase 6 Etapa Alimentación Etapa bidireccional de datos
Pines de alimentación: 1. Vss: Gnd 2. Vdd: +5 voltios 3. Vee: corresponde al pin de contraste, se regula por medio de un potenciómetro como muestra la figura anterior. Pines de control: 4. RS: Pin de selección registro de control (0) o registro de datos (1). 5. RW: Corresponde al pin de Escritura(0) o de Lectura(1). 6. E: Corresponde al pin Enable o de habilitación. Pines de Bus de datos: 7 – 14. El Bus de datos bidireccional comprende los pines D0 a D7. Display 7 segmentos Cátodo Común Clase 6
Clase 6
Conexión de la LCD Clase 6
RUTINA CLEAR DISPLAY RE2RE1RD7RD6RD5RD4RD3RD2RD1RD0 RSRWD7D6D5D4D3D2D1D #define lcd_rs LATEbits.LATE2 #define lcd_RW LATEbits.LATE1 #define lcd_enable LATEbits.LATE0 lcd_rs=0; lcd_enable=1; PORTD= 0x01; delay_ms(2); lcd_enable=0; delay_ms(2); Función retardo basada en 20MHz void delay_ms ( unsigned int retardo){ unsigned int k; for (k=0;k<retardo;k++){ Delay1KTCYx(5);
Clase 6 RUTINA HOME DISPLAY RE2RE1RD7RD6RD5RD4RD3RD2RD1RD0 RSRWD7D6D5D4D3D2D1D #define lcd_rs LATEbits.LATE2 #define lcd_RW LATEbits.LATE1 #define lcd_enable LATEbits.LATE0 lcd_rs=0; lcd_enable=1; PORTD= 0x03; delay_ms(2); lcd_enable=0; delay_ms(2); Función retardo basada en 20MHz void delay_ms ( unsigned int retardo){ unsigned int k; for (k=0;k<retardo;k++){ Delay1KTCYx(5);
Clase 6 RUTINA ENTRY MODE SET DISPLAY RE2RE1RD7RD6RD5RD4RD3RD2RD1RD0 RSRWD7D6D5D4D3D2D1D lcd_rs=0; lcd_enable=1; PORTD= 0x06; delay_ms(2); lcd_enable=0; delay_ms(2); Función retardo basada en 20MHz void delay_ms ( unsigned int retardo){ unsigned int k; for (k=0;k<retardo;k++){ Delay1KTCYx(5);
Clase 6 RUTINA DISPLAY CONTROL RE2RE1RD7RD6RD5RD4RD3RD2RD1RD0 RSRWD7D6D5D4D3D2D1D lcd_rs=0; lcd_enable=1; PORTD= 0x0F; delay_ms(2); lcd_enable=0; delay_ms(2);
Clase 6 RUTINA DESPLAZAR CURSOR O DISPLAY RE2RE1RD7RD6RD5RD4RD3RD2RD1RD0 RSRWD7D6D5D4D3D2D1D lcd_rs=0; lcd_enable=1; PORTD= 0x14; delay_ms(1); lcd_enable=0; delay_ms(1);
Clase 6 RUTINA DE FUNCIONES (CARACTERISTICAS) RE2RE1RD7RD6RD5RD4RD3RD2RD1RD0 RSRWD7D6D5D4D3D2D1D lcd_rs=0; lcd_enable=1; PORTD= 0x38; delay_ms(1); lcd_enable=0; delay_ms(1);
Clase 6 RUTINA CLEAR DISPLAY RE2RE1RD7RD6RD5RD4RD3RD2RD1RD0 RSRWD7D6D5D4D3D2D1D lcd_rs=1; lcd_enable=1; PORTD= ‘ A ’; delay_ms(1); lcd_enable=0; delay_ms(1);
Ejercicio Display LCD Escriba correctamente el numero binario y hexadecimal que debe tener un puerto para representar los siguientes números en un display de cristal liquido (LCD) BIN: BIN: HEX: HEX: Clase 6
Enviar palabra completa “saludo” unsigned char Mensaje [16] = {“ABCDEFGHIJKLMNOP”}; for (i=0; i<=15;i++) { lcd_rs=1; lcd_enable=1; PORTD= Mensaje [i] ; delay_ms(1); lcd_enable=0; delay_ms(1); } Clase 6
Direcciones de memoria DD RAM Clase 6 Esta función sirve para posicionar el cursor en la culumna y fila deseada. Las direcciones de la 80h a la 8Fh corresponden con los 16 caracteres del primer renglón y de la C0h a la CFh con los 16 caracteres del segundo renglón, para este modelo. Filas 0x80 0xC0 Columnas 80 8F C0CF
Void lcd_enviar ( unsigned char dir, unsigned char valor){ If (dir = 0){ lcd_rs=0; lcd_enable=1; PORTD= valor; delay_ms(1); lcd_enable=0; delay_ms(1); } else { lcd_rs=1; lcd_enable=1; PORTD= valor; delay_ms(1); lcd_enable=0; delay_ms(1); } Clase 6 Función lcd_enviar Con esta función se va a configurar con RS=0 y a escribir RS=1 en la LCD.
Void lcd_gotoxy (unsigned char x, unsigned char y){ char dir ; if(y!=1) dir=0xC0; else dir=0; dir+=x-1 Lcd_enviar(0, 0x80|dir) ; } Clase 6 Función goto (x,y) Con esta funcion se posiciona el cursor en la fila y columna deseada.
Ejercicio mostrar un mensaje en la LCD Clase 6
#ifndef __lcd4550_H// instrucción de creación de librería #define __lcd4550_H// instrucción de creación de librería /********* Definición de pines***************/ #define LCD_LINEA2 0xC0 // Dirección de memoria para la segunda línea #define lcd_rs LATEbits.LATE2 #define lcd_RW LATEbits.LATE1 #define lcd_enable LATEbits.LATE0 #define DATOS PORTD // puerto de salida de datos /******definición del registro de control (RS)******/ #define LCD_DATO 1// para escribir en la pantalla #define LCD_COMANDO 0// para configurar el lcd /*******Definicion de configuraciones del lcd*******/ #define LCD_CLEAR 0x01 // 0b #define LCD_HOME 0x02 Clase 6 Crear librería para LCD (lcd4550.h) Se va a crear una librería con el fin de facilitar la programación de los códigos, esta librería se debe grabar con extensión “.h”.
Continuación Crear librería para LCD (lcd4550.h) // Opciones para el display #define LCD_DISPLAY_OFF 0x08 #define LCD_DISPLAY_ON 0x0C #define LCD_CURSOR_ON 0x0E #define LCD_CURSOR_BLINK 0x0F #define LCD_ENTRY_MODE 0X07 // Opciones especiales del cursor #define LCD_CURSOR_SHIFT_RIGHT 0x14 #define LCD_CURSOR_SHIFT_LEFT 0x10 #define LCD_DISPLAY_SHIFT_RIGHT 0x1C #define LCD_DISPLAY_SHIFT_LEFT 0x18 // Configurar el hardware #define LCD_DISPLAY_8_BITS 0x3F //0b #define LCD_DISPLAY_4_BITS 0x28 //0b Clase 6
/*******funciones para el manejo de los delays*******/ void delay_ms (unsigned int retardo){ unsigned int k; for(k=0;k<retardo;k++){ Delay1KTCYx(5); // retardo de 1ms con reloj de // Cycles = (TimeDelay * Fosc) / 4 // Cycles = (1ms * 20MHz) / 4 // Cycles = 5,000 } void delay_us (unsigned int retardo) // solo sirve para números mayores a 10 { retardo =retardo/10; unsigned int k; for(k=0;k<retardo;k++){ Delay10TCYx( 5 );// retardo de 1us // Cycles = (TimeDelay * Fosc) / 4 // Cycles = (1us * 20MHz) / 4 // Cycles = 5 } Clase 6 Continuación Crear librería para LCD (lcd4550.h)
Clase 6 Void lcd_enviar (unsigned char dir, unsigned char valor){ If (dir = 0){ lcd_rs=0; lcd_enable=1; PORTD= valor; delay_ms(1); lcd_enable=0; delay_ms(1); } else{ lcd_rs=1; lcd_enable=1; PORTD= valor; delay_ms(1); lcd_enable=0; delay_ms(1); } Continuación Crear librería para LCD (lcd4550.h)
/******inicialización del LCD************/ void lcd_init(void) { int dir,valor; dir = LCD_COMANDO;//para configurar la LCD valor = LCD_CLEAR; //0x38 Inicia el modulo a 8 bits lcd_enviar (dir,valor); delay_ms(1); valor = LCD_HOME; //0x0c activa display lcd_enviar (dir,valor); valor = LCD_ENTRY_MODE; //0x01 borra display lcd_enviar(dir,valor); valor = LCD_CURSOR_BLINK; //selecciona mensaje fijo lcd_enviar (dir,valor); valor = LCD_DISPLAY_SHIFT_RIGHT ; // instrucción para decrementar el cursor lcd_enviar(dir,valor); valor = LCD_DISPLAY_8_BITS ; lcd_enviar(dir,valor); } Ejercicio 3 Display 7 Segmentos Incremento y Decremento. Clase 6
/*********Función para posicionamiento del cursor********/ void lcd_gotoxy ( char x, char y) { char dir; if(y!=1) dir=0xC0; else dir=0; dir+=x-1; lcd_enviar(LCD_COMANDO,0x80|dir); } #endif Clase 6 Continuación Crear librería para LCD (lcd4550.h)
/**************Espacio para librerías*******************/ #include #include // incluir la librería creada. /***********Configuración de fuses o pragma**************/ #pragma config PLLDIV = 5, CPUDIV = OSC1_PLL2, USBDIV = 1 #pragma config FOSC = HSPLL_HS, FCMEN = OFF,IESO = OFF #pragma config PWRT = ON,BOR = OFF,BORV = 0 #pragma config VREGEN = OFF, WDT = OFF,WDTPS = #pragma config MCLRE = ON,LPT1OSC = OFF,PBADEN = OFF,CCP2MX = OFF #pragma config STVREN = OFF,LVP = OFF,XINST = OFF,DEBUG = OFF #pragma config CP0 = ON,CP1 = ON,CP2 = ON #pragma config CPB = ON,CPD = ON #pragma config WRT0 = ON,WRT1 = ON,WRT2 = ON, WRT3 = ON #pragma config WRTB = ON,WRTC = ON,WRTD = ON #pragma config EBTR0 = ON,EBTR1 = ON,EBTR2 = ON, EBTR3 = ON #pragma config EBTRB = ON Código control LCD Clase 6
char const vector[10]="SALUDO"; char const vector2[12]="ESTUDIANTES"; char i=0; void main (void){ TRISD = 0X00; TRISE = 0X00; PORTD = 0X00; PORTE = 0X00; while (1){ lcd_init(); lcd_gotoxy(8,1); for (i=0;i<6;i++){ lcd_enviar (LCD_DATO,vector [i]); delay_ms (300); } lcd_gotoxy(24,2); for (i=0;i<=10;i++){ lcd_enviar (LCD_DATO,vector2 [i]); delay_ms (300); } Código control LCD Clase 6
Ejercicio Propuesto. Usted es contratado por una agencia de viajes para desarrollar un dispositivo que cumpla con las siguientes especificaciones. Muestre en una pantalla de 16x2 el nombre y el precio de los planes que ofrece. Desea lo siguiente: * El mensaje se debe desplazar de derecha a izquierda * Debe salir el nombre del plan arriba y el precio en la segunda fila. * En la noche la pantalla se debe encender automáticamente para que los usuarios puedan leer. * Por favor indicar el costo total. Los planes son: San Andrés: $1’200,000 Amazonas: $989,000Isla Margarita: $500,000 Cancún: $2´600,000Panamá: $1`200,000Crucero: $2`500,000 Clase 6
Tema 11 piccmania.blogspot.com Programación de PIC 18F4550 en C18 Autor: Ramdhar Hadit Yusseff Vanegas
Tema 11 Microcontrolador, PIC, 18f4550, Puertos, LCD, crear Librería, Puertos de salida, Código C18. Programación de PIC 18F4550 en C18 Autor: Ramdhar Hadit Yusseff Vanegas