Está en la página 1de 12

El ANSI C se ha convertido en el lenguaje de alto nivel estándar para programar microcontroladores

PICS. El C fue desarrollado en los Laboratorios Bell a principios de los años 70, por Dennis Ritchie y
Brian Kernighan. Programar en C presenta numerosas ventajas si se le compara a la programación en
lenguaje ensamblador.

C permite definir variables enteras ó de punto flotante, cuenta con librerías para realizar todo tipo de
operaciones aritméticas, el manejo de arreglos ó tablas de datos y de strings , el uso de declaraciones
condicionales e iterativas (do/while, for, if/else, switch/case).

La estructura de las funciones, permite transferir parámetros ó argumentos de entrada y salida en forma
directa al llamar a determinada función.

http://www.puntoflotante.net/PORQUE-USAR-LENGUAJE-ANSI-C.htm
PROGRAMACION EN C18 Y HITECH

Si ya no te acuerdas de ansi C, lee C ansi_c.pdf y luego c18 desde cero.


Observe los ejemplos de c18
DEFINICION DE VARIABLES:

name bits range


char 8 -128 to +127
unsigned char 8 0 to 255
int 16 -32,768 to +32,767
unsigned int 16 0 to 65,535
long 32 -2,147,483,648 to +2,147,483,647
unsigned long 32 0 to 4,294,967,295
float 32 3.4e-38 to 3.4e38
double 64 1.7e-308 to +1.7e+308
long double 80 3.4e-4932 to 3.4e+4932

int A; A es un entero de 16 bits


int A = 3; A es entero inicializado en 3
int A, B, C; A, B, y C son enteros
int A=B=C=1; A,B, y C son enteros inicializados en 1
int A[5] = {1,2,3,4,5} A es un arreglo de enteros, valor inicial 1..5. Nota: A[0] =1.

APRENDA C PARA PIC CCS Compiler.doc


APERADORES MATEMATICOS

Name Example Operation


+ 1+2=3 SUMA
- 3-2=1 RESTA
* 2*3=6 MULTIPLICACION
/ 6/3=2 DIVISION
% 5%2=1 MODULO, RESIDUO
++ A++ ASIGNA Y LUEGO INCREMENTA
++A INCREMENTA Y LUEGO ASIGNA
-- A-- ASIGNA Y LUEGO DECREMENTA
-- A DECREMENTA Y LUEGO ASIGNA
& 14 & 7 = 6 AND
| 14 | 7 = 15 OR
^ 14 ^ 7 = 9 XOR
>> 14 >> 2 = 3 ROTA A LA DERECHA
<< 14 << 2 = 56 ROTA A LA IZQUIERDA
! A != B NEGADOR ( * -1)
ESTRUCTURAS BASICAS

IF STATEMENTS
if (condition expression )
{ instrucciones ;
}
Ejemplo:

IF - ELSE
Ejemplo:
Si la entrada PORTA,0 = 0 entonces PORTA,1=1, de lo contrario PORTA,1=0
if ((RA0 == 0)
{RA1= 1;}
Else
{RA1= 0;}

SWITCH (CASE)
switch(value)
{
case value: statement or group of statements;
case value: statement or group of statements;
default: statement or group of statements;
}
Ejemplo: switch (pepe) {
case 0: printf("cmd 0"); break;
    case 1: printf("cmd 1");   break;
    default: printf("bad cmd");            break; }

C ansi_c.pdf pag 35
WHILE LOOPS
while (condition is true)
{
statement or group of statements;
}

DO LOOPS

void main(void)
{
int COUNT;
TRISA = 0xFF;
ADCON1 = 0x06;
TRISB = 0x00;
TRISC = 0x00;
COUNT = 0;

Do
{
if ((RA0 == 0)
{
COUNT += 1;
}
Else
{
COUNT -= 1;
}
PORTC = COUNT & 0x00FF;
PORTB = (COUNT >> 8) & 0x00FF;
} while (1>0);
}
FOR-NEXT

for (valor inicial; condición; pasos)


Example

for (A=1; A<=10; A++)


{
//incremente A desde 1 hasta 10 en pasos de 1
PORTB = A;
}

Muchos ejemplos http://www.puntoflotante.net/TECLADOC.htm


http://www.puntoflotante.net/MODEXPANSION1.htm
Manejo de Bits:

Existen varias maneras de manejar los bits en C, una manera de conseguirlo es asi:

1) Se declaran unas instrucciones (set, clr y vlr) al inicio del programa

#define set(var,bitno) ((var) |= 1 << (bitno)) // var= var or (1 << (bitno)


#define clr(var,bitno) ((var) &= ~(1 << (bitno)))
#define vlr(data,bitno) ((data>>bitno)&0x01)

Y luego dentro del programa se utiliza asi:

Set(pedro,5); ponga en 1 el bit 7 de la variable pedro


Clr(Juan,3); ponga en cero el bit 3 de la vaariable juan
A=vlr(pepe,4); haga A igual al valor del bit 4 de la variable pepe

2) Otra manera es usando las herramientas del compilador

#include <p18c452.h>

PORTCbits.RC0=0;

VER CARPETA C18 1- Manejo de Puertos


3 Usando estructuras

struct RS485_del_com
{
unsigned char procesando :1;
unsigned char finalizo :1;
unsigned char denegada :1;
unsigned char crc16_ok :1;

unsigned char aqui_estoy :1;


unsigned char Variador_1 :1;
unsigned char Variador_2 :1;
unsigned char Variador_3 :1;

unsigned char Sotano_1 :1;


unsigned char Sotano_2 :1;
unsigned char Sotano_3 :1;
unsigned char libre3 :1;

}rs485={0};

Y asi se usa Rs485. denegada=1;


/*******************************************************************

ESCRIBA AQUI LOS COMENTARIOS QUE DESEE


Modelo de un
*********************************************************************/ encabezado para
un programa típico
#include <p18c452.h>
en C18.
/*******************************************************************************************

CONFIGURACION DE HARDWARE
Úselo siempre en
*******************************************************************************************/
sus programas
#pragma config OSC =HS
#pragma config PWRT = ON,BOR = OFF
#pragma config WDT = OFF
#pragma config LVP = OFF
#pragma config CP0 = ON,CP1 = ON,CP2 = ON
#pragma config CPB = ON,CPD = ON
#pragma config WRT0 = ON,WRT1 = ON,WRT2 = ON
#pragma config WRTB = ON,WRTC = ON,WRTD = ON
#pragma config EBTR0 = ON,EBTR1 = ON,EBTR2 = ON
#pragma config EBTRB = ON
/*******************************************************************************************

DEFINICION DE FUNCIONES DE LINEA

*******************************************************************************************/

#define Set(var,bitno) ((var) |= 1 << (bitno))


#define Clr(var,bitno) ((var) &= ~(1 << (bitno)))
#define Vlr(data,bitno) ((data>>bitno)&0x01)

/*******************************************************************************************

DECLARACION DE VARIABLES Y SUBRUTINAS

*******************************************************************************************/
/*******************************************************************************************

SUBRUTINAS

*******************************************************************************************/

void setup (void)


{
/*** Configuracion de Puertos ***/
TRISA=0B00000001;
TRISB=0B00000001;
TRISC=0B10000010;
TRISD=0;
TRISE=0;
/*** Inicializacion de Puertos ***/
PORTA=0;
PORTB=0b00100100;
PORTC=0;
PORTD=8;
PORTE=0;

void delay(unsigned int tiempo)


{
while(tiempo>0)
{

tiempo--;

}
ESTRUCTURA BASICA DE LA RUTINA PRINCIPAL DE UN PROGRAMA

/******************** RUTINA PRINCIPAL **********************************/

void main (void)


{
setup();

while (1)
{
if (PORTBbits.RB0==1)
{

}
else
{

} /* FIN DEL PROGRAMA */

También podría gustarte