Sunteți pe pagina 1din 3

AVRs

Arduino

Proyectos

Robtica

Recursos

PICs

Foro

cursomicros.com
Contenido
ProgramacindeMicrocontroladores

ElCompiladorBoostC>Prctica3

Prctica3
El compilador BoostC/C++ Prctica1Creacindeun proyecto en BoostC Prctica2 Prctica3 Prctica4

Enestaprcticaseguiremosusandolas sentencias selectivas (if else en este caso) y tambinveremos la forma de manejar los arrays unidimensionales para trabajar con matrices de datos en operaciones que en ensambladorlasresolvamosmediante l a s tablas(debsqueda). El programa visualiza un contador hexadecimal que avanza de 0 a 15 en modo ascendente si un switch conectado al pin RA2 marca un 1 lgico.Elcontadoravanzaenmodo descendente si el switchmarca0lgico.

El Circuito

El circuito.

Elcdigofuente

//**************************************************************************** // FileName: HexCounter.c // Processor: PIC16F84A // Compiler: BoostC // Purpose: Sentencia if-else, array constante en BoostC. //**************************************************************************** #include <system.h> #pragma #pragma DATA _CONFIG, CLOCK_FREQ _XT_OSC & _WDT_OFF & _PWRTE_ON

4000000 // switch esta conectado a RA2 // Cima de conteo es 12 = 0x0C // Array constante almacenado en rom (FLASH)

#define swich #define Top

porta.2 12 =

rom char * Code7seg { 0b00111111, 0b00000110, 0b01011011,

// 7-segment code of 0. Format: 0bxgfedcba , x=don't care // 7-segment code of 1. ... // 7-segment code of 2

0b01001111, 0b01100110, 0b01101101, 0b01111101, 0b00000111, 0b01111111, 0b01101111, 0b01110111, 0b01111100, 0b00111001, 0b01011110, 0b01111001, 0b01110001, };

// // // // // // // // // // // // //

7-segment 7-segment 7-segment 7-segment 7-segment 7-segment 7-segment 7-segment 7-segment 7-segment 7-segment 7-segment 7-segment

code code code code code code code code code code code code code

of of of of of of of of of of of of of

3 4 5 6 7 8 9 A B C D E F

void main() { unsigned char Count; trisb = 0x00; trisa.2 = 1; if(swich) Count = 0; else Count = Top;

// Declara variable Count // Salida para display // Pin RA2 entrada // Si swich vale 1, iniciar desde 0 (modo asc) // De lo contrario, iniciar desde Top (modo desc)

while(1) // Bucle infinito { portb = Code7seg[Count]; delay_ms(250); delay_ms(250); if (swich) // Si swich vale 1, ejecutar sig. { if (Count < Top) // Si Count < Top Count++; // Incrementar Count else Count = 0; // De lo contrario, reiniciar } else // De lo contrario, ejecutar sig. { if (Count) // Si Count > 0 Count--; // Decrementar Count else Count = Top; // De lo contrario, reiniciar } } } bloque

Count bloque

Count

Descripcindelprograma
Hay cuatro temas que voy a tocar sobre este programa. El primero es la directiva #define. Nosotros yasabemoscmofunciona:sustituyeelidentificadorporeltextosubsiguiente. En Cexisteademslaposibilidadderealizarconstruccionesmuchomscomplejas, pero la formatpicadeusarlasescomoyasabemos. Pasando al siguiente punto: la sentencia if else ejecuta uno de dos bloques de sentencias, segnlacondicinverdadero-falsadeunaexpresin.Esmuyfcilentenderestacondicin enunaexpresincomo:
if (Count < Top) // Si Count < Top

Laexpresinentreparntesisser verdadera cuando Count sea menor que Top. Qu novedad!...Ahorabien,cmoseevalaestaexpresin


if (swich) // Si swich vale 1, ejecutar sig. bloque

o esta otra?
if (Count) // Si Count > 0

Conquvaloressecomparanswich y count?Bien,enCunaexpresinnorelacional(con operadores decomparacincomo>, <, ==,etc.)serverdaderasiesdiferentedecero o, dicho de otraforma,soloserfalsasivale0yencualquierotrocasoserverdadera. Claro que para evitar las dudas estas sentencias bien se pudieron haber escrito empleando los operadores igual (==), diferente (!=)uotros,as:
if (swich != 0) // ... if (Count > 0) // Si swich es diferente 0,... // Si Count > 0,...

Pero a los programadores de C nos daperezatipearmscdigodelonecesario.Quiz este estilo te disguste en uninicioperoprontoestarsdeacuerdoconnosotros.Nolo olvides: unaexpresinnorelacionalsimpleesverdaderasivalediferentede0yesfalsa cuando vale 0. El tercer tema era el array Code7seg. Esta forma de declarar los Arrays constantes, con la palabra reservada rom yelasterisco,espropiadelcompiladorBoostCasquenole busquemos mayorlgicaporquevaavariarenotrocompilador.
rom char * Code7seg = // Array constante almacenado en rom (FLASH) { 0b00111111, // 7-segment code of 0. Format: 0bxgfedcba , x=don't care // ... 0b01110001, // 7-segment code of F };

Nota que los elementos deben ir separados por comas; de modo que no es necesario que vayaunoporcadalnea.Loescribassoloparaquesedistinganmejor. Loquenodeberavariarenningn compilador C es el acceso a los elementos del array, mediante corchetes endices.Aslasentencia
portb = Code7seg[Count];

envaalpuertoBelelementonmeroCount del array Code7seg. En C el primer elemento siempre es el 0. Finalmente, pasemos al cuarto punto: el tipo de dato ideado para trabajar connmeros enterosenelCestndaresint (entero de 16 bits con signo, suficiente para alojar la gran mayoradelosdatosprocesadosenun programa). Sin embargo, en el mundo de los Cs la RAM no es un recurso que se caracterice por abundar. Es por eso que se muchas veces se suele usar el tipo char, que fue inicialmente concebido para almacenar caracteres (characters) ASCII (de 8 bits), como a, 5 , #, etc. A este tipo selehanaadidolosespecificadoressigned (con signo) y unsigned (sin signo) para formar los tipos: signed char establece variables enteras de 8 bits con signo (desde 128 hasta +127). unsigned char establece variables enteras de 8 bits sin signo (desde 0 hasta 255). chartambinsepuedeusarparaalmacenarnmeros,perofuncionarambiguamente,a veces como signed char y otras como unsigned char,segnelcompiladorentreotras cosas. Silosdatosusadosenelprogramanorequierenformato,sepodrnusarlostrestipos indistintamente sin que funcione mal y sin que el compilador sedcuenta. Sinembargo,silasvariablesvanatrabajarcomonmerosenoperacionesaritmticaso relacionalesdecomparacin,sernecesarioaplicarleselsigned o unsigned respectivo.

Anterior

Siguiente

Trminosdeuso&Deslinde Copyright 2009-2013 by cursomicros.com

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