PIC16F877 Con MikroC [Modo de Compatibilidad]

161
CursoTaller programación en CursoTaller programación en lenguaje C para lenguaje C para microcontroladores PIC PIC16F877 PIC16F877

description

Pic16f877

Transcript of PIC16F877 Con MikroC [Modo de Compatibilidad]

Page 1: PIC16F877 Con MikroC [Modo de Compatibilidad]

Curso‐Taller programación enCurso‐Taller programación en lenguaje C paralenguaje C para

microcontroladores PIC

PIC16F877PIC16F877

Page 2: PIC16F877 Con MikroC [Modo de Compatibilidad]

C t í tiCaracterísticas

• Velocidad de operación: hasta 20 MHz de reloj

• 8K x 14 bits por palabra de memoria de programa FLASHprograma FLASH

• 368 x 8 bytes de memoria de datos (RAM)

• 256 x 8 bytes de memoria de datos EEPROM

Page 3: PIC16F877 Con MikroC [Modo de Compatibilidad]

C t í ti (2)Características (2)

• 14 fuentes de interrupcionesM i d il ( ) d 8 i l d• Memoria de pila (stack) de 8 niveles de profundidad

• Protecciones:Power on Reset ( )– Power‐on Reset (POR)

– Power‐up Timer (PWRT) – Oscillator Start‐up Timer (OST)– Watchdog Timer (WDT) independiente del cristalWatchdog Timer (WDT) independiente del cristal.

Page 4: PIC16F877 Con MikroC [Modo de Compatibilidad]

P t d t d lidPuertos 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 )

Page 5: PIC16F877 Con MikroC [Modo de Compatibilidad]

C t í ti ( )Características (periféricos)

• Timer 0: timer/counter de 8 bits con un pre‐escalador de 8 valoresescalador 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‐escaladorde 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

Page 6: PIC16F877 Con MikroC [Modo de Compatibilidad]

C t í ti ( ifé i 2)Características (periféricos 2)

• Convertidor analógico a digital de 10‐bit multi‐canalcanal

• Puerto serial síncrono (SSP) con SPI. (modo 

maestro)  e I2C (maestro/esclavo)• Transmisor Receptor síncrono asíncrono• 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 CSancho, con terminales de control  RD, WR y CS

Page 7: PIC16F877 Con MikroC [Modo de Compatibilidad]

A it t i tArquitectura interna

• Arquitectura HARVARD.

• Buses separados (datos e instrucciones).

• Memoria de programa : 14 bits.

• Memoria de datos: 8 bits.

• Recursos mapeados en memoria de datos.

Page 8: PIC16F877 Con MikroC [Modo de Compatibilidad]

A it t i tArquitectura interna

Page 9: PIC16F877 Con MikroC [Modo de Compatibilidad]

T i l fi iTerminales fisicas

Page 10: PIC16F877 Con MikroC [Modo de Compatibilidad]

PUERTOSU OSPuerto # funciones FuncionesPORTA 3 Entradas digitalPORTA 3 Entradas digital

Salidas digitalEntradas analógicas

PORTB 2 Entradas digitalSalidas digital

PORTC 3 Entradas digitalSalidas digitalMedios de comunicaciónMedios de comunicación

PORTD 3 Entradas digitalSalidas digitalPuerto paralelo esclavo

PORTE 4 Entradas digitalSalidas digitalSalidas digitalEntradas analógicasControl del puerto paralelo esclavo

Page 11: PIC16F877 Con MikroC [Modo de Compatibilidad]

FUNCIONES PORTAFUNCIONES PORTA

Terminal FuncionesRA0 Ent Digital Sal Digital Ent AnalógicaRA0 Ent. Digital Sal. Digital Ent. Analógica

RA1 Ent. Digital Sal. Digital Ent. Analógicag g g

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

Page 12: PIC16F877 Con MikroC [Modo de Compatibilidad]

FUNCIONES PORTBFUNCIONES PORTB

Terminal FuncionesRB0 Ent Digital Sal Digital Ent Interrupción 0RB0 Ent. Digital Sal. Digital Ent. Interrupción 0

RB1 Ent. Digital Sal. Digital

RB2 Ent. Digital Sal. Digital

E t Di it l S l Di it l PGM ( f ió LVP )RB3 Ent. Digital Sal. Digital PGM ( función LVP )

RB4 Ent. Digital Sal. DigitalRB4RB5 Ent. Digital Sal. Digital

RB6 Ent. Digital Sal. Digital PGC ( función LVP )

RB7 Ent. Digital Sal. Digital PGD ( función LVP )RB7 g g ( )

Page 13: PIC16F877 Con MikroC [Modo de Compatibilidad]

FUNCION PORTCFUNCION PORTC

Terminal Funciones

RC0 Ent Digital Sal Digital Sal Osc timer 1 Ent Contador 1RC0 Ent. Digital Sal. Digital Sal. Osc timer 1 Ent. Contador 1

RC1 Ent. Digital Sal. Digital Ent. Osc Timer 1 Captura/Comp/PWM 1

RC2 Ent. Digital Sal. Digital Captura/Comp/PWM 2

RC3 Ent Digital Sal Digital Reloj sincrono SPI Reloj síncrono I2CRC3 Ent. Digital Sal. Digital Reloj sincrono SPI Reloj síncrono I2C

RC4 Ent. Digital Sal. Digital Datos entrada SPI Datos I2C

RC5 Ent. Digital Sal. Digital Datos salida SPI

RC6 Ent Digital Sal Digital Transmisión USARTRC6 Ent. Digital Sal. Digital Transmisión USART

RC7 Ent. Digital Sal. Digital Recepción USART

Page 14: PIC16F877 Con MikroC [Modo de Compatibilidad]

FUNCIONES PORTDFUNCIONES PORTDT i l F iTerminal FuncionesRD0 Ent. Digital Sal. Digital Bit 0 puerto paralelo esclavo0RD1 Ent. Digital Sal. Digital Bit 1 puerto paralelo esclavo

E t Di it l S l Di it l Bit 2 t l l lRD2 Ent. Digital Sal. Digital Bit 2 puerto paralelo esclavo

RD3 Ent. Digital Sal. Digital Bit 3 puerto paralelo esclavoRD3RD4 Ent. Digital Sal. Digital Bit 4 puerto paralelo esclavo

RD5 Ent. Digital Sal. Digital Bit 5 puerto paralelo esclavo

RD6 Ent. Digital Sal. Digital Bit 6 puerto paralelo esclavoRD6 g g p p

RD7 Ent. Digital Sal. Digital Bit 7 puerto paralelo esclavo

Page 15: PIC16F877 Con MikroC [Modo de Compatibilidad]

FUNCIONES PORTEFUNCIONES PORTE

Terminal FuncionesRE0 Ent. Digital Sal. Digital Ent. Analógica Lectura PSP

RE1 Ent Digital Sal Digital Ent Analógica Escritura PSPRE1 Ent. Digital Sal. Digital Ent. Analógica Escritura PSP

RE2 Ent. Digital Sal. Digital Ent. Analógica Habilitación PSPRE2 Ent. Digital Sal. Digital Ent. Analógica Habilitación PSP

Page 16: PIC16F877 Con MikroC [Modo de Compatibilidad]

Ti d d tTipos de datos

Tipo bytes Rango( i d) h 1 0 255(unsigned) char 1 0 .. 255

signed char 1 ‐ 128 .. 127

(signed) short (int) 1 ‐ 128 .. 127

unsigned short (int)      1 0 .. 255

(signed) int 2 ‐32768 .. 32767

unsigned (int) 2 0 65535unsigned (int) 2 0 .. 65535

(signed) long (int) 4 ‐2147483648 .. 2147483647

i d l ( ) 4 0 4294967295unsigned long (int) 4 0 .. 4294967295

Page 17: PIC16F877 Con MikroC [Modo de Compatibilidad]

Ti d d t 2Tipos 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

Page 18: PIC16F877 Con MikroC [Modo de Compatibilidad]

A i ió d d tAsignación de datos

• Decimal/* */– int i = 10; /* decimal 10 */

– int j = ‐10; /* decimal ‐10 */

– int p = 0; /* decimal 0  */

• Hexadecimal– short x = 0x37; /* decimal 55 */

– short y = 0x7F; /* decimal 127 */

– int  z = 0x125; /* decimal 293 */

Page 19: PIC16F877 Con MikroC [Modo de Compatibilidad]

A i ió d d tAsignación de datos

• Octal– int m = 023; /* 19 */int m   023; /  19  /– short  n = 016; /*  14 */ 

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

• ASCII– char dat = ‘a’;– char m = ‘5’;

Page 20: PIC16F877 Con MikroC [Modo de Compatibilidad]

R i t i dRegistros asociados

Entrada/salida Configuración

• PORTA TRISA

• PORTB TRISB

• PORTC TRISC

• PORTD TRISD

• PORTE TRISE

Page 21: PIC16F877 Con MikroC [Modo de Compatibilidad]

E t d lidEntrada o salida

• SALIDA DE DATOS :  0

• ENTRADA DE DATOS: 1

L i ió i di id l di t• La asignación es individual correspondiente a cada terminal del puerto.

Page 22: PIC16F877 Con MikroC [Modo de Compatibilidad]

A i di id l d bit 1Acceso individual de bits 1

• mikroC te permite acceso individual en variables de 8 bits (char and unsigned short). Simplemente usando el selector (.) 

id d d l id tifi d F0 F1 F7 Si d F7seguido de uno de los identificadores F0, F1, … , F7. Siendo F7 el bit mas significativo.

• Ejemplo:PORTC.F0 = 1;PORTC.F0   1;PORTD.F5 = 0;PORTB.F7 = 1;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.

Page 23: PIC16F877 Con MikroC [Modo de Compatibilidad]

E t d lidEntrada o salida• Si deseamos configurar el puerto C con la• Si deseamos configurar el puerto C con la siguiente asignación:

RC0 entradaRC0     entradaRC1     entradaRC2     entradaRC3 entradaRC3     entradaRC4     salidaRC5     salidaRC6 lidRC6     salidaRC7     salida

• Posibles instrucciones a utilizarTRISC = 0b’00001111’; oTRISC = 0x0F; oTRISC   0x0F; oTRISC = 15;

Page 24: PIC16F877 Con MikroC [Modo de Compatibilidad]

E t d lidEntrada o salida• Si deseamos configurar el puerto D con la• Si deseamos configurar el puerto D con la siguiente asignación:

RD0 entradaRD0     entradaRD1     salidaRD2     entradaRD3 salidaRD3     salidaRD4     entradaRD5     salidaRD6 t dRD6     entradaRD7     salida

• Debemos utilizar cualquiera de las siguientes instruccionesTRISD = 0b’01010101’; oTRISD = 0x55; oTRISD   0x55; oTRISD = 85;

Page 25: PIC16F877 Con MikroC [Modo de Compatibilidad]

E t d lidEntrada o salida• Si deseamos configurar el puerto A con la siguienteSi deseamos configurar el puerto A con la siguiente 

asignación:RA0     salida

1 lidRA1     salidaRA2     salidaRA3     salidaRA4 t dRA4     entradaRA5     entradaRA6     entrada

• Posibles instrucciones a utilizarADCON1 = 6; \\ instrucción indispensable para usar el 

puerto A y el puerto E como entrada opuerto A y el puerto E como entrada o salida de datos digitales

TRISA = 0b’01110000’; oTRISA = 0x70; oTRISA = 0x70; oTRISA = 112;

Page 26: PIC16F877 Con MikroC [Modo de Compatibilidad]

ADCON1ADCON1

ADCON1 = 0 0 0 0 0 1 1 0

ADCON1 = 6 ;

Page 27: PIC16F877 Con MikroC [Modo de Compatibilidad]

D l ( )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ódigodepende 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 segundog

Delay_ms(1000);  /* Pausa de un segundo */

Page 28: PIC16F877 Con MikroC [Modo de Compatibilidad]

Estructura de un programa en Cp g( 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 infinitowhile ( 1 ){

// Programa de usuario

}}

Page 29: PIC16F877 Con MikroC [Modo de Compatibilidad]

Estructura de un programa en Cp g( 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 infinitofor ( ; ; ){

// Programa de usuario

}}

Page 30: PIC16F877 Con MikroC [Modo de Compatibilidad]

Estructura de un programa en Cp g( 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 infinitodo{

// Programa de usuario

} while ( 1 ) ;}

Page 31: PIC16F877 Con MikroC [Modo de Compatibilidad]

1 E did d LED1.‐ Encendido de LED

• Crear un programa que encienda y apague un l d bi d l t i l RD7 d l t Dled, ubicado en la terminal RD7 del puerto D. El tiempo de encendido es de 1000 pmilisegundo y el de apagado de 300 milisegundosmilisegundos.

Page 32: PIC16F877 Con MikroC [Modo de Compatibilidad]

E did d LED ( )Encendido de LED (algoritmo)

1. Configurar el bit 7 del puerto D como salida de datosdatos

2. Encendido del led

3. Retardo por software de 1000 milisegundos.

4 Apagado del led4. Apagado del led

5. Retardo por software de 300 milisegundos

6. Repetir el paso 2

Page 33: PIC16F877 Con MikroC [Modo de Compatibilidad]

E did d LED ( )Encendido de LED (diagrama de flujo)L dLed

Configura bit delt lid Apaga bitpuerto como salida Apaga bit

Enciende bit Retardo de 300 ms

Retardo de 1000ms

Page 34: PIC16F877 Con MikroC [Modo de Compatibilidad]

E did d LED ( )Encendido de LED (esquemático)

Page 35: PIC16F877 Con MikroC [Modo de Compatibilidad]

E did d LED ( )Encendido de LED (programa)

void main ( void ){{TRISD.F7 = 0;while( 1 )while( 1 ){

PORTD F7 = 1;PORTD.F7 = 1;Delay_ms( 1000 );PORTD F7 0PORTD.F7 = 0;Delay_ms( 300 );

}}}

Page 36: PIC16F877 Con MikroC [Modo de Compatibilidad]

E did d LED ( )Encendido de LED (programa 2)

void main ( void ){{TRISD = 0;while( 1 )while( 1 ){

PORTD = 0x80;PORTD = 0x80;Delay_ms( 1000 );PORTD 0PORTD = 0;Delay_ms( 300 );

}}}

Page 37: PIC16F877 Con MikroC [Modo de Compatibilidad]

Ej i i t 1Ejercicios 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.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 bitsUsando asignación directa a bits.

2 El l d á l d bi d2. El alumno encenderá y apagara un led ubicado en el bit 5 del puerto C. Los retardos serán de 100 ili d 2 d imilisegundos y 2 segundos, respectivamente. 

Usando asignación de byte.

Page 38: PIC16F877 Con MikroC [Modo de Compatibilidad]

2 L i l2.‐ Luces secuenciales

• Programa que envíe la siguiente secuencia de datos al puerto de salida D.p

Secuencia :– 00000001– 00000010– 00000100– 00001000– 00010000– 00100000– 01000000– 10000000

Page 39: PIC16F877 Con MikroC [Modo de Compatibilidad]

L i l ( )Luces secuenciales (algoritmo)

1. Configuración de puerto como salida de datos.2 Envío de primer dato al puerto de salida2. Envío de primer dato al puerto de salida3. Envío de segundo dato al puerto de salida4 Envío de tercer dato al puerto de salida4. Envío de tercer dato al puerto de salida

.

.

.9 E í d lti d t l t d lid9.   Envío de ultimo dato al puerto de salida10. Regresar a 2

Page 40: PIC16F877 Con MikroC [Modo de Compatibilidad]

L i l ( )Luces secuenciales (diagrama de flujo)Luces

Configura puertoE í 00000100 E í 00100000como 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

Page 41: PIC16F877 Con MikroC [Modo de Compatibilidad]

L i l ( )Luces secuenciales (esquemático)

Page 42: PIC16F877 Con MikroC [Modo de Compatibilidad]

L i l ( )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 DATODelay ms(500);Delay_ms(500);PORTD = 0b00000100; // ENVIA TERCER DATODelay_ms(500);PORTD = 0b00001000;Delay ms(500);Delay_ms(500);PORTD = 0b00010000;Delay_ms(500);PORTD = 0b00100000;Delay ms(500);y_ ( );PORTD = 0b01000000;Delay_ms(500);PORTD = 0b10000000;Delay_ms(500);

}}

Page 43: PIC16F877 Con MikroC [Modo de Compatibilidad]

Ej i i t 2Ejercicios propuestos 21 El alumno enviara una secuencia de datos distinta por el1. 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 800utilizando retardos por software con duración de 800 milisegundos.

100001100001010010001100001100010010100001100001

Page 44: PIC16F877 Con MikroC [Modo de Compatibilidad]

A l ( )Arreglos (definiciones)#define  MAX   50

int vector one[10]; /* arreglo de 10 enteros */int vector_one[10];        /  arreglo de 10 enteros  /

float vector_two[MAX];                 /* arreglo 50 flotantes */

fl h [MAX 20] /* l 30 fl */float vector_three[MAX ‐ 20];       /* arreglo 30 flotantes */

char numero[5];

short dato[8];

long temperatura[15];long temperatura[15];

unsigned peso[7];

i d h d[3]unsigned short d[3]; 

Page 45: PIC16F877 Con MikroC [Modo de Compatibilidad]

A l ( )Arreglos (Inicializando)

/* Arreglo el cúal contiene el número de  días de cada mes */

i t d [12] {31 28 31 30 31 30 31 31 30 31 30 31}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 charmsg1[ ] = {'T' 'e' 's' 't' '\0'};const charmsg1[ ] = { T ,  e ,  s ,  t ,  \0 };

const charmsg2[ ] = "Test";

Page 46: PIC16F877 Con MikroC [Modo de Compatibilidad]

C di i t ifCondicionante if

if (expresión) conjunto 1 [else conjunto 2]

• Cuando la expresión evaluada es verdadera, Las i i d l j 1 j d Si linstrucciones del conjunto 1 son ejecutadas. Si la expresión es falso, las instrucciones del conjunto 2 es j d L ió d b l d lejecutada. La expresión debe ser evaluada a un valor entero. Los paréntesis que encierra la expresión son bli iobligatorios.

• La palabra especial “else conjunto 2” es opcional.

Page 47: PIC16F877 Con MikroC [Modo de Compatibilidad]

Sí b l d di ióSímbolos de condición

Operador Operación

== igual

!= no igual!= no igual

> mayor quey q

< menor que

>= mayor que o igual a

< i l<= menor que o igual a

Page 48: PIC16F877 Con MikroC [Modo de Compatibilidad]

3 L l ( )3.‐ Luces con arreglo (algoritmo)

1. Configuración de puerto como salida.

2. Inicializa apuntador.

3 Envío de dato apuntado3. Envío de dato apuntado.

4. Incrementa apuntador.p

5. Si apuntador es mayor que o igual a 8 inicia el apuntador.

6 Regresa a 36. Regresa a 3.

Page 49: PIC16F877 Con MikroC [Modo de Compatibilidad]

L l ( )Luces con arreglo (diagrama de flujo)

Luces

Configura puertocomo salida

Incrementaapuntador

Limpia apuntadorLi i

sip p

E í d t

apuntador ≥ 8 Limpia apuntador

Envía datoapuntado no

Page 50: PIC16F877 Con MikroC [Modo de Compatibilidad]

L l ( )Luces con arreglo (programa)short dato [ 8 ] = {1, 2, 4, 8, 16, 32, 64, 128};short apunta;

void main(void){ 

TRISB 0 // C fiTRISB = 0; // Configura puertoapunta = 0; // Limpia apuntadorwhile(1) // Ciclo infinito

{  PORTB = dato [ apunta ]; // Envía datoDelay ms(1000);y_ ( );apunta ++; // Incrementa apuntador

if ( apunta > =  8 ) // Si apuntador ≥ 8apunta = 0; // Limpia apuntadorapunta = 0; // Limpia apuntador

}}

Page 51: PIC16F877 Con MikroC [Modo de Compatibilidad]

Ej i i t 3Ejercicios propuestos 3

1. El alumno enviara una secuencia por el puerto B usando los valores almacenado enpuerto B usando los valores almacenado en un arreglo.

000000110000011000001100000110000001100000110000011000000110000011000000

Page 52: PIC16F877 Con MikroC [Modo de Compatibilidad]

Operadores a nivel de bitsOperadores a nivel de bitsOperador operacionp p

& 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

<< C i i t h i l i i d l bit h i l<< Corrimiento hacia la izquierda; mueve los bits hacia la izquierda, descartando el bit mas a la izquierda y asignando ceros al bit a la derecha.

>> 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.

Page 53: PIC16F877 Con MikroC [Modo de Compatibilidad]

Ej l d ló iEjemplos operadores lógicos0x1234 & 0x5678 /* Igual 0x1230 */

porque...0x1234 :  0001 0010 0011 01000x5678: 0101 0110 0111 10000x5678:  0101 0110 0111 1000

‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐& :      0001 0010 0011 0000   esto es, 0x1230 

/* De forma similar: */

0x1234 | 0x5678;       /* Igual 0x567C  */0x1234 ^ 0x5678;      /* Igual 0x444C  */0 1234 /* I l 0 EDCB */~ 0x1234;                   /* Igual 0xEDCB */

Page 54: PIC16F877 Con MikroC [Modo de Compatibilidad]

Ej l i l d bitEjemplos a nivel de bits

000001 << 5;         /* Igual 000040 */

0 3801 4 /* I l 0 8010 b fl j ! */0x3801 << 4;         /* Igual 0x8010, sobreflujo! */

0x02F6 >> 4; /* Igual 0x002F */

0 FF56 4 /* I l 0 0FF5 */0xFF56 >> 4;        /* Igual 0x0FF5 */

Corrimiento a la derecha division entre 2n.

i i l i i d dCorrimiento a la izquierda producto por 2n.

Page 55: PIC16F877 Con MikroC [Modo de Compatibilidad]

4 L d l i t ( )4.‐ Luces con desplazamiento (algoritmo)

1. Configuración de puerto como salida.

2. Inicializa variable.

3 Envía valor de la variable al puerto3. Envía valor de la variable al puerto.

4. Modifica la variable.

5. Si variable es cero, Inicializa la variable.

6. Regresa a 3.

Page 56: PIC16F877 Con MikroC [Modo de Compatibilidad]

L d l i t ( )Luces con desplazamiento (diagrama de flujo)

Luces

Configura puertocomo salida

Modificavariable

Inicializa variableI i i li

si

E í i bl

variable = 0 Inicializavariable

Envía variableal puerto no

Page 57: PIC16F877 Con MikroC [Modo de Compatibilidad]

L d l i t ( )Luces con desplazamiento (programa 1)void main ( void ){  unsigned short dato;

TRISD = 0;;

dato = 0b00000001;

while ( 1 ){

PORTD = dato;PORTD = dato;Delay_ms ( 300 );dato = dato << 1;f ( d )if ( dato == 0 ) dato = 0x01;

}}

Page 58: PIC16F877 Con MikroC [Modo de Compatibilidad]

Operaciones aritméticasOperaciones aritméticasOperador Operación

+ Suma

- Resta

* Multiplicación

/ División

% Resto, regresa el residuo de la división entera (no puede ser usado con variables flotantes C fij I t l l d l i bl t d++ Como prefijo Incrementa en uno el valor de la variable antes de evaluar la expresión. Como Postfijo suma en uno la variable después de ser evaluado la expresión.

-- Como prefijo decrementa en uno el valor de la variable antes de evaluar la expresión. Como Postfijo resta en uno la variable después de ser evaluado la expresión.

Page 59: PIC16F877 Con MikroC [Modo de Compatibilidad]

L d l i t ( )Luces con desplazamiento (programa 2)void main ( void )void main ( void ){  unsigned short dato;

TRISD 0TRISD = 0;

dato = 1;

while ( 1 ){{

PORTD = dato;Delay_ms (250);dato = dato * 2;dato   dato   2;if ( dato == 0 ) dato = 0x01;

}}}

Page 60: PIC16F877 Con MikroC [Modo de Compatibilidad]

Ej i i t 4Ejercicios propuestos 4

1. El alumno realizara un programa que envíe al puerto C los siguientes valores utilizando parapuerto C los siguientes valores utilizando para generarlas, las instrucciones de desplazamiento y/o aritméticasaritméticas.

1 5 9 13 17 21 25 29 33 37 41 451, 5, 9, 13, 17, 21, 25, 29, 33, 37, 41, 45

2 L i l j i i t i l i i t2. Lo mismo que el ejercicio anterior con la siguiente secuencia:

3, 6, 12, 24, 48, 92, 172, 1, 3, 6, 9, 12, 15, 18, 21, 24

Page 61: PIC16F877 Con MikroC [Modo de Compatibilidad]

A bit i di id lAcceso a bits individual

• 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:// Si RB0 es uno, colocar en uno la terminal RC0:

if ( PORTB.F0 )PORTC F0 1PORTC.F0 = 1;

L Id tifi d F0 F7 i ú lLos Identificadores F0–F7 no se reconocen en minúsculas. 

Page 62: PIC16F877 Con MikroC [Modo de Compatibilidad]

5 S i di i d ( )5.‐ Secuencias condicionadas ( problema )

• Realizar un programa que envíe secuencias di ti t l t D d di d d l ldistintas al puerto D, dependiendo del valor de la terminal RA0. Si RA0 es igual a cero se genvía la serie de dos bits desplazados hacia la izquierda mientras que si RA0 es igual a 1izquierda, mientras que si RA0 es igual a 1 entonces se envía la serie de tres bits desplazados hacia la derecha.

Page 63: PIC16F877 Con MikroC [Modo de Compatibilidad]

S i di i d ( )Secuencias condicionadas (algoritmo)

1. Configuración de puertos

2 I i i t d2. Inicia contador

3. Si RA0 es igual a 0 entonces envía gsecuencia_izquierda

4 De lo contrario envía secuencia derecha4. De lo contrario envía secuencia_derecha

5. Incrementa contador

6. Si contador es igual a 8 entonces contador igual a 0

7 Regresa a 37. Regresa a 3

Page 64: PIC16F877 Con MikroC [Modo de Compatibilidad]

S i di i d ( )Secuencias condicionadas (diagrama de flujo)LucesLuces

Configura puertosRD salida RA entrada

Envíasecuencia_izquierdaRD salida, RA entrada _ q

IncrementaLimpia contador contador

Contador = 10 Limpia contador

si

RA0 = 0si

no

RA0 0

Envía Secuencia_derechano

Page 65: PIC16F877 Con MikroC [Modo de Compatibilidad]

S i di i d ( )Secuencias condicionadas (programa)short izquierda[10] { 0 1 3 6 12 24 48 96 192 128 };short izquierda[10] = { 0, 1, 3, 6, 12, 24, 48, 96, 192, 128 };short derecha[10] = { 128, 192, 226, 102, 56, 28, 14, 7, 3, 1 };  void main ( void ){

TRISD = 0;ADCON1 = 6;TRISA = 0x7F;

Contador = 0;

for ( ; ; ){

Delay_ms ( 500 );

if ( PORTA F0 0 )if ( PORTA.F0 = = 0 )PORTD = izquierda [ contador];

elsePORTD = derecha [ contador];

contador + + ;

If ( contador = = 10 )contador = 0;

}}}

Page 66: PIC16F877 Con MikroC [Modo de Compatibilidad]

Ej i i t 5Ejercicios propuestos 5

1. El alumno desarrollara un programa que í i d ú BCDenvíe una secuencia de números BCD a un 

display de 7 segmentos ubicados en el p y gpuerto D. Si la terminal RA1 ubicada en el puerto A es igual a 0 la numeración debepuerto A, es igual a 0, la numeración debe ser incremental; en caso contrario debe decrementarse.

Page 67: PIC16F877 Con MikroC [Modo de Compatibilidad]

Ej i i t 5 ( )Ejercicios propuestos 5 (esquemático)

Page 68: PIC16F877 Con MikroC [Modo de Compatibilidad]

MOTOR A PASOS 1MOTOR A PASOS 1

• Unipolar.‐ Tiene 4 bobinas independientes (A, B, C, D) y una terminal común a todas ellasuna terminal común a todas ellas.

Page 69: PIC16F877 Con MikroC [Modo de Compatibilidad]

MOTOR A PASOS 2MOTOR A PASOS 2

• Unipolar.‐ Tiene 4 bobinas independientes (A, B, C, D) y dos terminales comunesy dos terminales comunes.

Page 70: PIC16F877 Con MikroC [Modo de Compatibilidad]

MOTOR A PASOS 2MOTOR A PASOS 2

• Bipolar.‐ Tiene 2 bobinas (A – C, B – D)

Page 71: PIC16F877 Con MikroC [Modo de Compatibilidad]

Secuencias de activación 1Secuencias de activación 1

• Unipolar.‐Movimiento de 1 paso por pulso (mayor torque)torque).

P A B C DPaso A B C D

1 1 1 0 01 1 1 0 0

2 0 1 1 0

3 0 0 1 1

4 1 0 0 14 1 0 0 1

Page 72: PIC16F877 Con MikroC [Modo de Compatibilidad]

Secuencias de activación 2Secuencias de activación 2

• Unipolar.‐Movimiento de 1 paso por pulso (mayor velocidad)velocidad).

P A B C DPaso A B C D

1 1 0 0 01 1 0 0 0

2 0 1 0 0

3 0 0 1 0

4 0 0 0 14 0 0 0 1

Page 73: PIC16F877 Con MikroC [Modo de Compatibilidad]

Secuencias de activación 3Secuencias de activación 3

• Unipolar.‐Movimiento de 1/2 paso por pulso.

Paso A B C D

0 5 1 0 0 00.5 1 0 0 01 1 1 0 0

1 5 0 1 0 01.5 0 1 0 02 0 1 1 0

2 5 0 0 1 02.5 0 0 1 03 0 0 1 1

3 5 0 0 0 13.5 0 0 0 14 1 0 0 1

Page 74: PIC16F877 Con MikroC [Modo de Compatibilidad]

Secuencias de activación 4Secuencias de activación 4

• Bipolar.‐Movimiento de un paso

Paso A C B DPaso A C B D

1 1 0 1 02 1 0 0 13 0 1 0 14 0 1 1 0

Page 75: PIC16F877 Con MikroC [Modo de Compatibilidad]

Secuencia de activación 5Secuencia de activación 5

•Bipolar.- Movimiento de medio paso

Paso A C B D

0 5 1 0 1 00.5 1 0 1 01 1 0 0 0

1 5 1 0 0 11.5 1 0 0 12 0 0 0 1

2 5 0 1 0 12.5 0 1 0 13 0 1 0 0

3 5 0 1 1 03.5 0 1 1 04 0 0 1 0

Page 76: PIC16F877 Con MikroC [Modo de Compatibilidad]

Ci it d t i 1 ( )Circuito de potencia 1 (motor unipolar )

Page 77: PIC16F877 Con MikroC [Modo de Compatibilidad]

Ci it d t i 2 ( )Circuito de potencia 2 (motor unipolar )

Page 78: PIC16F877 Con MikroC [Modo de Compatibilidad]

Ci it d t i 3 ( )Circuito de potencia 3 (motor bipolar )

Este mismo diagrama se repetiría para manejar la segunda bobina

Page 79: PIC16F877 Con MikroC [Modo de Compatibilidad]

Ci it d t i ( )Circuito de potencia x (motor a pasos )

Circuito integrado UCN 5804 Circuito integrado SAA1042

Page 80: PIC16F877 Con MikroC [Modo de Compatibilidad]

Ci it d t i 1 ( )Circuito de potencia x1 (motor unipolar )

Page 81: PIC16F877 Con MikroC [Modo de Compatibilidad]

Ci it d t i 2 ( )Circuito de potencia x2 (motor bipolar )

Page 82: PIC16F877 Con MikroC [Modo de Compatibilidad]

Ej i i t 5Ejercicios propuestos 5

2.‐ El alumno desarrollara un programa que í l i d ti ió d tenvíe la secuencia de activación de un motor 

a pasos ubicado en el puerto D. Si la terminal p pubicada en el puerto A, RA6, sea igual a 0, el motor debe girar a la derecha en casomotor debe girar a la derecha, en caso contrario debe girar a la izquierda.

Page 83: PIC16F877 Con MikroC [Modo de Compatibilidad]

Ej i i t 5 ( )Ejercicios propuestos 5 (esquemático)

Page 84: PIC16F877 Con MikroC [Modo de Compatibilidad]

6 Di l d 7 t6.‐ Display de 7 segmentos

• Realizar un programa en donde se i l t t d d 00 99implemente un contador de 00‐99 desplegando en un par de display’s de 7 p g p p ysegmentos. El programa debe realizar la visualización utilizando el multiplexaje de losvisualización utilizando el multiplexaje de los datos, utilizando el puerto B como bus de datos y las terminales RC0 y RC1 como terminales de habilitación de displayterminales de habilitación de display.

Page 85: PIC16F877 Con MikroC [Modo de Compatibilidad]

Di l d 7 t ( )Display de 7 segmentos (algoritmo)1. Configurar los puertos, inicialización de variables (unidades = ‘0’ 

decenas = ‘0’)2. Envío de decenas2. Envío de decenas3. Habilitación de decenas4. Envío de unidades5 Habilitación de unidades5. Habilitación de unidades6. Incremento de unidades7. Si unidades mayor de ‘9’ entonces 98 Si 28. Sigue 29. Unidades = ‘0’10. Incrementa decenas11. Si decenas mayor de ‘9’ entonces 1212. Sigue 213. Decenas=‘0’14. Sigue 2

Page 86: PIC16F877 Con MikroC [Modo de Compatibilidad]

Di l d 7 t ( )Display de 7 segmentos (diagrama de flujo)Displayp y

Limpia unidadesIncrementa decenas

Configura puertosInicia variables

Incrementa decenas

siEnvía decenaEnvía unidad

Decenas>’9’si

Incrementa unidad

Limpia decenassi

no

Unidades>’9’

Limpia decenassi

no

Page 87: PIC16F877 Con MikroC [Modo de Compatibilidad]

Di l d 7 t ( )Display de 7 segmentos (programa)short numero[ ] = { 0x3F, 0x06, 0x1B, 0x4F, 0x66, 0x6D, 0x5E, 0x07, 0x7F, 0x67 };[ ] { , , , , , , , , , };

void main ( void ) // Programa principal{

TRISB = 0; // Configuración de puertosTRISC = 0;;unidades = decenas = ‘0’; // Inicialización de variables

while ( 1 )  // Programa de usuario{

PORTB = numero [ decenas ]; // Envía decenas[ ]; //PORTC.F0 = 1; // Habilita el display de decenas

delay‐ms( 10 );PORTC.F0 = 0; 

PORTB = numero [ unidades ]; // Envía unidadesPORTC.F1 = 1; //  Habilita el display de decenas; // p y

delay‐ms( 10 );PORTC.F1 = 0;

unidades++; // Incrementa unidadesif ( unidades > ’9’ )( )

{unidades = ‘0’; // Reinicia unidadesdecenas++; // Incrementa decenasif ( decenas > ’9’ ){{

decenas = ‘0’; // Reinicie decenas}

}

}}

}

Page 88: PIC16F877 Con MikroC [Modo de Compatibilidad]

Di l d 7 t ( )Display de 7 segmentos ( esquemático )

Page 89: PIC16F877 Con MikroC [Modo de Compatibilidad]

Ej i i t 6 ( )Ejercicio propuesto 6 (d7seg)

• El alumno modificara el programa elaborado d t l f bi l i tde tal forma que se cambie el incremento por decremento, al usar un interruptor. Si el , pinterruptor esta apagado el conteo será incremental en caso contrario el conteo seráincremental, en caso contrario, el conteo será decremental. El interruptor estará ubicado en la terminal RE0 del puerto E.

Page 90: PIC16F877 Con MikroC [Modo de Compatibilidad]

Ej i i t 6 ( )Ejercicio propuesto 6 (esquemático)

Page 91: PIC16F877 Con MikroC [Modo de Compatibilidad]

Di l d i t l li idDisplay de cristal liquido

Page 92: PIC16F877 Con MikroC [Modo de Compatibilidad]

LCD ( )LCD (funciones bus 8 bits)

• Lcd8_Config

• Lcd8_Init

• Lcd8 Out• Lcd8_Out

• Lcd8 Out Cp_ _ p

• Lcd8_Chr

• Lcd8_Chr_Cp

L d8 C d• Lcd8_Cmd

Page 93: PIC16F877 Con MikroC [Modo de Compatibilidad]

L d8 C fiLcd8_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 RSunsigned short RS,unsigned short EN,unsigned shortWR,unsigned short D7unsigned short D7,unsigned short D6,unsigned short D5,unsigned short D4,unsigned short D4,unsigned short D3,unsigned short D2,unsigned short D1,g ,

unsigned short D0 );

Page 94: PIC16F877 Con MikroC [Modo de Compatibilidad]

L d8 C fi 2Lcd8_Config 2Ejemplo:Ejemplo:

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

Page 95: PIC16F877 Con MikroC [Modo de Compatibilidad]

L d8 I itLcd8_Init• Descripción: Inicializa el LCD usando un bus de 8 bits Los• 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.3RS → ctrlport.2 R/W→ ctrlport 0R/W → ctrlport.0 D7 → dataport.7 D6 → dataport.6D5→ d t t 5D5 → dataport.5 D4 → dataport.4 D3 → dataport.3D2 → dataport.2 D1 → dataport.1 D0 → dataport.0

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

Page 96: PIC16F877 Con MikroC [Modo de Compatibilidad]

Lcd8_Init 2_Ejemplo:

Lcd8 Init(&PORTB, &PORTC);Lcd8_Init(&PORTB, &PORTC);

Page 97: PIC16F877 Con MikroC [Modo de Compatibilidad]

L d8 O tLcd8_Out

• Descripción: Imprime mensaje en el LCD en la fila y columna especificada (row y col).columna especificada (row y col). 

id L d8 O (• void Lcd8_Out(   unsigned short row,unsigned short col,

char *text );

• Ejemplo:Imprime “Hello!” en el LCD en la linea 1 columna 3‐Imprime “Hello!” en el LCD en la linea 1, columna 3

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

Page 98: PIC16F877 Con MikroC [Modo de Compatibilidad]

L d8 O t CLcd8_Out_Cp

• Descripción: Imprime mensaje en el LCD en la i ió t l d lposición actual del cursor.

• void Lcd8_Out_Cp(char *text);

• Ejemplo: Imprime “Here!” en la posición actual del cursoractual del cursor

Lcd8_Out_Cp("Here!");

Page 99: PIC16F877 Con MikroC [Modo de Compatibilidad]

L d8 ChLcd8_Chr

• Descripción: Imprime un caracter en el LCD en la fila y columna especificada (row y col).y columna especificada (row y col).

id L d8 Ch (• 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 3columna 3

Lcd8_Out(2, 3, 'i');

Page 100: PIC16F877 Con MikroC [Modo de Compatibilidad]

L d8 Ch CLcd8_Chr_Cp

• Descripción: Imprime un caracter en el LCD en l i ió t l d lla posición actual del cursor.

• void Lcd8_Chr_Cp(char character);

• Ejemplo: Imprime la letra “e” en la posición actual del cursoractual del cursor

Lcd8_Chr_Cp('e');

Page 101: PIC16F877 Con MikroC [Modo de Compatibilidad]

L d8 C dLcd8_Cmd

• Descripción: Envía un comando al LCD. Se d l f ió d l t tpuede pasar a la función una de las constantes 

predefinidas.p

• void Lcd8_Cmd(unsigned short command);

• Ejemplo: Limpia el LCDEjemplo: Limpia el LCD

Lcd8_Cmd(LCD_CLEAR);

Page 102: PIC16F877 Con MikroC [Modo de Compatibilidad]

Comandos predefinidosCo a dos p ede dosComando FunciónLCD FIRST ROW M l l 1 filLCD_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 RAMLCD_MOVE_CURSOR_LEFT Mueve el cursor hacia la izquierda sin cambiar la RAMLCD_MOVE_CURSOR_RIGHT Mueve el cursor hacia la derecha sin cambiar el contenido de la RAMLCD_TURN_ON Enciende el displayLCD_TURN_OFF Apaga el displayLCD_SHIFT_LEFT Mueve el display hacia la izquierda sin cambiar el contenido de la RAMLCD SHIFT RIGHT Mueve el display hacia la derecha sin cambiar el contenido de la RAMLCD_SHIFT_RIGHT Mueve el display hacia la derecha sin cambiar el contenido de la RAM

Page 103: PIC16F877 Con MikroC [Modo de Compatibilidad]

7 LCD 8 BITS7.‐ LCD 8 BITS

• Diseñar el programa que inicialice un LCD, d b d d t d 8 bitusando un bus de datos de 8 bits, y a 

continuación mande un mensaje de jbienvenida. El mensaje debe desplazarse hacia la izquierda en forma continuala izquierda en forma continua.

Page 104: PIC16F877 Con MikroC [Modo de Compatibilidad]

LCD 8 BITS ( )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 la3. Envía comando de desplazamiento hacia la izquierda.

4. Repite el paso 3.

Page 105: PIC16F877 Con MikroC [Modo de Compatibilidad]

LCD 8 BITS ( )LCD 8 BITS (diagrama de flujo)LCD 8 bits

Inicializa puertos de

LCD 8 bits

Inicializa puertos dedatos y control

Envía mensaje

Envía comando deEnvía comando deCorrimiento a la izq.

Page 106: PIC16F877 Con MikroC [Modo de Compatibilidad]

LCD 8 BITS ( )LCD 8 BITS (esquemático)

Page 107: PIC16F877 Con MikroC [Modo de Compatibilidad]

LCD 8 BITS ( )LCD 8 BITS (programa 1)Void main(void){  TRISB = 0;TRISC 0TRISC = 0;

Lcd8 Config(&PORTC,&PORTB,0,2,1,7,6,5,4,3,2,1,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);

}}} 

Page 108: PIC16F877 Con MikroC [Modo de Compatibilidad]

LCD 8 BITS ( )LCD 8 BITS (programa 2)char mensaje[ ] = “Programa numero 2”;

void main(void)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);Delay_ms(500);

}} 

Page 109: PIC16F877 Con MikroC [Modo de Compatibilidad]

LCD 8 BITS ( )LCD 8 BITS (esquemático)

Page 110: PIC16F877 Con MikroC [Modo de Compatibilidad]

LCD 8 BITS ( )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);

}}} 

Page 111: PIC16F877 Con MikroC [Modo de Compatibilidad]

Ej i i t 7Ejercicios propuestos 7

1. Programa que forme la palabra ‘HOLA’ en un LCD, configurado para utilizar un bus de 8 bits Las letrasconfigurado para utilizar un bus de 8 bits. Las letras deben desplazarse de derecha a izquierda. Primero d b l H i d d d l d hdebe 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 ciclicodebe ser ciclico.

Page 112: PIC16F877 Con MikroC [Modo de Compatibilidad]

Ejercicio propuesto 8Ejercicio propuesto 8

H H O HO L

H OH

.H OH .

.

H O L AH OH H O L A

Page 113: PIC16F877 Con MikroC [Modo de Compatibilidad]

LCD ( )LCD (funciones bus 4 bits)

• Lcd_Config

• Lcd_Init

• Lcd Out• Lcd_Out

• Lcd Out Cp_ _ p

• Lcd_Chr

• Lcd_Chr_Cp

L d C d• Lcd_Cmd

Page 114: PIC16F877 Con MikroC [Modo de Compatibilidad]

L d C fiLcd_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.

d f (• void Lcd_Config(    unsigned short *ctrl_data_port,unsigned short RS,

unsigned short ENunsigned short EN,unsigned shortWR,unsigned short D7,unsigned short D6,unsigned short D5,

)unsigned short D4  );

Page 115: PIC16F877 Con MikroC [Modo de Compatibilidad]

Lcd Config 2Lcd_Config 2Ejemplo:Ejemplo:

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

Page 116: PIC16F877 Con MikroC [Modo de Compatibilidad]

L d I itLcd_Init• Descripción: Inicializa el LCD usando un bus de 4 bits• 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 ‐tiene la siguiente asignación de terminales.

E → ctrl_data_port.3RS→ ctrl data port 2RS → ctrl_data_port.2 D7 → ctrl_data_port.7 D6 → ctrl_data_port.6D5 → ctrl_data_port.5 D4 → ctrl_data_port.4 

• void Lcd_Init(unsigned short *ctrl_data_port);

Page 117: PIC16F877 Con MikroC [Modo de Compatibilidad]

L d I it 2Lcd_Init 2Ejemplo:Ejemplo:

Lcd_Init(&PORTB);

Page 118: PIC16F877 Con MikroC [Modo de Compatibilidad]

L d O tLcd_Out

• Descripción: Imprime mensaje en el LCD en la fila y columna especificada (row y col).columna especificada (row y col). 

id L d O (• void Lcd_Out(   unsigned short row,unsigned short col,

char *text );

• Ejemplo:Imprime “Hello!” en el LCD en la línea 1 columna 3‐Imprime “Hello!” en el LCD en la línea 1, columna 3

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

Page 119: PIC16F877 Con MikroC [Modo de Compatibilidad]

L d O t CLcd_Out_Cp

• Descripción: Imprime mensaje en el LCD en la posición actual del cursorposición actual del cursor.

• void Lcd_Out_Cp(char *text);

• Ejemplo:‐ Imprime “Here!” en la posición actual del cursor

Lcd Out Cp("Here!");Lcd_Out_Cp("Here!");

Page 120: PIC16F877 Con MikroC [Modo de Compatibilidad]

L d ChLcd_Chr

• Descripción: Imprime un caracter en el LCD en la fila y columna especificada (row y col).y columna especificada (row y col).

id L d Ch (• 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‐ Imprime la letra ‘i’ en el LCD en la línea 2,y columna 3

Lcd_Out(2, 3, 'i');

Page 121: PIC16F877 Con MikroC [Modo de Compatibilidad]

L d Ch CLcd_Chr_Cp

• Descripción: Imprime un caracter en el LCD en la posición actual del cursorposició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(' ');Lcd_Chr_Cp('e');

Page 122: PIC16F877 Con MikroC [Modo de Compatibilidad]

L d C dLcd_Cmd

• Descripción: Envía un comando al LCD. Se puede pasar a la función una de las constantes predefinidas. Los comandos son plos mismos para ambos modos de manejo del LCD (bus 8 o 4 bits).

• void Lcd Cmd(unsigned short command);void Lcd_Cmd(unsigned short command);

j l• Ejemplo:‐ Apaga el cursor, no aparece en el LCDp g p

Lcd_Cmd(LCD_CURSOR_OFF);

Page 123: PIC16F877 Con MikroC [Modo de Compatibilidad]

8 LCD 4 BITS8.‐ LCD 4 BITS

• Diseñar el programa que inicialice un LCD, d b d d t d 4 bitusando un bus de datos de 4 bits, y a 

continuación mande un mensaje cualquiera j qde bienvenida. El mensaje debe desplazarse hacia la derecha en forma continuahacia la derecha en forma continua.

Page 124: PIC16F877 Con MikroC [Modo de Compatibilidad]

LCD 4 BITS ( )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 la3. Envía comando de desplazamiento hacia la derecha.

4. Repite el paso 3.

Page 125: PIC16F877 Con MikroC [Modo de Compatibilidad]

LCD 4 BITS ( )LCD 4 BITS (diagrama de flujo)LCD 8 bits

Inicializa puertos de

LCD 8 bits

Inicializa puertos dedatos y control

Envía mensaje

Envía comando deEnvía comando deCorrimiento a la der.

Page 126: PIC16F877 Con MikroC [Modo de Compatibilidad]

LCD 4 BITS ( )LCD 4 BITS (esquemático Config)

Page 127: PIC16F877 Con MikroC [Modo de Compatibilidad]

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

}}} 

Page 128: PIC16F877 Con MikroC [Modo de Compatibilidad]

LCD 4 BITS ( )LCD 4 BITS (programa 2)char mensaje[11]={‘B’, ‘u’, ‘s’, ‘ ’, ‘4’, ‘ ’, ‘b’, ‘i’, ‘t’, ‘s’, ‘\0’};

void main(void)void main(void){  TRISD = 0;

L d C fi (&PORTD 0 2 1 7 6 5 4)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);

}}} 

Page 129: PIC16F877 Con MikroC [Modo de Compatibilidad]

LCD 4 BITS ( )LCD 4 BITS (esquemático Init)

Page 130: PIC16F877 Con MikroC [Modo de Compatibilidad]

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

}}} 

Page 131: PIC16F877 Con MikroC [Modo de Compatibilidad]

C ió d ti d d tConversión de tipo de datos

Tipo de dato a cadena

• ByteToStr

• ShortToStr• ShortToStr

• WordToStr

• IntToStr

• LongToStr

Fl tT St• FloatToStr

Page 132: PIC16F877 Con MikroC [Modo de Compatibilidad]

B t T StByteToStr

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

lEjemplo: unsigned short t = 24;char *txt=“ “; //se inicializa un apuntador a 4 espacioschar *txt=      ;  //se inicializa un apuntador a 4 espacios

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

Page 133: PIC16F877 Con MikroC [Modo de Compatibilidad]

Sh tT StShortToStr

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 seun 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;h *t t “ “ // S i i i li d d 5 ichar *txt=“     “;  // Se inicializa un apuntador de 5 espacios

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

Page 134: PIC16F877 Con MikroC [Modo de Compatibilidad]

W dT StWordToStr

Descripción: Crea una cadena de salida de un numero sin signo (Valor numérico de una variable unsigned). La cadena esta j t d h d 5 t L i i lajustada a un ancho de 5 caracteres; Las posiciones a la izquierda que no se usan en la conversión se rellenan con espacios.p

voidWordToStr(unsigned number, char *output);( g , p );

Ejemplo:unsigned t = 437; char *txt=“      “;  // Inicializa un apuntador con 6 espacios

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

Page 135: PIC16F877 Con MikroC [Modo de Compatibilidad]

I tT StIntToStr

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 lade 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 espacioschar txt=         ;  // Inicializa un apuntador con 6 espacios

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

Page 136: PIC16F877 Con MikroC [Modo de Compatibilidad]

L T StLongToStr

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 usanancho 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=“ “; // Inicializa un apuntador con 12 espacioschar txt=              ;  // Inicializa un apuntador con 12 espacios

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

Page 137: PIC16F877 Con MikroC [Modo de Compatibilidad]

Fl tT StFloatToStr

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(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;float ff    374.2;char *txt=“             “; // Inicializa un apuntador con 14 espacios

Fl T S (ff ) // " "FloatToStr(ff, txt);  // txt es "‐0.37420e3"

Page 138: PIC16F877 Con MikroC [Modo de Compatibilidad]

9 C t d 0 9 ( )9.‐ Contador 0‐9 (problema) 

• Se quiere un programa que visualice un t d 0 9 LCDconteo de 0 a 9 en un LCD.

Page 139: PIC16F877 Con MikroC [Modo de Compatibilidad]

C t d 0 9 ( )Contador 0‐9 (algoritmo)

1. Configura el LCD

2. Inicializa el contador

3 Convierte a ASCII el valor del contador3. Convierte a ASCII el valor del contador

4. Envía valor en ASCII al LCD

5. Incrementa el contador

6. Regresa a 3

Page 140: PIC16F877 Con MikroC [Modo de Compatibilidad]

C t d 0 9 ( )Contador 0‐9 (diagrama de flujo)tecladoteclado

Inicializa puertosp(LCD)

Convierte contador a ASCII

Inicializa contador

Envía a LCDASCII

Incrementa contadorcontador

Page 141: PIC16F877 Con MikroC [Modo de Compatibilidad]

C t d 0 9 ( )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);Lcd_Config(&PORTD,0,2,1,7,6,5,4);

contador = 0;

L d O t(1 1 ”C t d 0 9”)Lcd_Out(1,1,”Contador 0‐9”);

while(1){{ShortToStr ( contador , cadena );Lcd_Out ( 2 , 8 , cadena );contador ++;Delay ms(500);Delay_ms(500);

}} 

Page 142: PIC16F877 Con MikroC [Modo de Compatibilidad]

C t d 0 9 ( )Contador 0‐9 (esquemático)

Page 143: PIC16F877 Con MikroC [Modo de Compatibilidad]

C t d 0 9 ( )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

Contador 0-9 :9. . .

Page 144: PIC16F877 Con MikroC [Modo de Compatibilidad]

Ej i i t 8Ejercicio propuesto 8

1. Programa que utilice un LCD, configurado para usar un bus de 8 bits. En el LCD deben aparecer en pforma secuencial, los números de la secuencia 1 – 2 – 4 – 8 – 16 – 32 – 64 – 128 – 256 – 512 – 1024 – 2048 –4096 8192 16384 32768 L d b4096 – 8192 – 16384 ‐ 32768. Los numero deben ser generados por operaciones aritméticas. El desplegado debe hacerse de la forma mostrada endesplegado debe hacerse de la forma mostrada en las siguientes figuras. Se utiliza la segunda fila, presentando hasta 3 numeros consecutivos, unpresentando hasta 3 numeros consecutivos, un numero a la izquierda, uno mas al centro y otro a la derecha.

Page 145: PIC16F877 Con MikroC [Modo de Compatibilidad]

Ej i i t 8Ejercicio propuesto 8

Serie de numeros Serie de numeros1

Serie de numeros1 2

Serie de numeros1 2 4

Serie de numeros8

Serie de numeros8 16

Serie de numeros8 16 32

Serie de numeros8192 16384 32768. . .

Page 146: PIC16F877 Con MikroC [Modo de Compatibilidad]

Ej i i t 9Ejercicio propuesto 9

1. El alumno diseñara un programa en donde t LCD l ú d d 00se muestre en un LCD los números desde 00 

hasta el 99. Con un intervalo de tiempo pentre cambio igual a 500 milisegundos.

Page 147: PIC16F877 Con MikroC [Modo de Compatibilidad]

Ej i i t 9Ejercicio propuesto 9

Contador 00-99 cada 500 mseg00

Contador 00-99 cada 500 mseg 01

Contador 00-99 cada 500 mseg 0200 01 02

Contador 00-99 cada 500 mseg03

Contador 00-99 cada 500 mseg04

Contador 00-99 cada 500 mseg0503 04 05

Contador 00-99 cada 500 mseg06

Contador 00-99 cada 500 mseg99. . .06 99. . .

Page 148: PIC16F877 Con MikroC [Modo de Compatibilidad]

T l d t i i l ( )Teclado matricial (esquemático)

Page 149: PIC16F877 Con MikroC [Modo de Compatibilidad]

T l d t i i l ( )Teclado matricial (funciones)

• Keypad_Init

• Keypad Read• Keypad_Read

• Keypad ReleasedKeypad_Released

Page 150: PIC16F877 Con MikroC [Modo de Compatibilidad]

K d I itKeypad_Init

• Descripción: Inicializa el puerto para trabajar con el teclado. Las terminales del teclado deben estar conectadas de la siguiente forma:

port.F0 columna 1port.F1 columna 2port.F2 columna 3port F3 columna 4port.F3 columna 4port.F4 fila 1port.F5 fila 2port.F5 fila 2port.F6 fila 3port.F7 fila 4

• void Keypad_Init(unsigned *port);

Page 151: PIC16F877 Con MikroC [Modo de Compatibilidad]

K d I it 2Keypad_Init 2Ejemplo:

Keypad_Init(&PORTB);

Page 152: PIC16F877 Con MikroC [Modo de Compatibilidad]

K d R dKeypad_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 11 12 2… …9 99 9* 100 11# 12# 12

• unsigned short Keypad_Read(void);

• Ejemplo:k K d R d()kp = Keypad_Read();

Page 153: PIC16F877 Con MikroC [Modo de Compatibilidad]

K d R l dKeypad_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 yblocking 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);• unsigned short Keypad_Released(void); 

• Ejemplo:

Keypad Released();Keypad_Released();

Page 154: PIC16F877 Con MikroC [Modo de Compatibilidad]

10 T l d t i i l ( )10.‐ Teclado matricial (problema)

• Se desea un programa con el cual se  muestre LCD (b 8 bit t B t Cen un LCD (bus 8 bits en puerto B y puerto C 

como control) la tecla presionada en un ) pteclado matricial (puerto D).

Page 155: PIC16F877 Con MikroC [Modo de Compatibilidad]

T l d t i i l ( )Teclado matricial (algoritmo)

1. Configuración de puertos (teclado y lcd).

2. Lectura de teclado

3 Conversión a ASCII3. Conversión a ASCII

4. Envío al LCD

5. Regresar a 2

Page 156: PIC16F877 Con MikroC [Modo de Compatibilidad]

T l d t i i l ( )Teclado matricial (diagramas de flujo)tecladoteclado

Inicializa puertosp(LCD y teclado)

Lee tecladoLee teclado

Convierte a ASCII

Envía a LCD

Page 157: PIC16F877 Con MikroC [Modo de Compatibilidad]

T l d t i i l ( )Teclado matricial (esquemático)

AHS1

Page 158: PIC16F877 Con MikroC [Modo de Compatibilidad]

Diapositiva 157

AHS1 TEC, 08-02-2006

Page 159: PIC16F877 Con MikroC [Modo de Compatibilidad]

Teclado matricial (programa)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); // Inicializa LCD en puerto B y puerto CLcd8_Cmd(LCD_CLEAR);  // Limpia displayLcd8_Cmd(LCD_CURSOR_OFF);  // Cursor apagadoLcd8_Out(1, 1, "Key :"); L d8 O t(2 1 "Ti ")Lcd8_Out(2, 1, "Times:"); do {  kp = 0;  // Espera a que se presione una tecla pressed

do kp = Keypad_Read(); while (!kp);  // Prepara valor para salidaswitch (kp)switch (kp) 

{ case 10:      kp = 42; break;  // '*'

case 11:      kp = 48; break; // '0'break;  //  0

case 12:      kp = 35;break;  // '#'

default:       kp += 48; }}

cnt++;Lcd9_Chr(1, 10, kp); if (cnt == 255) { cnt = 0; Lcd8_Out(2, 10, " "); }  // Imprime en LCDWordToStr(cnt, txt); Lcd8_Out(2, 10, txt);

} while (1);}

Page 160: PIC16F877 Con MikroC [Modo de Compatibilidad]

Ej i i t 9Ejercicio propuesto 9

1. El alumno realizara un programa que tome 3 ú d d t l d t i i l lnúmeros desde un teclado matricial, los 

guarde en un arreglo, los convierta a un g g ,numero que se guarde en una variable tipo entera Con este numero el alumno deberáentera. Con este numero el alumno deberá proporcionar el producto por 2 y  división entre 2 resultantes. Visualizando los resultados en un LCDresultados en un LCD.

Page 161: PIC16F877 Con MikroC [Modo de Compatibilidad]

Ej i i t 9Ejercicio propuesto 9

Cual es el numero de 3 cifras: Cual es el numero de 3 cifras:025

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

Cual es el numero de 3 cifras:025El producto por 2 es: 050L di i ió t 2 012La división entre 2 es: 012