Lenguaje C para PICs
Programacin con mikroC
1 Ing. Alcvar Costales G.
Como poner comentarios
Formato C Formato C++
/* aqu escriba su comentario // lnea de comentario
hasta */ // otra lnea de comentario
MikroC acepta los dos formatos
2 Ing. Alcvar Costales G.
Operadores aritmticos
Operador Operacin
+ Suma
- Resta
* Multiplicacin
/ Divisin
% Retorna el residuo de la divisin entre enteros
++ Incrementa en uno al valor del operando
-- Decrementa en uno al valor del operando
3 Ing. Alcvar Costales G.
Operadores de relacin
Operador Operacin
== Igual
!= No es igual
> Mayor que
< Menor que
>= Mayor o igual que
<= Menor o igual que
4 Ing. Alcvar Costales G.
Operadores de bits
Operador Operacin
& AND entre bits
| OR entre bits
^ XOR entre bits
~ Complementa bits
<< Rota bits a la izquierda
>> Rota bits a la derecha
5 Ing. Alcvar Costales G.
Operadores lgicos
Operador Operacin
&& AND lgico
|| OR lgico
! Negacin lgica
6 Ing. Alcvar Costales G.
Keywords
PALABRAS RESERVADAS
asm enum signed
auto extern sizeof
brek float static
case for struct
char goto switch No use estas
palabras en
const if typedef su programa
continue int union
default long unsigned
do register void
double return volatile
else short while
7 Ing. Alcvar Costales G.
Tipos de variables
Lo que est encerrado en
parntesis puede suprimirse
8 Ing. Alcvar Costales G.
Arreglos
Declaracin de arreglos
Sintaxis:
Tipo nombre_del_arreglo [valor constante]
Ejemplo:
int A [5] ; // arreglo A de 5 enteros
Inicializacin de arreglos
Ejemplo:
int C [4] = {2, 4, 7, 9} ;
9 Ing. Alcvar Costales G.
Sentencias
Las sentencias bsicamente se dividen en :
Sentencias de etiqueta
Sentencias de seleccin
Sentencias de iteracin
Sentencias de salto
Sentencias compuestas o bloques
Sentencias de etiqueta
Sintaxis:
etiqueta_identificadora: sentencia;
Ejemplo:
repita : etiqueta
a=a+3;
10 Ing. Alcvar Costales G.
Sentencias de seleccin
Son dos: if , switch
Sentencia switch
Sintaxis:
Sentencia if switch (expresin) {
Sintaxis:
case constante_1: sentencia_1 ;
if (expresin) sentencia1
[else sentencia2]
case constante_n: sentencia_n ;
[default : sentencia ;]
Ejemplo:
}
if (var == 1) x = x + 5 ;
Ejemplo:
else y = y - 3 ;
switch (input) {
case 1 : LED1 = 1;
case 2 : LED2 = 1;
default : LED7 = 1;
}
11 Ing. Alcvar Costales G.
Sentencias de iteracin
Sentencia while Sentencia do
Sintaxis: Sintaxis:
while (expresin) sentencia do sentencia while (expresin)
Ejemplo: Ejemplo:
int s, i ; int s, i ;
s=i=0 s=i=0;
while ( i < 6 ) { do {
s=s+2; s=s+2;
i=i +1; i=i +1;
} } while ( i < 7 ) ;
12 Ing. Alcvar Costales G.
Sentencias de iteracin
Sentencia for
Sintaxis:
for ( [exp_inicial] ; [exp_condicional] ; [exp_incremento] ) sentencia
Ejemplo:
for (sum = 0 , cont = 0 ; cont < 5 ; cont++) {
sum += 2 ;
}
Este cdigo sumar 2 unidades a la variable sum por
cinco ocasiones
13 Ing. Alcvar Costales G.
Sentencias de salto
Sentencia break
Ejemplo:
int i = 0 , s = 1 ; // declaracin e inicializacin de variables
while (1) { // lazo infinito
if ( i == 4 ) break ;
s=s*2;
i++ ; Cuando i = 4
}
Este cdigo multiplica por 2 a la variable s hasta que i = 4
14 Ing. Alcvar Costales G.
Sentencias de salto
Sentencia continue
Ejemplo:
int i = 0 , s = 1 ; // declaracin e inicializacin de variables
while (1) { // lazo infinito
s=s*2;
i++ ; Cuando i 4
if ( i != 4 ) continue ;
break ;
}
Este cdigo multiplica por 2 a la variable s hasta que i = 4
15 Ing. Alcvar Costales G.
Sentencias de salto
Sentencia goto
Sintaxis:
Goto etiqueta ;
Ejemplo:
siga : // etiqueta
.. ;
goto siga ;
16 Ing. Alcvar Costales G.
Sentencias compuesta
Sentencias compuestas o bloques, son
aquellas formadas por una lista de sentencias
simples encerradas entre { }
17 Ing. Alcvar Costales G.
Microcontroladores PIC
Ejemplos de programacin con mikroC
18 Ing. Alcvar Costales G.
Prct_1: Led on-off
// Proyecto: Led on-off
// Descripcin:
// Los diodos conectados a PORTB se prenden y
// apagan. Se usa la negacin ~.
// PIC16F870
//---------------------------------------------------------------------
void main() {
portb = 0;
trisb = 0;
while(1) {
portb= ~portb;
Delay_ms(250);
}
}
19 Ing. Alcvar Costales G.
Comando Button
Prtico Estado activo
Vcc
9 21
OSC1/CLKIN RB0/INT
10 22
OSC2/CLKOUT RB1
1 23
MCLR/Vpp/T HV RB2
24
RB3/PGM
2 25
RA0/AN0 RB4
3 26
RA1/AN1 RB5
4 27 BUTTON
RA2/AN2/VREF- RB6/PGC
5 28
RA3/AN3/VREF+ RB7/PGD
6
7
RA4/T 0CKI
RA5/AN4 RC0/T 1OSO/T 1CKI
11
12
Button( &PORTC, 1, 1, 1)
RC1/T 1OSI
13
RC2/CCP1
14
RC3
15
RC4
RC5
RC6/T X/CK
16
17 Bit del prtico
18
RC7/RX/DT
PIC16F870
Tiempo en mS
para eliminar
el rebote
20 Ing. Alcvar Costales G.
Prct_2: Uso del comando Button
// El programa hace toggle los LEDs conectados a PORTB,
// cada que se presione un switch conectado a RC1.
// PIC16F870
//---------------------------------------------------------------------------
void main(){
char memo = 0; // declaracin de variable
trisb = 0;
trisc = 0xff;
do {
if (Button(&portc, 1, 1, 1))
memo = 1;
if (memo && Button(&portc, 1, 1, 0)) {
portb = ~portb;
memo = 0;
}
} while(1);
}
21 Ing. Alcvar Costales G.
Programa para LCD
//Manejo de LCD PIC16F870
unsigned short sum1=4;
unsigned short sum2=8;
unsigned short suma;
char txt[4];
void main() {
LCD_Init(&PORTB); // Inicializar LCD conectado a PORTB
LCD_Cmd(LCD_CLEAR); // Borrar display
LCD_Cmd(LCD_CURSOR_OFF); // Apagar cursor
bytetostr(sum1,txt);
LCD_Out(1,1, txt); // Imprimir texto en fila 1, columna 1
LCD_Out_Cp(" +");
Delay_ms(200);
bytetostr(sum2,txt);
LCD_Out_Cp(txt);
suma=sum1+sum2;
LCD_Out_Cp(" =");
bytetostr(suma,txt);
LCD_Out_Cp(txt);
}
22 Ing. Alcvar Costales G.
Interrupciones
Del Timer0
23 Ing. Alcvar Costales G.
Registro del PIC: INTCON (1)
Funcin principal: controlar las interrupciones
Est ubicado en la localidad 0BH de la RAM
Su formato es:
GIE: permiso global de las interrupciones, con 1 habilita
EEIE: habilitacin de interrupcin para grabacin de la EEPROM
TOIE: 1 habilita interrupcin de TMR0, 0 lo deshabilita
INTE: 1 habilita la interrupcin RB0/INT, 0 la deshabilita
24 Ing. Alcvar Costales G.
Registros del PIC: INTCON (2)
RBIE: habilta interrupciones en RB4 a RB7
TOIF: bandera de TMR0
INTF: bandera de interrupciones en RB0
RBIF: bandera de interrupciones en RB4 a RB7
25 Ing. Alcvar Costales G.
Registro: ADCON0
CHS2:CHS0 ADON
ADCS1:ADCS0
Bits de seleccin del 1 = Mdulo A/D on
Bits para seleccionar el canal anlogo
reloj de la conversin 0 = Mdulo A/D off
000 = canal 0 (AN0)
00 = Fosc /2
001 = canal 1 (AN1) GO/DONE
01 = Fosc/8
. Si ADON = 1:
10 = Fosc/32
. 1 = conversin en progreso
11 = Frc (reloj interno)
100 = canal 4 AN(4) 0 = conversin terminada
26 Ing. Alcvar Costales G.
Registro: ADCON1
27 Ing. Alcvar Costales G.
Registro: ADCON1
(1) Para PIC16F877
(2) Canales A/D
respecto a
canales usados
para voltajes de
referencia
28 Ing. Alcvar Costales G.
Registro: ADCON1
29 Ing. Alcvar Costales G.