pic16f877 con mikroc [modo de compatibilidad]

Post on 20-Apr-2015

250 Views

Category:

Documents

19 Downloads

Preview:

Click to see full reader

DESCRIPTION

Pic16f877

TRANSCRIPT

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

microcontroladores PIC

PIC16F877PIC16F877

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

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.

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 )

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

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

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.

A it t i tArquitectura interna

T i l fi iTerminales fisicas

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

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

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

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

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

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

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

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

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 */

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

R i t i dRegistros asociados

Entrada/salida Configuración

• PORTA TRISA

• PORTB TRISB

• PORTC TRISC

• PORTD TRISD

• PORTE TRISE

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.

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.

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;

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;

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;

ADCON1ADCON1

ADCON1 = 0 0 0 0 0 1 1 0

ADCON1 = 6 ;

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 */

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

}}

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

}}

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

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.

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

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

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

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

}}}

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

}}}

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.

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

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

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

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

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

}}

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

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

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

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.

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

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.

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

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

}}

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

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.

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 */

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.

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.

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

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;

}}

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.

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;

}}}

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

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. 

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.

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

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

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;

}}}

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.

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

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.

MOTOR A PASOS 2MOTOR A PASOS 2

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

MOTOR A PASOS 2MOTOR A PASOS 2

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

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

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

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

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

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

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

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

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

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

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

Circuito integrado UCN 5804 Circuito integrado SAA1042

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

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

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.

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

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.

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

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

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}

}

}}

}

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

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.

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

Di l d i t l li idDisplay de cristal liquido

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

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

L d8 C fi 2Lcd8_Config 2Ejemplo:Ejemplo:

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

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

Lcd8_Init 2_Ejemplo:

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

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

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

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

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

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

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

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.

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.

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.

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

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

}}} 

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

}} 

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

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

}}} 

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.

Ejercicio propuesto 8Ejercicio propuesto 8

H H O HO L

H OH

.H OH .

.

H O L AH OH H O L A

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

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

Lcd Config 2Lcd_Config 2Ejemplo:Ejemplo:

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

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

L d I it 2Lcd_Init 2Ejemplo:Ejemplo:

Lcd_Init(&PORTB);

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

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

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

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

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

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.

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.

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.

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

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

}}} 

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

}}} 

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

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

}}} 

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

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

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 )

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)

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)

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)

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"

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.

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

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

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

}} 

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

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

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.

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

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.

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

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

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

• Keypad_Init

• Keypad Read• Keypad_Read

• Keypad ReleasedKeypad_Released

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

K d I it 2Keypad_Init 2Ejemplo:

Keypad_Init(&PORTB);

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

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

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

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

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

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

AHS1

Diapositiva 157

AHS1 TEC, 08-02-2006

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

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.

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

top related