practicas con pic 16f877a

Embed Size (px)

Citation preview

  • 8/12/2019 practicas con pic 16f877a

    1/160

    Microcontroladores PICPIC16F877

  • 8/12/2019 practicas con pic 16f877a

    2/160

    Caractersticas

    Velocidad de operacin: hasta 20 MHz de reloj

    8K x 14 bits por palabra de memoria de

    programa FLASH

    368 x 8 bytes de memoria de datos (RAM)

    256 x 8 bytes de memoria de datos EEPROM

  • 8/12/2019 practicas con pic 16f877a

    3/160

    Caractersticas (2)

    14 fuentes de interrupciones

    Memoria de pila (stack) de 8 niveles de

    profundidad Protecciones:

    Power-on Reset (POR)

    Power-up Timer (PWRT

    ) Oscillator Start-up Timer (OST)

    Watchdog Timer (WDT) independiente del cristal.

  • 8/12/2019 practicas con pic 16f877a

    4/160

    Puertos de entrada y salida

    PORTA ( RA5, RA4, RA3, RA2, RA1, RA0 )

    PORTB ( RB7, RB6, RB5, RB4, RB3, RB2, RB1, RB0 )

    PORTC ( RC7, RC6, RC5, RC4, RC3, RC2, RC1, RC0 )

    PORTD ( RD7, RD6, RD5, RD4, RD3, RD2, RD1, RD0 )

    PORTE ( RE2, RE1, RE0 )

  • 8/12/2019 practicas con pic 16f877a

    5/160

    Caractersticas (perifricos)

    Timer 0: timer/counter de 8 bits con un pre-escalador de 8 valores.

    Timer 1: 16-bit timer/counter con pre-escalador

    Timer 2: 8-bit timer/counter con registro de estado de 8-bit, pre-

    escalador y post-escalador

    Dos mdulos de Capture, Compare, PWM

    Capture es de 16-bit, max. resolucin es 12.5 ns

    Compare es de 16-bit, max. resolucin es 200 ns

    PWM max. resolucin de 10-bit

  • 8/12/2019 practicas con pic 16f877a

    6/160

    Caractersticas (perifricos 2)

    Convertidor analgico a digital de 10-bitmulti-canal

    Puerto serial sncrono (SSP) con SPI. (modomaestro) e I2C (maestro/esclavo)

    Transmisor-Receptor sncrono-asncronouniversal (USART/SCI) con 9-bit

    Puerto paralelo esclavo (PSP) con 8-bits deancho, con terminales de control RD, WR yCS

  • 8/12/2019 practicas con pic 16f877a

    7/160

    Arquitectura interna

    Arquitectura HARVARD.

    Buses separados (datos e instrucciones).

    Memoria de programa : 14 bits.

    Memoria de datos: 8 bits.

    Recursos mapeados en memoria de datos.

  • 8/12/2019 practicas con pic 16f877a

    8/160

    Arquitectura interna

  • 8/12/2019 practicas con pic 16f877a

    9/160

    Terminales fisicas

  • 8/12/2019 practicas con pic 16f877a

    10/160

    PUERTOSPuerto # funciones Funciones

    PORTA 3 Entradas digitalSalidas digital

    Entradas analgicas

    PORTB 2 Entradas digital

    Salidas digital

    PORTC 3 Entradas digitalSalidas digital

    Medios de comunicacin

    PORTD 3 Entradas digital

    Salidas digital

    Puerto paralelo esclavoPORTE 4 Entradas digital

    Salidas digital

    Entradas analgicas

    Control del puerto paralelo esclavo

  • 8/12/2019 practicas con pic 16f877a

    11/160

    FUNCIONES PORTA

    Terminal Funciones

    RA0 Ent. Digital Sal. Digital Ent. Analgica

    RA1 Ent. Digital Sal. Digital Ent. Analgica

    RA2 Ent. Digital Sal. Digital Ent. Analgica VREF-

    RA3 Ent. Digital Sal. Digital Ent. Analgica VREF+

    RA4 Ent. Digital Sal. Digital Ent. contador 1

    RA5 Ent. Digital Sal. Digital Ent. Analgica

  • 8/12/2019 practicas con pic 16f877a

    12/160

    FUNCIONES PORTB

    Terminal Funciones

    RB0 Ent. Digital Sal. Digital Ent. Interrupcin 0

    RB1 Ent. Digital Sal. Digital

    RB2 Ent. Digital Sal. Digital

    RB3 Ent. Digital Sal. Digital PGM ( funcin LVP )

    RB4 Ent. Digital Sal. Digital

    RB5 Ent. Digital Sal. Digital

    RB6 Ent. Digital Sal. Digital PGC ( funcin LVP )

    RB7 Ent. Digital Sal. Digital PGD ( funcin LVP )

  • 8/12/2019 practicas con pic 16f877a

    13/160

    FUNCION PORTC

    Terminal Funciones

    RC0 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 sncrono I2C

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

    RC5 Ent. Digital Sal. Digital Datos salida SPI

    RC6 Ent. Digital Sal. Digital Transmisin USART

    RC7 Ent. Digital Sal. Digital Recepcin USART

  • 8/12/2019 practicas con pic 16f877a

    14/160

    FUNCIONES PORTD

    Terminal FuncionesRD0 Ent. Digital Sal. Digital Bit 0 puerto paralelo esclavo

    RD1 Ent. Digital Sal. Digital Bit 1 puerto paralelo esclavo

    RD2 Ent. Digital Sal. Digital Bit 2 puerto paralelo esclavo

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

    RD4 Ent. Digital Sal. Digital Bit 4 puerto paralelo esclavo

    RD5Ent. Digital Sal. Digital Bit 5 puerto paralelo esclavo

    RD6 Ent. Digital Sal. Digital Bit 6 puerto paralelo esclavo

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

  • 8/12/2019 practicas con pic 16f877a

    15/160

    FUNCIONES PORTE

    Terminal Funciones

    RE0 Ent. Digital Sal. Digital Ent. Analgica Lectura PSP

    RE1 Ent. Digital Sal. Digital Ent. Analgica Escritura PSP

    RE2 Ent. Digital Sal. Digital Ent. Analgica Habilitacin PSP

  • 8/12/2019 practicas con pic 16f877a

    16/160

    Tipos de datos

    Tipo bytes Rango

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

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

    unsigned long(int) 4 0 .. 4294967295

  • 8/12/2019 practicas con pic 16f877a

    17/160

    Tipos de datos 2

    Tipo bytes Rango

    float 4 1.17549435082 x 10-38..6.80564774407 x 1038

    double 4 1.17549435082 x 10-38..6.80564774407 x 1038

    long double 4 1.17549435082 x 10-38..6.80564774407 x 1038

  • 8/12/2019 practicas con pic 16f877a

    18/160

    Asignacin de datos

    Decimal

    inti = 10; /* decimal 10 */

    intj = -10;/* decimal -10 */

    intp = 0; /* decimal 0 */

    Hexadecimal

    short x = 0x37; /* decimal 55 */

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

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

  • 8/12/2019 practicas con pic 16f877a

    19/160

    Asignacin de datos

    Octal 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;

  • 8/12/2019 practicas con pic 16f877a

    20/160

    Registros asociados

    Entrada/salida Configuracin

    PORTA TRISA

    PORTB TRISB

    PORTC TRISC

    PORTD TRISD

    PORTE TRISE

  • 8/12/2019 practicas con pic 16f877a

    21/160

    Entrada o salida

    SALIDA DE DATOS : 0

    ENTRADA DE DATOS: 1

    La asignacin es individual correspondiente a

    cada terminal del puerto.

  • 8/12/2019 practicas con pic 16f877a

    22/160

    Acceso individual de bits 1

    mikroC te permite acceso individual en variables de 8 bits(char and unsigned short). Simplemente usando el selector (.)seguido de uno de los identificadores F0, F1, , F7. Siendo F7el bit mas significativo.

    Ejemplo:PORTC.F0 = 1;PORTD.F5 = 0;PORTB.F7 = 1;

    Los identificadores F0F7 no se reconocen en minsculas.

    NOTA: Entre dos accesos a bits se debe tener un retardo mnimo de 2microsegundos.

  • 8/12/2019 practicas con pic 16f877a

    23/160

    Entrada o salida Si deseamos configurar el puerto C con la

    siguiente asignacin:RC0 entradaRC1 entradaRC2 entradaRC3 entrada

    RC4 salidaRC5 salidaRC6 salidaRC7 salida

    Posibles instrucciones a utilizar

    TRISC = 0b00001111; oTRISC = 0x0F; oTRISC = 15;

  • 8/12/2019 practicas con pic 16f877a

    24/160

    Entrada o salida Si deseamos configurar el puerto D con la

    siguiente asignacin:RD0 entradaRD1 salidaRD2 entradaRD3 salida

    RD4 entradaRD5 salidaRD6 entradaRD7 salida

    Debemos utilizar cualquiera de las siguientes instrucciones

    TRISD = 0b01010101; oTRISD = 0x55; oTRISD = 85;

  • 8/12/2019 practicas con pic 16f877a

    25/160

    Entrada o salida Si deseamos configurar el puerto A con la siguiente

    asignacin:RA0 salida

    RA1 salida

    RA2 salida

    RA3 salida

    RA4 entrada

    RA5 entradaRA6 entrada

    Posibles instrucciones a utilizar

    ADCON1 = 6; \\ instruccin indispensable para usar elpuerto A y el puerto E como entrada osalida de datos digitales

    TRISA = 0b01110000; oTRISA = 0x70; oTRISA = 112;

  • 8/12/2019 practicas con pic 16f877a

    26/160

    ADCON1

    ADCON1 = 0 0 0 0 0 1 1 0

    ADCON1 = 6 ;

  • 8/12/2019 practicas con pic 16f877a

    27/160

    Delay_ms (retardo por software)

    Descripcin: Crea un retardo por software dado el tiempo enmilisegundos (constante). El rango de constantes aplicables a la funcindepende de la frecuencia del oscilador. Es una funcin interna; El cdigoes generado en el lugar donde se hace la llamada, as que la llamada de

    esta funcin no cuenta dentro del limite de llamadas anidadas.

    voidDelay_ms(consttime_in_ms)

    Ejemplo:

    Generar un retardo de 1 segundo

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

  • 8/12/2019 practicas con pic 16f877a

    28/160

    Estructura de un programa en C( ciclo while)

    // Definicin de variables globales

    // Definicin de funciones

    void main(void)

    {

    // Definicin de variables locales

    // Configuracin de registros (recursos y puertos)

    // ciclo infinito

    while ( 1 )

    {

    // Programa de usuario

    }

    }

  • 8/12/2019 practicas con pic 16f877a

    29/160

    Estructura de un programa en C( ciclo for)

    // Definicin de variables globales

    // Definicin de funciones

    void main(void)

    {

    // Definicin de variables locales

    // Configuracin de registros (recursos y puertos)

    // ciclo infinito

    for ( ; ; )

    {

    // Programa de usuario

    }

    }

  • 8/12/2019 practicas con pic 16f877a

    30/160

    Estructura de un programa en C( ciclo do - while)

    // Definicin de variables globales

    // Definicin de funciones

    void main(void)

    {

    // Definicin de variables locales

    // Configuracin de registros (recursos y puertos)

    // ciclo infinito

    do

    {

    // Programa de usuario

    } while ( 1 ) ;

    }

  • 8/12/2019 practicas con pic 16f877a

    31/160

    1.- Encendido de LED

    Crear un programa que encienda y apague un

    led, ubicado en la terminal RD7 del puerto D.El tiempo de encendido es de 1000

    milisegundo y el de apagado de 300milisegundos.

  • 8/12/2019 practicas con pic 16f877a

    32/160

    Encendido de LED (algoritmo)

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

    2. Encendido del led

    3. Retardo por software de 1000 milisegundos.

    4. Apagado del led

    5. Retardo por software de 300 milisegundos

    6. Repetir el paso 2

  • 8/12/2019 practicas con pic 16f877a

    33/160

    Encendido de LED (diagrama de flujo)Led

    Configura bit del

    puerto como salida

    Enciende bit

    Retardo de 1000ms

    Apaga bit

    Retardo de 300 ms

  • 8/12/2019 practicas con pic 16f877a

    34/160

    Encendido de LED (esquemtico)

  • 8/12/2019 practicas con pic 16f877a

    35/160

    Encendido de LED (programa)

    void main ( void )

    {

    TRISD.F7 = 0;

    while( 1 )

    {

    PORTD.F7 = 1;

    Delay_ms( 1000 );

    PORTD.F7 = 0;

    Delay_ms( 300 );

    }

    }

  • 8/12/2019 practicas con pic 16f877a

    36/160

    Encendido de LED (programa 2)

    void main ( void )

    {

    TRISD = 0;

    while( 1 )

    {

    PORTD = 0x80;

    Delay_ms( 1000 );

    PORTD = 0;

    Delay_ms( 300 );

    }

    }

  • 8/12/2019 practicas con pic 16f877a

    37/160

    Ejercicios propuestos 1

    1. El alumno encender y apagara en formaalternada dos leds ubicados en los bits 2 y 3 delpuerto B. Los retardos sern de 500 milisegundos(ambos). Usando asignacin directa a bits.

    2. El alumno encender y apagara un led ubicado en

    el bit 5 del puerto C. Los retardos sern de 100milisegundos y 2 segundos, respectivamente.Usando asignacin de byte.

  • 8/12/2019 practicas con pic 16f877a

    38/160

    2.- Luces secuenciales

    Programa que enve la siguiente secuencia de datosal puerto de salida D.

    Secuencia :

    00000001 00000010 00000100 00001000

    00010000 00100000 01000000 10000000

  • 8/12/2019 practicas con pic 16f877a

    39/160

    Luces secuenciales (algoritmo)

    1. Configuracin de puerto como salida de datos.2. Envo de primer dato al puerto de salida

    3. Envo de segundo dato al puerto de salida

    4. Envo de tercer dato al puerto de salida.

    .

    .9. Envo de ultimo dato al puerto de salida

    10. Regresar a 2

  • 8/12/2019 practicas con pic 16f877a

    40/160

    Luces secuenciales (diagrama de flujo)Luces

    Configura puerto

    como salida

    Enva 00000001

    Enva 00000010

    Enva 00000100

    Enva 00001000

    Enva 00010000

    Enva 00100000

    Enva 01000000

    Enva 10000000

  • 8/12/2019 practicas con pic 16f877a

    41/160

    Luces secuenciales (esquemtico)

  • 8/12/2019 practicas con pic 16f877a

    42/160

    Luces secuenciales (programa)void main(void)

    {TRISD = 0; // CONFIGURACION COMO PUERTO DE SALIDA

    while ( 1 ) // CICLO INFINITO{

    PORTD = 0b00000001; // ENVIA PRIMER DATODelay_ms(500);PORTD = 0b00000010; // ENVIA SEGUNDO DATODelay_ms(500);PORTD = 0b00000100; // ENVIA TERCER DATODelay_ms(500);PORTD = 0b00001000;Delay_ms(500);PORTD = 0b00010000;Delay_ms(500);PORTD = 0b00100000;Delay_ms(500);

    PORTD = 0b01000000;Delay_ms(500);PORTD = 0b10000000;Delay_ms(500);

    }}

  • 8/12/2019 practicas con pic 16f877a

    43/160

    Ejercicios propuestos 2

    1. El alumno enviara una secuencia de datos distinta por elpuerto B, utilizando retardos por software de distintasduraciones, con incrementos de 100 milisegundos entre si.

    2. El alumno enviara la secuencia de datos por el puerto A,

    utilizando retardos por software con duracin de 800milisegundos.

    100001010010

    001100010010100001

  • 8/12/2019 practicas con pic 16f877a

    44/160

    Arreglos (definiciones)

    #define MAX 50

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

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

    float vector_three[MAX - 20]; /* arreglo 30 flotantes */

    char numero[5];

    short dato[8];

    long temperatura[15];

    unsigned peso[7];

    unsignedshort d[3];

  • 8/12/2019 practicas con pic 16f877a

    45/160

    Arreglos (Inicializando)

    /* Arreglo el cal contiene el nmero de das de cada mes */

    intdays[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 charmsg2[ ] = "Test";

  • 8/12/2019 practicas con pic 16f877a

    46/160

    Condicionante if

    if(expresin) conjunto 1[elseconjunto 2]

    Cuando la expresinevaluada es verdadera, Lasinstrucciones del conjunto 1son ejecutadas. Si laexpresines falso, las instrucciones del conjunto 2esejecutada. La expresindebe ser evaluada a un valorentero. Los parntesis que encierra la expresinsonobligatorios.

    La palabra especial else conjunto 2es opcional.

  • 8/12/2019 practicas con pic 16f877a

    47/160

    Smbolos de condicin

    Operador Operacin

    == igual

    != no igual

    > mayor que

    < menor que

    >= mayor que o igual a

  • 8/12/2019 practicas con pic 16f877a

    48/160

    3.- Luces con arreglo (algoritmo)1. Configuracin de puerto como salida.

    2. Inicializa apuntador.

    3. Envo de dato apuntado.

    4. Incrementa apuntador.

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

    apuntador.

    6. Regresa a 3.

  • 8/12/2019 practicas con pic 16f877a

    49/160

    Luces con arreglo (diagrama de flujo)

    Luces

    Configura puerto

    como salida

    Limpia apuntador

    Enva dato

    apuntado

    Incrementa

    apuntador

    apuntador 8 Limpia

    apuntador

    si

    no

  • 8/12/2019 practicas con pic 16f877a

    50/160

    Luces con arreglo (programa)

    short dato [ 8 ] = {1, 2, 4, 8, 16, 32, 64, 128};short apunta;

    void main(void){

    TRISB = 0; // Configura puertoapunta = 0; // Limpia apuntador

    while(1) // Ciclo infinito{PORTB = dato [ apunta ]; // Enva dato

    Delay_ms(1000);

    apunta ++; // Incrementa apuntadorif ( apunta > = 8 ) // Si apuntador 8apunta = 0; // Limpia apuntador

    }}

  • 8/12/2019 practicas con pic 16f877a

    51/160

    Ejercicios propuestos 3

    1. El alumno enviara una secuencia por elpuerto B usando los valores almacenado enun arreglo.

    0000001100000110

    00001100

    00011000

    0011000001100000

    11000000

    d l d b

  • 8/12/2019 practicas con pic 16f877a

    52/160

    Operadores a nivel de bitsOperador operacion

    & AND; compara pares de bits y regresa 1 si ambos son 1s,de otra manera regresa 0.

    | OR (inclusive); compara pares de bits y regresa 1 si uno oambos son 1s, de otra manera regresa 0.

    ^ OR (exclusiva); compara pares de bits y regresa 1 si losbits son complementarios, de otra manera regresa 0.

    ~ Complemento (unitario); invierte cada bit

    > Corrimiento hacia la derecha; mueve los bits hacia laderecha, descartando el bit mas a la derecha y asignando

    ceros al bit a la izquierda.

  • 8/12/2019 practicas con pic 16f877a

    53/160

    Ejemplos operadores lgicos

    0x1234 & 0x5678 /* Igual 0x1230 */

    porque...0x1234 : 0001 0010 0011 0100

    0x5678: 0101 0110 0111 1000-----------------------------------

    & : 0001 0010 0011 0000 esto es, 0x1230

    /* De forma similar: */

    0x1234 | 0x5678; /* Igual 0x567C */0x1234 ^ 0x5678; /* Igual 0x444C */~ 0x1234; /* Igual 0xEDCB */

  • 8/12/2019 practicas con pic 16f877a

    54/160

    Ejemplos a nivel de bits

    000001 4; /* Igual 0x002F */

    0xFF56 >> 4; /* Igual 0x0FF5 */

    Corrimiento a la derecha division entre 2n.

    Corrimiento a la izquierda producto por 2n.

  • 8/12/2019 practicas con pic 16f877a

    55/160

    4.- Luces con desplazamiento (algoritmo)

    1. Configuracin de puerto como salida.

    2. Inicializa variable.

    3. Enva valor de la variable al puerto.

    4. Modifica la variable.

    5. Si variable es cero, Inicializa la variable.

    6. Regresa a 3.

  • 8/12/2019 practicas con pic 16f877a

    56/160

    Luces con desplazamiento (diagrama de flujo)

    Luces

    Configura puerto

    como salida

    Inicializa variable

    Enva variable

    al puerto

    Modifica

    variable

    variable = 0 Inicializa

    variable

    si

    no

  • 8/12/2019 practicas con pic 16f877a

    57/160

    Luces con desplazamiento (programa 1)void main ( void )

    { unsigned short dato;

    TRISD = 0;

    dato = 0b00000001;

    while ( 1 ){

    PORTD = dato;Delay_ms ( 300 );dato = dato

  • 8/12/2019 practicas con pic 16f877a

    58/160

    Operaciones aritmticasOperador Operacin

    + Suma

    - Resta

    * Multiplicacin

    / Divisin

    % Resto, regresa el residuo de la divisin entera (no puede ser usado

    con variables flotantes

    ++ Como prefijo Incrementa en uno el valor de la variable antes de

    evaluar la expresin. Como Postfijo suma en uno la variable despusde ser evaluado la expresin.

    -- Como prefijo decrementa en uno el valor de la variable antes de

    evaluar la expresin. Como Postfijo resta en uno la variable despus

    de ser evaluado la expresin.

  • 8/12/2019 practicas con pic 16f877a

    59/160

    Luces con desplazamiento (programa 2)

    void main ( void ){ unsigned short dato;

    TRISD = 0;

    dato = 1;

    while ( 1 ){

    PORTD = dato;Delay_ms (250);dato = dato * 2;

    if ( dato == 0 )dato = 0x01;}

    }

  • 8/12/2019 practicas con pic 16f877a

    60/160

    Ejercicios propuestos 4

    1. El alumno realizara un programa que enve alpuerto C los siguientes valores utilizando paragenerarlas, las instrucciones de desplazamientoy/o aritmticas.

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

    2. Lo mismo que el ejercicio anterior con la siguientesecuencia:

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

  • 8/12/2019 practicas con pic 16f877a

    61/160

    Acceso 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 F7el bit mas significativo.

    Ejemplo:

    // Si RB0 es uno, colocar en uno la terminal RC0:if ( PORTB.F0 )

    PORTC.F0 = 1;

    Los Identificadores F0F7 no se reconocen en minsculas.

  • 8/12/2019 practicas con pic 16f877a

    62/160

    5.- Secuencias condicionadas ( problema)

    Realizar un programa que enve secuencias

    distintas al puerto D, dependiendo del valor de la

    terminal RA0. Si RA0 es igual a cero se enva laserie de dos bits desplazados hacia la izquierda,

    mientras que si RA0 es igual a 1 entonces se

    enva la serie de tres bits desplazados hacia la

    derecha.

  • 8/12/2019 practicas con pic 16f877a

    63/160

    Secuencias condicionadas (algoritmo)

    1. Configuracin de puertos

    2. Inicia contador

    3. Si RA0 es igual a 0 entonces enva secuencia_izquierda

    4. De lo contrario enva secuencia_derecha

    5. Incrementa contador

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

    7. Regresa a 3

  • 8/12/2019 practicas con pic 16f877a

    64/160

    Secuencias condicionadas (diagrama de flujo)Luces

    Configura puertos

    RD salida, RA entrada

    Limpia contador

    Enva

    secuencia_izquierda

    Incrementa

    contador

    Contador = 10 Limpia

    contador

    si

    no

    RA0 = 0

    Enva

    Secuencia_derecha

    si

    no

  • 8/12/2019 practicas con pic 16f877a

    65/160

    Secuencias condicionadas (programa)

    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 )PORTD = izquierda [ contador];

    elsePORTD = derecha [ contador];

    contador + + ;

    If ( contador = = 10 )contador = 0;

    }}

  • 8/12/2019 practicas con pic 16f877a

    66/160

    Ejercicios propuestos 5

    1. El alumno desarrollara un programa que enve

    una secuencia de nmeros BCD a un display de

    7 segmentos ubicados en el puerto D. Si la

    terminal RA1 ubicada en el puerto A, es igual a

    0, la numeracin debe ser incremental; en caso

    contrario debe decrementarse.

  • 8/12/2019 practicas con pic 16f877a

    67/160

    Ejercicios propuestos 5 (esquemtico)

    MOTOR A PASOS

  • 8/12/2019 practicas con pic 16f877a

    68/160

    MOTOR A PASOS 1

    Unipolar.- Tiene 4 bobinas independientes (A, B, C, D) y

    una terminal comn a todas ellas.

    MOTOR A PASOS 2

  • 8/12/2019 practicas con pic 16f877a

    69/160

    MOTOR A PASOS 2

    Unipolar.- Tiene 4 bobinas independientes (A, B, C, D) y dos

    terminales comunes.

    MOTOR A PASOS 2

  • 8/12/2019 practicas con pic 16f877a

    70/160

    MOTOR A PASOS 2

    Bipolar.- Tiene 2 bobinas (A C, B D)

    Secuencias de activacin 1

  • 8/12/2019 practicas con pic 16f877a

    71/160

    Secuencias de activacin 1

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

    Paso A B C D

    1 1 1 0 0

    2 0 1 1 0

    3 0 0 1 14 1 0 0 1

    Secuencias de activacin 2

  • 8/12/2019 practicas con pic 16f877a

    72/160

    Secuencias de activacin 2

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

    Paso A B C D

    1 1 0 0 0

    2 0 1 0 0

    3 0 0 1 04 0 0 0 1

    Secuencias de activacin 3

  • 8/12/2019 practicas con pic 16f877a

    73/160

    Secuencias de activacin 3

    Unipolar.- Movimiento de 1/2 paso por pulso.

    Paso A B C D

    0.5 1 0 0 0

    1 1 1 0 0

    1.5 0 1 0 0

    2 0 1 1 0

    2.5 0 0 1 0

    3 0 0 1 1

    3.5 0 0 0 1

    4 1 0 0 1

    Secuencias de activacin 4

  • 8/12/2019 practicas con pic 16f877a

    74/160

    Secuencias de activacin 4

    Bipolar.- Movimiento de un paso

    Paso A C B D

    1 1 0 1 0

    2 1 0 0 1

    3 0 1 0 1

    4 0 1 1 0

    Secuencia de activacin 5

  • 8/12/2019 practicas con pic 16f877a

    75/160

    Secuencia de activacin 5

    Paso A C B D

    0.5 1 0 1 0

    1 1 0 0 0

    1.5 1 0 0 1

    2 0 0 0 1

    2.5 0 1 0 1

    3 0 1 0 0

    3.5 0 1 1 0

    4 0 0 1 0

    Bipolar.- Movimiento de medio paso

    d

  • 8/12/2019 practicas con pic 16f877a

    76/160

    Circuito de potencia 1 (motor unipolar )

    C d ( )

  • 8/12/2019 practicas con pic 16f877a

    77/160

    Circuito de potencia 2 (motor unipolar )

    Ci i d i ( )

  • 8/12/2019 practicas con pic 16f877a

    78/160

    Circuito de potencia 3 (motor bipolar )

    Este mismo diagrama se repetira para manejar la segunda bobina

    Ci i d i ( )

  • 8/12/2019 practicas con pic 16f877a

    79/160

    Circuito de potencia x (motor a pasos )

    Circuito integrado UCN 5804 Circuito integrado SAA1042

    Ci i d i ( )

  • 8/12/2019 practicas con pic 16f877a

    80/160

    Circuito de potencia x1 (motor unipolar )

    Ci i d i ( )

  • 8/12/2019 practicas con pic 16f877a

    81/160

    Circuito de potencia x2 (motor bipolar )

    Ej i i

  • 8/12/2019 practicas con pic 16f877a

    82/160

    Ejercicios propuestos 5

    2.- El alumno desarrollara un programa que

    enve la secuencia de activacin de un motor

    a pasos ubicado en el puerto D. Si la

    terminal ubicada en el puerto A, RA6, sea

    igual a 0, el motor debe girar a la derecha,

    en caso contrario debe girar a la izquierda.

    Ej i i t ( )

  • 8/12/2019 practicas con pic 16f877a

    83/160

    Ejercicios propuestos 5 (esquemtico)

    6 Di l d

  • 8/12/2019 practicas con pic 16f877a

    84/160

    6.- Display de 7 segmentos

    Realizar un programa en donde se implemente

    un contador de 00-99 desplegando en un par de

    displays de 7 segmentos. El programa deberealizar la visualizacin utilizando el multiplexaje

    de los datos, utilizando el puerto B como bus de

    datos y las terminales RC0 y RC1 como

    terminales de habilitacin de display.

    Di l d t ( )

  • 8/12/2019 practicas con pic 16f877a

    85/160

    Display de 7 segmentos (algoritmo)

    1. Configurar los puertos, inicializacin de variables (unidades = 0decenas = 0)

    2. Envo de decenas3. Habilitacin de decenas4. Envo de unidades

    5. Habilitacin de unidades6. Incremento de unidades7. Si unidades mayor de 9entonces 98. Sigue 29. Unidades = 010. Incrementa decenas

    11. Si decenas mayor de 9entonces 1212. Sigue 213. Decenas=014. Sigue 2

    Di l d t ( )

  • 8/12/2019 practicas con pic 16f877a

    86/160

    Display de 7 segmentos(diagrama de flujo)

    Configura puertos

    Inicia variables

    Display

    Enva decenaEnva unidad

    Incrementa unidad

    Unidades>9

    Limpia unidades

    Incrementa decenas

    Decenas>9

    Limpia decenassi

    si

    no

    no

    Di l d t ( )

  • 8/12/2019 practicas con pic 16f877a

    87/160

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

    void main ( void ) // Programa principal

    {

    TRISB = 0; // Configuracin de puertos

    TRISC = 0;

    unidades = decenas = 0; // Inicializacin de variables

    while ( 1 ) // Programa de usuario

    {

    PORTB = numero [ decenas ]; // Enva decenas

    PORTC.F0 = 1; // Habilita el display de decenas

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

    PORTB = numero [ unidades ]; // Enva unidades

    PORTC.F1 = 1; // Habilita el display de decenas

    delay-ms( 10 );

    PORTC.F1 = 0;

    unidades++; // Incrementa unidades

    if ( unidades > 9)

    {

    unidades = 0; // Reinicia unidades

    decenas++; // Incrementa decenas

    if ( decenas > 9)

    {

    decenas = 0; // Reinicie decenas

    }

    }

    }

    }

    Displa de segmentos ( )

  • 8/12/2019 practicas con pic 16f877a

    88/160

    Display de 7 segmentos ( esquemtico )

    Ej i i t 6 ( )

  • 8/12/2019 practicas con pic 16f877a

    89/160

    Ejercicio propuesto 6 (d7seg)

    El alumno modificara el programa elaborado de

    tal forma que se cambie el incremento por

    decremento, al usar un interruptor. Si elinterruptor esta apagado el conteo ser

    incremental, en caso contrario, el conteo ser

    decremental. El interruptor estar ubicado en la

    terminal RE0 del puerto E.

    Ej i i t 6 ( )

  • 8/12/2019 practicas con pic 16f877a

    90/160

    Ejercicio propuesto 6 (esquemtico)

    Di l d i t l li id

  • 8/12/2019 practicas con pic 16f877a

    91/160

    Display de cristal liquido

    LCD ( )

  • 8/12/2019 practicas con pic 16f877a

    92/160

    LCD (funciones bus 8 bits)

    Lcd8_Config

    Lcd8_Init

    Lcd8_Out

    Lcd8_Out_Cp

    Lcd8_Chr

    Lcd8_Chr_Cp

    Lcd8_Cmd

    L d8 C fi

  • 8/12/2019 practicas con pic 16f877a

    93/160

    Lcd8_Config

    Descripcin: Inicializa el LCD usando un bus de datos de 8 bits. Los puertos deControl (ctrlport) y Datos (dataport) usan la asignacin de terminalesespecificada.

    voidLcd8_Config( unsigned short*ctrlport,unsigned short*dataport,

    unsigned shortRS,

    unsigned shortEN,unsigned shortWR,

    unsigned shortD7,

    unsigned shortD6,

    unsigned shortD5,

    unsigned shortD4,

    unsigned shortD3,unsigned shortD2,

    unsigned shortD1,

    unsigned shortD0 );

    Lcd8 Config 2

  • 8/12/2019 practicas con pic 16f877a

    94/160

    Lcd8_Config 2Ejemplo:

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

    Lcd8 Init

  • 8/12/2019 practicas con pic 16f877a

    95/160

    Lcd8_Init

    Descripcin: Inicializa el LCD usando un bus de 8 bits. Lospuertos de Control (ctrlport) y Datos (dataport) usan lasiguiente asignacin de terminales.-

    E ctrlport.3

    RS ctrlport.2R/W ctrlport.0

    D7 dataport.7D6 dataport.6D5 dataport.5D4 dataport.4D3 dataport.3D2 dataport.2

    D1 dataport.1D0 dataport.0

    voidLcd8_Init(unsigned short*ctrlport, unsigned short*dataport);

    Lcd8_Init 2

  • 8/12/2019 practicas con pic 16f877a

    96/160

    Ejemplo:

    Lcd8_Init(&PORTB, &PORTC);

    Lcd8 Out

  • 8/12/2019 practicas con pic 16f877a

    97/160

    Lcd8_Out

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

    voidLcd8_Out( unsigned shortrow,unsigned shortcol,

    char*text );

    Ejemplo:-Imprime Hello!en el LCD en la linea 1, columna 3

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

    Lcd8 Out Cp

  • 8/12/2019 practicas con pic 16f877a

    98/160

    Lcd8_Out_Cp

    Descripcin: Imprime mensaje en el LCD en la posicin

    actual del cursor.

    voidLcd8_Out_Cp(char*text);

    Ejemplo: Imprime Here!en la posicin actual del cursor

    Lcd8_Out_Cp("Here!");

    Lcd8 Chr

  • 8/12/2019 practicas con pic 16f877a

    99/160

    Lcd8_Chr

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

    voidLcd8_Chr(unsigned shortrow,

    unsigned shortcol,

    charcharacter );

    Ejemplo: Imprime la letra ien el LCD en la lnea 2,ycolumna 3

    Lcd8_Out(2, 3, 'i');

    Lcd8 Chr Cp

  • 8/12/2019 practicas con pic 16f877a

    100/160

    Lcd8_Chr_Cp

    Descripcin: Imprime un caracter en el LCD en la posicin

    actual del cursor.

    voidLcd8_Chr_Cp(charcharacter);

    Ejemplo: Imprime la letra een la posicin actual del

    cursor

    Lcd8_Chr_Cp('e');

    Lcd8 Cmd

  • 8/12/2019 practicas con pic 16f877a

    101/160

    Lcd8_Cmd

    Descripcin: Enva un comando al LCD. Se puede

    pasar a la funcin una de las constantes predefinidas.

    voidLcd8_Cmd(unsigned shortcommand);

    Ejemplo: Limpia el LCD

    Lcd8_Cmd(LCD_CLEAR);

    Comandos predefinidos

  • 8/12/2019 practicas con pic 16f877a

    102/160

    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

    7 LCD 8 BITS

  • 8/12/2019 practicas con pic 16f877a

    103/160

    7.- LCD 8 BITS

    Disear el programa que inicialice un LCD,

    usando un bus de datos de 8 bits, y a

    continuacin mande un mensaje de

    bienvenida. El mensaje debe desplazarse

    hacia la izquierda en forma continua.

    LCD 8 BITS ( )

  • 8/12/2019 practicas con pic 16f877a

    104/160

    LCD 8 BITS (algoritmo)

    1. Inicialice los puertos de datos y control.

    2. Enva mensaje a desplegar.

    3. Enva comando de desplazamiento hacia la

    izquierda.

    4. Repite el paso 3.

    LCD 8 BITS (d d fl )

  • 8/12/2019 practicas con pic 16f877a

    105/160

    LCD 8 BITS (diagrama de flujo)

    Inicializa puertos de

    datos y control

    Enva mensaje

    Enva comando de

    Corrimiento a la izq.

    LCD 8 bits

    LCD 8 BITS ( )

  • 8/12/2019 practicas con pic 16f877a

    106/160

    LCD 8 BITS (esquemtico)

    LCD 8 BITS ( )

  • 8/12/2019 practicas con pic 16f877a

    107/160

    LCD 8 BITS (programa 1)

    Void main(void){ TRISB = 0;

    TRISC = 0;

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

    Lcd8_Out(1,1,Hola mundo cruel);

    while(1){

    Lcd8_Cmd(LCD_SHIFT_LEFT);Delay_ms(100);}

    }

    LCD 8 BITS ( )

  • 8/12/2019 practicas con pic 16f877a

    108/160

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

    void main(void){ TRISB = 0;

    TRISC = 0;

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

    Lcd8_Out(1,1,mensaje);

    while(1){

    Lcd8_Cmd(LCD_SHIFT_LEFT);Delay_ms(500);}

    }

    LCD 8 BITS ( ti )

  • 8/12/2019 practicas con pic 16f877a

    109/160

    LCD 8 BITS (esquemtico)

    LCD 8 BITS ( )

  • 8/12/2019 practicas con pic 16f877a

    110/160

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

    }

    }

    Ejercicios propuestos 7

  • 8/12/2019 practicas con pic 16f877a

    111/160

    Ejercicios propuestos 7

    1. Programa que forme la palabra HOLAen un LCD,

    configurado para utilizar un bus de 8 bits. Las letras deben

    desplazarse de derecha a izquierda. Primero debe aparecer

    la H, moviendose desde la derecha a la primer columna a la

    izquierda. Enseguida debe aparecer la O, tambien saliendo

    de la derecha y terminando a la derecha de la letra H. Lo

    mismo debe suceder para las letras L y A. El programa debe

    ser ciclico.

    Ejercicio propuesto 8

  • 8/12/2019 practicas con pic 16f877a

    112/160

    j p p

    H

    H

    H O

    H

    O

    O

    H

    H

    HO

    H O L A

    L

    .

    .

    .

    LCD (f nciones b s bits)

  • 8/12/2019 practicas con pic 16f877a

    113/160

    LCD (funciones bus 4 bits)

    Lcd_Config

    Lcd_Init

    Lcd_Out

    Lcd_Out_Cp

    Lcd_Chr

    Lcd_Chr_Cp

    Lcd_Cmd

    Lcd Config

  • 8/12/2019 practicas con pic 16f877a

    114/160

    Lcd_Config

    Descripcin: Inicializa LCD usando un bus de datos de 4bits. El puerto de Control (ctrlport) y Datos (dataport) tienelas asignaciones de terminales especificadas.

    voidLcd_Config( unsigned short*ctrl_data_port,unsigned shortRS,unsigned shortEN,unsigned shortWR,unsigned shortD7,

    unsigned shortD6,unsigned shortD5,

    unsigned shortD4 );

    Lcd_Config 2

  • 8/12/2019 practicas con pic 16f877a

    115/160

    g

    Ejemplo:

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

    Lcd Init

  • 8/12/2019 practicas con pic 16f877a

    116/160

    Lcd_Init Descripcin: Inicializa el LCD usando un bus de 4

    bits. El puerto de Control (ctrlport) y Datos(dataport) tiene la siguiente asignacin determinales.-

    E ctrl_data_port.3

    RS ctrl_data_port.2D7 ctrl_data_port.7

    D6 ctrl_data_port.6

    D5 ctrl_data_port.5

    D4 ctrl_data_port.4

    voidLcd_Init(unsigned short*ctrl_data_port);

    Lcd Init 2

  • 8/12/2019 practicas con pic 16f877a

    117/160

    Lcd_Init 2Ejemplo:

    Lcd_Init(&PORTB);

    Lcd Out

  • 8/12/2019 practicas con pic 16f877a

    118/160

    Lcd_Out

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

    voidLcd_Out( unsigned shortrow,unsigned shortcol,

    char*text );

    Ejemplo:-Imprime Hello!en el LCD en la lnea 1, columna 3

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

    Lcd Out Cp

  • 8/12/2019 practicas con pic 16f877a

    119/160

    Lcd_Out_Cp

    Descripcin: Imprime mensaje en el LCD en la posicin

    actual del cursor.

    voidLcd_Out_Cp(char*text);

    Ejemplo:

    - Imprime Here!en la posicin actual del cursor

    Lcd_Out_Cp("Here!");

    Lcd Chr

  • 8/12/2019 practicas con pic 16f877a

    120/160

    Lcd_Chr

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

    voidLcd_Chr( unsigned shortrow,unsigned shortcol,

    charcharacter );

    Ejemplo:- Imprime la letra ien el LCD en la lnea 2,y columna 3

    Lcd_Out(2, 3, 'i');

    Lcd Chr Cp

  • 8/12/2019 practicas con pic 16f877a

    121/160

    Lcd_Chr_Cp

    Descripcin: Imprime un caracter en el LCD en la posicin

    actual del cursor.

    voidLcd_Chr_Cp(charcharacter);

    Ejemplo:

    - Imprime la letra een la posicin actual del cursor

    Lcd_Chr_Cp('e');

    Lcd Cmd

  • 8/12/2019 practicas con pic 16f877a

    122/160

    Lcd_Cmd

    Descripcin: Enva un comando al LCD. Se puede pasar a lafuncin una de las constantes predefinidas. Los comandosson los mismos para ambos modos de manejo del LCD (bus 8o 4 bits).

    voidLcd_Cmd(unsigned shortcommand);

    Ejemplo:

    - Apaga el cursor, no aparece en el LCD

    Lcd_Cmd(LCD_CURSOR_OFF);

    8.- LCD 4 BITS

  • 8/12/2019 practicas con pic 16f877a

    123/160

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

    LCD 4 BITS (algoritmo)

  • 8/12/2019 practicas con pic 16f877a

    124/160

    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.

    LCD 4 BITS (diagrama de flujo)

  • 8/12/2019 practicas con pic 16f877a

    125/160

    LCD 4 BITS (diagrama de flujo)

    Inicializa puertos de

    datos y control

    Enva mensaje

    Enva comando de

    Corrimiento a la der.

    LCD 8 bits

    LCD 4 BITS (esquemtico Config)

  • 8/12/2019 practicas con pic 16f877a

    126/160

    LCD 4 BITS (esquemtico Config)

    LCD 4 BITS (programa 1)

  • 8/12/2019 practicas con pic 16f877a

    127/160

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

    }}

    LCD 4 BITS (programa 2)

  • 8/12/2019 practicas con pic 16f877a

    128/160

    LCD 4 BITS (programa 2)

    char mensaje[11]={B, u, s, , 4, , b, i, t, s, \0};

    void main(void){ TRISD = 0;

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

    Lcd_Out(1, 6, mensaje);

    while(1){

    Lcd_Cmd(LCD_SHIFT_RIGHT);Delay_ms(200);

    }}

    LCD 4 BITS (esquemtico Init)

  • 8/12/2019 practicas con pic 16f877a

    129/160

    LCD 4 BITS (esquemtico Init)

    LCD 4 BITS (programa 3)

  • 8/12/2019 practicas con pic 16f877a

    130/160

    C 4 S (p g 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);

    }

    }

    Conversin de tipo de datos

  • 8/12/2019 practicas con pic 16f877a

    131/160

    p

    Tipo de dato a cadena

    ByteToStr

    ShortToStr

    WordToStr

    IntToStr

    LongToStr

    FloatToStr

    ByteToStr

  • 8/12/2019 practicas con pic 16f877a

    132/160

    y

    Descripcion: Crea una cadena de salida de un pequeo numero sinsigno (valor numrico menos a 0x100). La cadena esta ajustada aun ancho de 3 caracteres; Las posiciones a la izquierda que no seusan en la conversin se rellenan con espacios.

    voidByteToStr(unsigned shortnumber, char*output);

    Ejemplo:

    unsigned shortt = 24;

    char*txt= ; //se inicializa un apuntador a 4 espacios

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

    ShortToStr

  • 8/12/2019 practicas con pic 16f877a

    133/160

    Descripcin: Crea una cadena de salida de un numero pequeocon signo (valor numrico menor a 0x100). La cadena estaajustada a un ancho de 4 caracteres; Las posiciones a laizquierda que no se usan en la conversin se rellenan conespacios.

    voidShortToStr(shortnumber, char*output);

    Ejemplo:shortt = -4;

    char*txt= ; //Se inicializa un apuntador de 5 espacios

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

    WordToStr

  • 8/12/2019 practicas con pic 16f877a

    134/160

    Descripcin: Crea una cadena de salida de un numero sin signo(Valor numrico de una variable unsigned). La cadena estaajustada a un ancho de 5 caracteres; Las posiciones a laizquierda que no se usan en la conversin se rellenan conespacios.

    voidWordToStr(unsignednumber, char*output);

    Ejemplo:unsignedt = 437;

    char*txt= ; // Inicializa un apuntador con 6 espacios

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

    IntToStr

  • 8/12/2019 practicas con pic 16f877a

    135/160

    Descripcin: Crea una cadena de salida de un numero con signo(Valor numrico de una variable int). La cadena esta ajustada a unancho de 6 caracteres; Las posiciones a la izquierda que no se usanen la conversin se rellenan con espacios.

    voidIntToStr(intnumber, char*output);

    Ejemplo:intj = -4220;

    char*txt= ; //Inicializa un apuntador con 6 espacios

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

    LongToStr

  • 8/12/2019 practicas con pic 16f877a

    136/160

    g

    Descripcin: Crea una cadena de salida de un numero largo con signo(Valor numrico de una variable long). La cadena esta ajustada aun ancho de 11 caracteres; Las posiciones a la izquierda que no seusan en la conversin se rellenan con espacios.

    voidLongToStr(longnumber, char*output);

    Ejemplo:longjj = -3700000;char*txt= ; // Inicializa un apuntador con 12 espacios

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

    FloatToStr

  • 8/12/2019 practicas con pic 16f877a

    137/160

    Descripcin: Crea una cadena de salida de un numero de puntoflotante. La cadena contiene un formato normalizado de unnumero (mantisa entre 0 y 1) con signo en la primera posicin. Lamantisa esta ajustada a un formato de 6 dgitos, 0.ddddd; Haysiempre 5 dgitos a continuacin del punto decimal.

    voidFloatToStr(floatnumber, char*output);

    Ejemplo:floatff = -374.2;

    char*txt= ; // Inicializa un apuntador con 14 espacios

    FloatToStr(ff, txt); // txt es "-0.37420e3"

    9.- Contador 0-9 (problema)

  • 8/12/2019 practicas con pic 16f877a

    138/160

    9 9 ( )

    Se quiere un programa que visualice un

    conteo de 0 a 9 en un LCD.

    Contador 0-9 (algoritmo)

  • 8/12/2019 practicas con pic 16f877a

    139/160

    9 ( )

    1. Configura el LCD

    2. Inicializa el contador

    3. Convierte a ASCII el valor del contador

    4. Enva valor en ASCII al LCD

    5. Incrementa el contador

    6. Regresa a 3

    Contador 0-9 (diagrama de flujo)

  • 8/12/2019 practicas con pic 16f877a

    140/160

    9 ( )teclado

    Inicializa puertos

    (LCD)

    Convierte contador

    a ASCII

    Enva a LCD

    ASCII

    Incrementacontador

    Inicializa contador

    Contador 0-9 (programa)

  • 8/12/2019 practicas con pic 16f877a

    141/160

    9

    void main(void){ unsigned short contador;char cadena[ 5 ] = ;

    TRISD = 0;

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

    contador = 0;

    Lcd_Out(1,1,Contador 0-9);

    while(1){

    ShortToStr ( contador , cadena );

    Lcd_Out ( 2 , 8 , cadena );contador ++;Delay_ms(500);

    }}

    Contador 0-9 (esquemtico)

  • 8/12/2019 practicas con pic 16f877a

    142/160

    9

    Contador 0-9 (funcionamiento)

  • 8/12/2019 practicas con pic 16f877a

    143/160

    9

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

    Ejercicio propuesto 8

  • 8/12/2019 practicas con pic 16f877a

    144/160

    j p p

    1. Programa que utilice un LCD, configurado parausar un bus de 8 bits. En el LCD deben aparecer enforma secuencial, los nmeros de la secuencia 1 24 8 16 32 64 128 256 512 1024 2048

    4096 8192 16384 - 32768. Los numero deben sergenerados por operaciones aritmticas. Eldesplegado debe hacerse de la forma mostrada enlas siguientes figuras. Se utiliza la segunda fila,presentando hasta 3 numeros consecutivos, unnumero a la izquierda, uno mas al centro y otro a laderecha.

    Ejercicio propuesto 8

  • 8/12/2019 practicas con pic 16f877a

    145/160

    j p p

    Serie de numeros Serie de numeros

    1

    Serie de numeros

    1 2

    Serie de numeros

    1 2 4

    Serie de numeros

    8

    Serie de numeros

    8 16

    Serie de numeros

    8 16 32

    Serie de numeros

    8192 16384 32768. . .

  • 8/12/2019 practicas con pic 16f877a

    146/160

    Ejercicio propuesto 9

  • 8/12/2019 practicas con pic 16f877a

    147/160

    Contador 00-99 cada 500 mseg

    00

    Contador 00-99 cada 500 mseg

    01

    Contador 00-99 cada 500 mseg

    02

    Contador 00-99 cada 500 mseg

    03

    Contador 00-99 cada 500 mseg

    04

    Contador 00-99 cada 500 mseg

    05

    Contador 00-99 cada 500 mseg

    06

    Contador 00-99 cada 500 mseg

    99. . .

    Teclado matricial (esquemtico)

  • 8/12/2019 practicas con pic 16f877a

    148/160

    Teclado matricial (funciones)

  • 8/12/2019 practicas con pic 16f877a

    149/160

    Keypad_Init

    Keypad_Read

    Keypad_Released

    Keypad_Init

  • 8/12/2019 practicas con pic 16f877a

    150/160

    Descripcin: Inicializa el puerto para trabajar con el teclado.Las terminales del teclado deben estar conectadas de lasiguiente forma:

    port.F0 columna 1

    port.F1 columna 2

    port.F2 columna 3

    port.F3 columna 4

    port.F4 fila 1

    port.F5 fila 2

    port.F6 fila 3port.F7 fila 4

    voidKeypad_Init(unsigned*port);

    Keypad_Init 2

  • 8/12/2019 practicas con pic 16f877a

    151/160

    Ejemplo:

    Keypad_Init(&PORTB);

    Keypad_Read

  • 8/12/2019 practicas con pic 16f877a

    152/160

    Descripcin: Verifica si alguna tecla fue presionada. La funcin regresa1 a 12, dependiendo la tecla presionada, o 0 si no existe tecla presionada.

    1 1

    2 2

    9 9

    * 100 11

    # 12

    unsigned shortKeypad_Read(void);

    Ejemplo:kp = Keypad_Read();

    Keypad_Released

  • 8/12/2019 practicas con pic 16f877a

    153/160

    Descripcin: La llamada a la funcin Keypad_Released es una funcin blocking

    call: La funcin espera hasta que cualquier tecla sea presionada y liberada. Cuando se

    libera, la funcin regresa de 1 a 12, dependiendo de la tecla presionada.

    unsigned shortKeypad_Released(void);

    Ejemplo:

    Keypad_Released();

    10.- Teclado matricial (problema)

  • 8/12/2019 practicas con pic 16f877a

    154/160

    Se desea un programa con el cual se muestre

    en un LCD (bus 8 bits en puerto B y puerto C

    como control) la tecla presionada en un

    teclado matricial (puerto D).

    Teclado matricial (algoritmo)

  • 8/12/2019 practicas con pic 16f877a

    155/160

    1. Configuracin de puertos (teclado y lcd).

    2. Lectura de teclado

    3. Conversin a ASCII

    4. Envo al LCD

    5. Regresar a 2

    Teclado matricial (diagramas de flujo)

  • 8/12/2019 practicas con pic 16f877a

    156/160

    teclado

    Inicializa puertos

    (LCD y teclado)

    Lee teclado

    Convierte a ASCII

    Enva a LCD

    Teclado matricial (esquemtico)

  • 8/12/2019 practicas con pic 16f877a

    157/160

    Teclado matricial (programa)unsigned short kp cnt;

  • 8/12/2019 practicas con pic 16f877a

    158/160

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

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

    case 11: kp = 48;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);}

    Ejercicio propuesto 9

  • 8/12/2019 practicas con pic 16f877a

    159/160

    1. El alumno realizara un programa que tome 3

    nmeros desde un teclado matricial, los guarde

    en un arreglo, los convierta a un numero que se

    guarde en una variable tipo entera. Con este

    numero el alumno deber proporcionar el

    producto por 2 y divisin entre 2 resultantes.Visualizando los resultados en un LCD.

    Ejercicio propuesto 9

  • 8/12/2019 practicas con pic 16f877a

    160/160

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

    025

    Cual es el numero de 3 cifras:

    025

    El producto por 2 es: 050

    Cual es el numero de 3 cifras:

    025

    El producto por 2 es: 050La divisin entre 2 es: 012