programar pic`s en lenguaje c18 en 64 horas. el siguiente material está desarrollado como...
TRANSCRIPT
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.
Programación de pantallas LCD 2*16 y
teclados matriciales.
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 6
www.unocero.com www.artemecatronica.com
www.hwkitchen.comwww.wulfden.org
www.coldfire-electronica.com
Conexión de la LCD
Clase 6
Etapa Alimentación
Etapa Alimentación
Etapa bidireccional de datos
Pines de alimentación:
1. Vss: Gnd2. Vdd: +5 voltios3. 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
Conexión de la LCD
Clase 6
Clase 6
RUTINA CLEAR DISPLAY
RE2 RE1 RD7 RD6 RD5 RD4 RD3 RD2 RD1 RD0
RS RW D7 D6 D5 D4 D3 D2 D1 D0
0 0 0 0 0 0 0 0 0 1
#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
RE2 RE1 RD7 RD6 RD5 RD4 RD3 RD2 RD1 RD0
RS RW D7 D6 D5 D4 D3 D2 D1 D0
0 0 0 0 0 0 0 0 1 1
#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
RE2 RE1 RD7 RD6 RD5 RD4 RD3 RD2 RD1 RD0
RS RW D7 D6 D5 D4 D3 D2 D1 D0
0 0 0 0 0 0 0 1 1 0
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
RE2 RE1 RD7 RD6 RD5 RD4 RD3 RD2 RD1 RD0
RS RW D7 D6 D5 D4 D3 D2 D1 D0
0 0 0 0 0 0 1 1 1 1
lcd_rs=0;lcd_enable=1;PORTD= 0x0F; delay_ms(2);lcd_enable=0;delay_ms(2);
Clase 6
RUTINA DESPLAZAR CURSOR O DISPLAY
RE2 RE1 RD7 RD6 RD5 RD4 RD3 RD2 RD1 RD0
RS RW D7 D6 D5 D4 D3 D2 D1 D0
0 0 0 0 0 1 0 1 0 0
lcd_rs=0;lcd_enable=1;PORTD= 0x14; delay_ms(1);lcd_enable=0;delay_ms(1);
Clase 6
RUTINA DE FUNCIONES (CARACTERISTICAS)
RE2 RE1 RD7 RD6 RD5 RD4 RD3 RD2 RD1 RD0
RS RW D7 D6 D5 D4 D3 D2 D1 D0
0 0 0 0 1 1 1 0 0 0
lcd_rs=0;lcd_enable=1;PORTD= 0x38; delay_ms(1);lcd_enable=0;delay_ms(1);
Clase 6
RUTINA CLEAR DISPLAY
RE2 RE1 RD7 RD6 RD5 RD4 RD3 RD2 RD1 RD0
RS RW D7 D6 D5 D4 D3 D2 D1 D0
1 0 0 1 0 0 0 0 0 1
lcd_rs=1;lcd_enable=1;PORTD= ‘A’; delay_ms(1);lcd_enable=0;delay_ms(1);
www.elproducto.co
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: BIN: BIN:
HEX: HEX: 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
www.elproducto.co
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.
Filas0x800xC0
Columnas
Columnas
80 8F
C0 CF
www.elproducto.co
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-1Lcd_enviar(0, 0x80|dir) ;}
Clase 6
Función goto (x,y)
Con esta funcion se posiciona el cursor en la fila y columna deseada.
Ejerciciomostrar un mensaje en la LCD
Clase 6
RA0/AN0/C1IN-2
RA1/AN1/C2IN-3
RA2/AN2/C2IN+/VREF-/CVREF4
RA3/AN3/C1IN+/VREF+5
RA4/T0CKI/C1OUT6
RA5/AN4/SS/HLVDIN/C2OUT7
RA6/OSC2/CLKO14
RA7/OSC1/CLKI13
RB0/AN12/FLT0/INT033
RB1/AN10/INT134
RB2/AN8/INT235
RB3/AN9/CCP2A36
RB4/KBI0/AN1137
RB5/KBI1/PGM38
RB6/KBI2/PGC39
RB7/KBI3/PGD40
RC0/T1OSO/T13CKI15
RC1/T1OSI/CCP2B16
RC2/CCP1/P1A17
RC3/SCK/SCL18
RC4/SDI/SDA23
RC5/SDO24
RC6/TX/CK25
RC7/RX/DT26
RD0/PSP019
RD1/PSP120
RD2/PSP221
RD3/PSP322
RD4/PSP427
RD5/PSP5/P1B28
RD6/PSP6/P1C29
RD7/PSP7/P1D30
RE0/RD/AN58
RE1/WR/AN69
RE2/CS/AN710
RE3/MCLR/VPP1
U1
PIC18F4620
D7
14D
613
D5
12D
411
D3
10D
29
D1
8D
07
E6
RW
5R
S4
VS
S1
VD
D2
VE
E3
50%
RV1
1k
#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 // 0b00000001#define LCD_HOME 0x02
Clase 6Crear 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 //0b00111000#define LCD_DISPLAY_4_BITS 0x28 //0b00111000
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 6Continuació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 3Display 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 6Continuación Crear librería para LCD (lcd4550.h)
/**************Espacio para librerías*******************/#include <p18f4550.h>#include <delays.h>#include <lcd4550.h> // 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 = 32768 #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 LCDClase 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,000 Isla Margarita: $500,000Cancún: $2´600,000 Panamá: $1`200,000 Crucero: $2`500,000
Clase 6
Bibliografía
Tema 11
www.canalgif.net/
• piccmania.blogspot.com• www.unocero.com• www.microchip.com• www.thelearningpit.com• http://electronica-teoriaypractica.com
Programación de PIC 18F4550 en C18 Autor: Ramdhar Hadit Yusseff Vanegas
Palabras clave
Tema 11
www.canalgif.net/
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