Sunteți pe pagina 1din 26

28/09/2014

Programacin en lenguaje C
para
Microcontroladores PIC

LCD HD44780
Ing. Germn Jess Pereira Muoz

28/09/2014 Ing. Germn Jess Pereira Muoz 1

Detalle del LCD

28/09/2014 Ing. Germn Jess Pereira Muoz 2

1
28/09/2014

28/09/2014 Ing. Germn Jess Pereira Muoz 3

DETALLE DE LOS PINES

28/09/2014 Ing. Germn Jess Pereira Muoz 4

2
28/09/2014

CONJUNTO DE INSTRUCCIONES

28/09/2014 5 Ing. Germn Jess Pereira Muoz

DETALLE DE LOS BITS

28/09/2014 Ing. Germn Jess Pereira Muoz 6

3
28/09/2014

PATRONES
DE LOS
CARACTERES

Para que imprima A


en la pantalla del LCD
se necesita el patron
01000001 = 0x41

28/09/2014 Ing. Germn Jess Pereira Muoz 7

Driver para LCD de matriz de puntos para representacin de caracteres y


smbolos en formato 5x8 5x10
Dispone de 240 patrones de caracteres almacenados en ROM, de los cuales
208 son de tamao 5x8 y 32 de tamao 5x10
Memoria RAM de pantalla (DDRAM) de 80 posiciones x 8 bits/posicin
Contenido en 8 bits (DDRAM): cdigo del carcter para un generador de
caracteres ROM con 240 caracteres posibles 8 posiciones (dobles) para
caracteres definibles por el usuario en una memoria CGRAM (caracteres
grficos)
Visibles 1 2 lneas de 16 caracteres/lnea

28/09/2014 8 Ing. Germn Jess Pereira Muoz

4
28/09/2014

28/09/2014 Ing. Germn Jess Pereira Muoz 9

CODIGO ALFANUMERICO: A Z y a z

28/09/2014 Ing. Germn Jess Pereira Muoz 10

5
28/09/2014

Ventana Visible

28/09/2014 Ing. Germn Jess Pereira Muoz 11

DDRAM (Display Data RAM)


Almacena el cdigo de los caracteres que estn siendo
visualizados o que se encuentran en posiciones no visibles
debido a la posicin de la ventana de visualizacin.
Tiene un tamao de 2 lneas x 40 bytes/lnea = 80 bytes.
Direcciones no contiguas entre lnea 1 y 2:

28/09/2014 Ing. Germn Jess Pereira Muoz 12

6
28/09/2014

PATRONES DE CARACTERES ROM A00

28/09/2014 Ing. Germn Jess Pereira Muoz 13

PATRONES DE CARACTERES ROM A00

28/09/2014 Ing. Germn Jess Pereira Muoz 14

7
28/09/2014

PATRONES DE

CARACTERES

ROM A02

28/09/2014 Ing. Germn Jess Pereira Muoz 15

LCD (funciones bus 4 bits)


Lcd_Init
Lcd_Out
Lcd_Out_Cp
Lcd_Chr
Lcd_Chr_Cp
Lcd_Cmd

28/09/2014 Ing. Germn Jess Pereira Muoz 16

8
28/09/2014

Lcd_Init
Descripcin: Inicializa LCD utilizando los pines de
conexin ya definidos por el usuario, usando un bus de datos
de 4 bits.
El puerto de Control y Datos deben ser definidas con
anterioridad por el usuario.

28/09/2014 Ing. Germn Jess Pereira Muoz 17

Lcd_Init Ejemplo: Lcd_Init();


U4
RA0 2 15 RC0
RA0/AN0 RC0/T1OSO/T1CKI
RA1 3 16 RC1
RA1/AN1 RC1/T1OSI/CCP2/UOE
RA2 4 17 RC2
RA2/AN2/VREF-/CVREF RC2/CCP1/P1A
RA3 5 23 RC4
RA3/AN3/VREF+ RC4/D-/VM
RA4 6 24 RC5
RA4/T0CKI/C1OUT/RCV RC5/D+/VP
RA5 7 25 RC6
RA5/AN4/SS/LVDIN/C2OUT RC6/TX/CK
RA6 14 26 RC7
RA6/OSC2/CLKO RC7/RX/DT/SDO
OSC1 13
OSC1/CLKI

RB0 33 19 RD0
RB0/AN12/INT0/FLT0/SDI/SDA RD0/SPP0
RB1 34 20 RD1
RB1/AN10/INT1/SCK/SCL RD1/SPP1
VDD
VSS

VEE

RB2 RD2
RW

35 21
RS

D0
D1
D2
D3
D4
D5
D6
D7

RB2/AN8/INT2/VMO RD2/SPP2
E

RB3 36 22 RD3
RB3/AN9/CCP2/VPO RD3/SPP3
RB4 37 27 RD4
RB4/AN11/KBI0/CSSPP RD4/SPP4
10
11
12
13
14
1
2
3

4
5
6

7
8
9

RB5 38 28 RD5
RB5/KBI1/PGM RD5/SPP5/P1B
RB6 39 29 RD6
RB1
RB2
RB3

RB4
RB5
RB6
RB7

RB6/KBI2/PGC RD6/SPP6/P1C
RB7 40 30 RD7
RB7/KBI3/PGD RD7/SPP7/P1D

8 RE0
RE0/AN5/CK1SPP
9 RE1
RE1/AN6/CK2SPP
10 RE2
RE2/AN7/OESPP
18 1 RE3
VUSB RE3/MCLR/VPP

PIC18F4550 C1
OSC1

RE3 27n

R1
10k
C2
RA6

27n

28/09/2014 Ing. Germn Jess Pereira Muoz 18

9
28/09/2014

Lcd_Out
Descripcin: Imprime mensaje en el LCD en la fila y
columna especificada (row y col).

void Lcd_Out( char row,


char col,
char *text );

Ejemplo:
-Imprime Hola! en el LCD en la lnea 1, columna 3
Lcd_Out(1, 3, "Hola!");

28/09/2014 Ing. Germn Jess Pereira Muoz 19

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!");

28/09/2014 Ing. Germn Jess Pereira Muoz 20

10
28/09/2014

Lcd_Chr
Descripcin: Imprime un caracter en el LCD en
la fila y columna especificada (row y col).

void Lcd_Chr( char row,


char col,
char character );

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

28/09/2014 Ing. Germn Jess Pereira Muoz 21

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');

28/09/2014 Ing. Germn Jess Pereira Muoz 22

11
28/09/2014

Lcd_Cmd
Descripcin: Enva un comando al LCD.
Se puede pasar 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(char command);

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

28/09/2014 Ing. Germn Jess Pereira Muoz 23

Comandos predefinidos
Comando Funcin
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 posicin 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

LCD_SHIFT_RIGHT Mueve el display hacia la derecha sin cambiar el contenido de la RAM

28/09/2014 Ing. Germn Jess Pereira Muoz 24

12
28/09/2014

LCD 4 BITS
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.

28/09/2014 Ing. Germn Jess Pereira Muoz 25

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.

28/09/2014 Ing. Germn Jess Pereira Muoz 26

13
28/09/2014

LCD 4 BITS (esquemtico)


U4
RA0 2 15 RC0
RA0/AN0 RC0/T1OSO/T1CKI
RA1 3 16 RC1
RA1/AN1 RC1/T1OSI/CCP2/UOE
RA2 4 17 RC2
RA2/AN2/VREF-/CVREF RC2/CCP1/P1A
RA3 5 23 RC4
RA3/AN3/VREF+ RC4/D-/VM
RA4 6 24 RC5
RA4/T0CKI/C1OUT/RCV RC5/D+/VP
RA5 7 25 RC6
RA5/AN4/SS/LVDIN/C2OUT RC6/TX/CK
RA6 14 26 RC7
RA6/OSC2/CLKO RC7/RX/DT/SDO
OSC1 13
OSC1/CLKI

RB0 33 19 RD0
RB0/AN12/INT0/FLT0/SDI/SDA RD0/SPP0
RB1 34 20 RD1
RB1/AN10/INT1/SCK/SCL RD1/SPP1

VDD
VSS

VEE
RB2 RD2

RW
35 21

RS

D0
D1
D2
D3
D4
D5
D6
D7
RB2/AN8/INT2/VMO RD2/SPP2

E
RB3 36 22 RD3
RB3/AN9/CCP2/VPO RD3/SPP3
RB4 37 27 RD4
RB4/AN11/KBI0/CSSPP RD4/SPP4

1
2
3

4
5
6

7
8
9
10
11
12
13
14
RB5 38 28 RD5
RB5/KBI1/PGM RD5/SPP5/P1B
RB6 39 29 RD6

RB1
RB2
RB3

RB4
RB5
RB6
RB7
RB6/KBI2/PGC RD6/SPP6/P1C
RB7 40 30 RD7
RB7/KBI3/PGD RD7/SPP7/P1D

8 RE0
RE0/AN5/CK1SPP
9 RE1
RE1/AN6/CK2SPP
10 RE2
RE2/AN7/OESPP
18 1 RE3
VUSB RE3/MCLR/VPP

PIC18F4550 C1
OSC1

RE3 27n

R1
10k
C2
RA6

27n

28/09/2014 Ing. Germn Jess Pereira Muoz 27

LCD 4 BITS
( )
programa 1

28/09/2014 Ing. Germn Jess Pereira Muoz 28

14
28/09/2014

LCD 4 BITS
( )
programa 1

28/09/2014 Ing. Germn Jess Pereira Muoz 29

LCD 4 BITS (esquemtico Init)

28/09/2014 Ing. Germn Jess Pereira Muoz 30

15
28/09/2014

Conversin de tipo de datos


ByteToStr ByteToHex
ShortToStr ShortToHex
WordToStr WordToHex
IntToStr IntToHex
LongToStr LongWordToHex
LongWordToStr LongIntToHex
FloatToStr
Rtrim
WordToStrWithZeros Ltrim
IntToStrWithZeros
LongWordToStrWithZeros Dec2Bcd
LongIntToStrWithZeros Bcd2Dec
Dec2Bcd16
Bcd2Dec16

28/09/2014 Ing. Germn Jess Pereira Muoz 31

ByteToStr
Descripcion: Crea una cadena de salida de un pequeo numero
sin signo (valor numrico menos a 0x100 == 256 ).

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[4]; //se inicializa un apuntador a 4 espacios

ByteToStr(t, txt); // txt es " 24" (un espacio en blanco)

28/09/2014 Ing. Germn Jess Pereira Muoz 32

16
28/09/2014

ShortToStr
Descripcin: 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[5]; // Se inicializa un apuntador de 5 espacios

ShortToStr(t, txt); // txt es " -4" (dos espacio en blanco)

28/09/2014 Ing. Germn Jess Pereira Muoz 33

WordToStr
Descripcin: 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[6]; // Inicializa un apuntador con 6 espacios

WordToStr(t, txt); // txt es 437" (dos espacios vacios)

28/09/2014 Ing. Germn Jess Pereira Muoz 34

17
28/09/2014

IntToStr
Descripcin: 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[7]; // Inicializa un apuntador con 7 espacios

IntToStr(j, txt); // txt es " -4220" (un espacio en blanco)

28/09/2014 Ing. Germn Jess Pereira Muoz 35

LongToStr
Descripcin: 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[12]; // Inicializa un apuntador con 12 espacios

LongToStr(jj, txt); // txt es -3700000" (3 espacios en blanco)

28/09/2014 Ing. Germn Jess Pereira Muoz 36

18
28/09/2014

LongWordToStr
Descripcin: 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:

unsigned long jj = 3700000;

char txt[11]; // Inicializa un apuntador con 12 espacios

LongToStr(jj, txt); // txt es 3700000" (3 espacios en blanco)

28/09/2014 Ing. Germn Jess Pereira Muoz 37

FloatToStr
Descripcin: 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 ff1 = -374.2;
float ff2 = 123.456789;
float ff3 = 0.000001234;
char txt[15];
FloatToStr(ff1, txt); // txt is "-374.2"
FloatToStr(ff2, txt); // txt is "123.4567"
FloatToStr(ff3, txt); // txt is "1.234e-6"
28/09/2014 Ing. Germn Jess Pereira Muoz 38

19
28/09/2014

WordToStrWithzeros
Descripcin: 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 shortt = 437;
chartxt[6];
...WordToStrWithZeros(t, txt); // txt is "0437"(un cero
incluido)

28/09/2014 Ing. Germn Jess Pereira Muoz 39

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

void IntToStrWithZeros(unsigned number, char


*output);

Ejemplo:
short t = -3276;
chartxt[7];
...IntToStrWithZeros(t, txt); // txt is "-03276"(un cero
incluido)

28/09/2014 Ing. Germn Jess Pereira Muoz 40

20
28/09/2014

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

void LongWordToStrWithZeros(unsigned long number,


char *output);

Ejemplo:
unsigned t =12345678;
char txt[11];
...LongWordToStrWithZeros(t,txt);
// txt is "0012345678"(dos ceros)

28/09/2014 Ing. Germn Jess Pereira Muoz 41

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

void LongIntToStrWithZeros(unsigned number, char


*output);

Ejemplo:
int j = -12345678;
char txt[12];
...LongIntToStrWithZeros(j, txt); // txt es "-
0012345678"(ceros incluidos)

28/09/2014 Ing. Germn Jess Pereira Muoz 42

21
28/09/2014

Contador 0-9 (problema)


Se quiere un programa que visualice un conteo de 0 a
9 en un LCD.

28/09/2014 Ing. Germn Jess Pereira Muoz 43

Contador 0-9 (esquemtico)


U4
RA0 2 15 RC0
RA0/AN0 RC0/T1OSO/T1CKI
RA1 3 16 RC1
RA1/AN1 RC1/T1OSI/CCP2/UOE
RA2 4 17 RC2
RA2/AN2/VREF-/CVREF RC2/CCP1/P1A
RA3 5 23 RC4
RA3/AN3/VREF+ RC4/D-/VM
RA4 6 24 RC5
RA4/T0CKI/C1OUT/RCV RC5/D+/VP
RA5 7 25 RC6
RA5/AN4/SS/LVDIN/C2OUT RC6/TX/CK
RA6 14 26 RC7
RA6/OSC2/CLKO RC7/RX/DT/SDO
OSC1 13
OSC1/CLKI

RB0 33 19 RD0
RB0/AN12/INT0/FLT0/SDI/SDA RD0/SPP0
RB1 34 20 RD1
RB1/AN10/INT1/SCK/SCL RD1/SPP1
VDD
VSS

VEE

RB2 RD2
RW

35 21
RS

D0
D1
D2
D3
D4
D5
D6
D7

RB2/AN8/INT2/VMO RD2/SPP2
E

RB3 36 22 RD3
RB3/AN9/CCP2/VPO RD3/SPP3
RB4 37 27 RD4
RB4/AN11/KBI0/CSSPP RD4/SPP4
1
2
3

4
5
6

7
8
9
10
11
12
13
14

RB5 38 28 RD5
RB5/KBI1/PGM RD5/SPP5/P1B
RB6 39 29 RD6
RB1
RB2
RB3

RB4
RB5
RB6
RB7

RB6/KBI2/PGC RD6/SPP6/P1C
RB7 40 30 RD7
RB7/KBI3/PGD RD7/SPP7/P1D

8 RE0
RE0/AN5/CK1SPP
9 RE1
RE1/AN6/CK2SPP
10 RE2
RE2/AN7/OESPP
18 1 RE3
VUSB RE3/MCLR/VPP

PIC18F4550 C1
OSC1

RE3 27n

R1
10k
C2
RA6

27n

28/09/2014 Ing. Germn Jess Pereira Muoz 44

22
28/09/2014

Contador 0-9 (algoritmo)


1. 1. Configura el LCD
2. 2. Inicializa el contador
3. 3. Convierte a ASCII el valor del contador
4. 4. Enva valor en ASCII al LCD
5. 5. Incrementa el contador
6. 6. Regresa a 3

28/09/2014 Ing. Germn Jess Pereira Muoz 45

Contador 0-9 (programa Part I)

28/09/2014 Ing. Germn Jess Pereira Muoz 46

23
28/09/2014

Contador 0-9(programa Part II)

28/09/2014 Ing. Germn Jess Pereira Muoz 47

Contador 0-9 (salida)

28/09/2014 Ing. Germn Jess Pereira Muoz 48

24
28/09/2014

Ejercicio propuesto
Programa que utilice un LCD, configurado para usar
un bus de 4 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
nmeros consecutivos, un numero a la izquierda,
uno mas al centro y otro a la derecha.

28/09/2014 Ing. Germn Jess Pereira Muoz 49

Ejercicio propuesto
Serie de numeros Serie de numeros Serie de numeros
1 1 2

Serie de numeros Serie de numeros Serie de numeros


1 2 4 8 8 16

Serie de numeros Serie de numeros Serie de numeros


8 16 32 64 128 256 8192 16384 32768

28/09/2014 Ing. Germn Jess Pereira Muoz 50

25
28/09/2014

Ejercicio propuesto
Programa que utilice un LCD, configurado para usar
un bus de 4 bits.
En el LCD deben aparecer en forma secuencial, los
nmeros de la secuencia 1 2 3 5 7 11 13 17
19 - 23 29 31 37 hasta 25 primos.
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
nmeros consecutivos, un numero a la izquierda,
uno mas al centro y otro a la derecha.

28/09/2014 Ing. Germn Jess Pereira Muoz 51

Ejercicio propuesto
El alumno diseara un programa en donde se
muestre en un LCD:
Un contador de 000 a 999
Un contador de 9999 a 0000
Un contador de 0.00 a 1.00 incrementando de
0.001
El porcentaje de 0% a 100%

Con un intervalo de tiempo entre cambio igual a 500


milisegundos.
28/09/2014 Ing. Germn Jess Pereira Muoz 52

26

S-ar putea să vă placă și