Documente Academic
Documente Profesional
Documente Cultură
PIC
CCS C
Directivas de preprocesado
Indican al compilador cmo debe generar
el cdigo mquina.
Programas
Bloques de programa.
Siempre debe incluirse una llamada
main().
Sentencias
Instrucciones que definen lo que hace el
programa y la secuencia de ejecucin del
mismo.
Comentarios
Imprescindibles como documentacin del
cdigo fuente.
3
p.e.:int i;
Los tipos de variable short y long pueden tener detrs la palabra int sin
efecto alguno.
5
Tamao
8 bits
16 bits
Rango
-128 a 127
16 bits
-32768 a
tipo_dato_return
)
{
cuerpo de la funcin (sentencias);
}
Las funciones pueden devolver un valor a la sentencia que las llama. El tipo
de dato devuelto se indica mediante tipo_dato (char, int16, long). Si no se
indica nada, se entiende que devuelve un entero. Si no devuelve nada, debe
incluirse una especificacin tipo void.
Parmetros formales
Argumentos de llamada
Los argumentos se pueden pasar a las funciones por valor o por referencia.
La llamada por valor copia el argumento de llamada en el parmetro
formal de la funcin (No modifica su valor en la funcin de partida).
La llamada por referencia usa la direccin de la variable que se pasa a la
funcin (se consigue usando punteros o arrays).
De asignacin
Aritmticos
10
Lgicos
De bits
11
Desplazamiento bit
Direccin/indireccin
13
14
Sentencia if
Se ejecuta una sentencia o bloque de cdigo si la expresin que
acompaa al if tiene un valor distinto a cero (verdadero). Si es cero
(falso) contina sin ejecutar la sentencia o bloque de sentencias.
if (expresin)
sentencia;
sentencia 1;
sentencia 2;
...
}
Sentencia if-else
Se evala una expresin y, si es cierta, se ejecuta el primer bloque
de cdigo (o sentencia 1). Si es falsa, se ejecuta el segundo.
if (expresin)
sentencia 1;
else
sentencia 2;
15
Sentencia if-if/else
If (P1 !=0) c=20;
else c=0;
If (a>b) {
If (a>d) c = 15;
else c=0; }
If (a>b) {
If (a>d) c = 15;
}
else c=0;
16
Sentencia switch
Substituye a if-else cuando se realiza una seleccin mltiple que
compara una expresin con una lista de constantes enteras o
caracteres. Cuando se da una coincidencia, el cuerpo de sentencias
asociadas a esa constante se ejecuta hasta que aparezca break.
switch (expresin)
{
case constante 1:
grupo 1 de sentencias;
break;
case constante 2:
grupo 2 de sentencias;
break;
...
default:
grupo n de sentencias;
}
break es opcional. Si no
aparece se sigue con el case
siguiente.
No puede haber constantes
iguales en dos case de la
misma sentencia switch.
default es opcional y el bloque
asociado se ejecuta slo si no
hay ninguna coincidencia con
las constantes especificadas.
17
Sentencia switch
Switch (k) {
case 0:
x=1;
break;
case 2:
c=6;
b=15;
break;
case 3: x=12;
break;
default: break;
}
18
una
sentencia
bloque
de
For (i=1;i<=100;i++) {
delay_ms(33);
px=?px;
}
For (y=1;i<=99;y=y+3) {
delay_ms(33);
px=y;
}
20
21
do {
a=1;
b=45;
x=p1;
}
while (x>0 && y++>5);
22
#BIT id=x.y
x
#BYTE id=x
#DEVICE chip
#FUSES options
grabacin del
#INCLUDE <fichero>
#INCLUDE fichero
#INLINE
memoria de
#SEPARATE
de
ahorra
#INT_xxxx
#INT_GLOBAL
genrico de
cuando se
#PRIORITY ints
27
28
29
Para crear un nuevo proyecto PROJECT > NEW > PIC WIZARD /
MANUAL CREATE
30
PCB (12bit)
PCM (14bit)
PCH (PIC18)
COMPILAR (F9)
MONTARLO
31
TRISA = 0xFF;
TRISB = 0x00;
TRISC = 0x0F;
// 8 terminales de entrada
// 8 terminales de salida
// 4 pin de mayor peso OUT,4 pin de menor peso IN
33
Lectura de puertos:
valor = PORTA;// Asigna el dato del puerto A a la variable valor.
Manejo de sentencias:
TRISD=0x0F;
if (PORTD & 0x0F) PORTD |= 0xA0;
de
34
bit_clear (var,bit);
variable.
bit_set (var , bit);
variable.
bit_test (var , bit);
variable.
swap (var);
4
(0 a 7) de la
COMPILAR
(F9)
MONTARLO
36
saca
input_X();
valor en el puerto
correspondiente.
set_tris_X(valor);
//Carga el registro TRISx con el valor
(0-255).
port_b_pullups (valor); //Mediante valor=TRUE o valor=FALSE
habilita o
//deshabilita las resistencias de pull-up en
PORTB.
37
output_low (pin*);
//Pin a 0.
output_high (pin*);
//Pin a 1.
output_bit (pin* , valor);
//Pin al valor especificado.
output_toggle(pin*);
//Complementa el valor del pin.
output_float (pin*);
//Pin de entrada, quedando a tensin flotante
input_state(pin*);
//lee el valor del pin sin cambiar su
sentido
input(pin*);
// lee el valor del pin.
38
40
41
42
43
44
45
46
47
48
49
50
51
52
Por defecto, este driver usa siete bits del puerto B para establecer la
comunicacin entre el LCD y el microcontrolador (aunque tambin se
puede utilizar el puerto D).
B0
Enable
B4
Bit de datos D4
B1
RS
B5
Bit de datos D5
B2
R/W
B6
Bit de datos D6
B3
B7
Bit de datos D7
54
exp)
1-9
Indica el nmero de caracteres a mostrar
01-09 Indica el nmero de ceros a la izquierda
1.1-9.9 Indica cuntos decimales se han de mostrar
t:
Carcter
s
u
Cadena o carcter
Entero sin signo
sin signo
e
f
Flotante
(formato
Flotante truncando
lu
Entero largo
x X
Entero hexadecimal
lx lX Entero largo
hexadecimal
d
Entero con signo
ld
Entero largo
con signo
g
Flotante rendondeado
55
w
Entero sin signo. La 1 cifra indica
el total, la 2 el n
Algunos ejemplos.
printf(lcd_putc , Hola);
printf(lcd_putc , Tecla %c pulsada %u veces , key ,
cont );
Ejemplos de formato.
Especificador Valor=0x12
%03u
018
%u
18
%2u
18
%5
18
%d
18
%x
12
%X
12
%4X
0012
%3.1w
1.8
Valor=0xfe
254
254
???
254
-2
fe
FE
00FE
25.4
56
Compilador
Ejemplo:
DISPLAY
C para PIC
57
C1/CLKIN
C2/CLKOUT
CLR/Vpp/THV
0/AN0
1/AN1
2/AN2/V REF3/AN3/V REF+
4/T0CKI
5/AN4/S S
RB0/INT
RB1
RB2
RB3/P GM
RB4
RB5
RB6/P GC
RB7/P GD
RC0/T1OSO/T1CKI
RC1/T1OSI/CCP2
RC2/CCP1
RC3/S CK/S CL
RC4/S DI/ SDA
RC5/S DO
RC6/TX /CK
RC7/RX /DT
RS
RW
E
D0
D1
D2
D3
D4
D5
D6
D7
7
8
9
10
11
12
13
14
4
5
6
1
2
3
VSS
VDD
VEE
LM016L
21
22
23
24
25
26
27
28
11
12
13
14
15
16
17
18
16F876
COMPILAR (F9)
MONTARLO
58
D0
D1
D2
D3
D4
D5
D6
D7
RS
RW
E
4
5
6
1
2
3
7
8
9
10
11
12
13
14
VSS
VD D
VEE
LM0 16L
U1
OS C1/CLKIN
OS C2/CLKOUT
MCLR/Vpp/THV
RA 0/A N0
RA 1/A N1
RA 2/A N2/VRE FRA 3/A N3/VRE F+
RA 4/T 0CKI
RA 5/A N4/SS
RB0/IN T
RB1
RB2
RB 3/PGM
RB4
RB5
RB 6/PGC
RB 7/PGD
R C0/T 1OSO/T1CKI
RC1/T1OS I/C CP2
RC2/CCP1
RC3/SCK/S CL
RC4/S DI/SDA
RC5/SDO
RC6/T X/C K
RC7/RX/D T
21
22
23
24
25
26
27
28
11
12
13
14
15
16
17
18
PI C16F87 6
COMPILAR (F9)
MONTARLO
59
kbd_get();
Devuelve el valor de la tecla pulsada en funcin de la tabla que
tiene programada.
60
61
pin(port)
LCD2
RA0/AN0
RA1/AN1
RA2/AN2/VREFRA3/AN3/VREF+
RA4/T0CKI
RA5/AN4/SS
RB0/INT
RB1
RB2
RB3/PGM
RB4
RB5
RB6/PGC
RB7/PGD
RC0/T1OSO/T 1CKI
RC1/T 1OSI/CCP2
RC2/CCP1
RC3/SCK/SCL
RC4/SDI/SDA
RC5/SDO
RC6/TX/CK
RC7/RX/DT
21
22
23
24
25
26
27
28
D0
D1
D2
D3
D4
D5
D6
D7
RS
RW
E
4
5
6
11
12
13
14
7
8
9
10
2
3
4
5
6
7
OSC1/CLKIN
OSC2/CLKOUT
MCLR/Vpp/T HV
VSS
VDD
VEE
U1
9
10
1
1
2
3
LM016L
11
12
13
14
15
16
17
18
PIC16F876
C0
C1 C2
R0
R1
R
2
R3
62
5
6
7
OSC1/CLKIN
OSC2/CLKOUT
MCLR/Vpp/T HV
RA0/AN0
RA1/AN1
RA2/AN2/VREFRA3/AN3/VREF+
RA4/T0CKI
RA5/AN4/SS
RB0/INT
RB1
RB2
RB3/PGM
RB4
RB5
RB6/PGC
RB7/PGD
RC0/T 1OSO/T1CKI
RC1/T 1OSI/CCP2
RC2/CCP1
RC3/SCK/SCL
RC4/SDI/SDA
RC5/SDO
RC6/T X/CK
RC7/RX/DT
21
22
23
24
25
26
27
D5
D6
D7
D0
D1
D2
D3
D4
RS
RW
E
4
5
6
11
12
13
14
7
8
9
10
2
3
4
VSS
VDD
VEE
U1
9
10
1
1
2
3
Ejemplo: TECLADO/DISPLAY
A
28
11
12
13
14
15
16
17
18
PIC16F876
63
D0
D1
D2
D3
D4
D5
D6
D7
RS
RW
E
4
5
6
7
8
9
10
11
12
13
14
V SS
V DD
V EE
1
2
3
Ejemplo: TECLADO/DISPLAY
21
22
23
24
25
26
27
28
11
12
13
14
15
16
17
18
64
COMPILAR (F9)
MONTARLO
65
66
#INT_RTCC
#INT_RB
#INT_EXT
#INT_AD
#INT_TBE
#INT_RDA
#INT_TIMER1
#INT_TIMER2
#INT_CCP1
(CCP1IF)
#INT_CCP2
(CCP2IF)
#INT_SSP
(SSPIF)
#INT_BUSCOL
#INT_EEPROM
Desbordamiento de TMR0.
Cambio en los pines RB<4:7>.
Flanco en pin RB0.
Fin de conversin A/D.
Buffer de transmisin USART vaco.
Dato recibido en USART.
Desbordamiento de TMR1.
Desbordamiento de TMR2.
Captura / Comparacin en mdulo
(T0IF)
(RBIF)
(INTF)
(ADIF)
(TXIF)
(RCIF)
(TMR1IF)
(TMR2IF)
CCP1.
debe
seguir
encargndose
68
de
habilitar
las
disable_interrupts (nivel);
Hace la accin contraria a la funcin anterior, poniendo a 0 las
mscaras relacionadas con la interrupcin indicada.
69
#INT_EXT
ext_isr() {
......}
enable_interrupts (INT_EXT);
ext_int_edge (H_TO_L);
enable_interrupts (GLOBAL);
D1
LED-GREE N
R1
180
Ejemplo: INTERRUPCIONES_RB0
COMPILAR (F9)
MONTARLO
71
72
(OPTION_REG
(OPTION_REG
(OPTION_REG
(OPTION_REG
(OPTION_REG
(OPTION_REG
(OPTION_REG
(OPTION_REG
08h)
09h)
0Ah)
0Bh)
0Ch)
0Dh)
0Eh)
0Fh)
74
(TMR0 valor)
(valor TMR0)
(equivale a CLRWDT)
75
//variable de cambio
#int_TIMER0
void TIMER0_isr(void) {
var0++;
//se complementa la variable
if (var0==1) output_bit(PIN_B0,1);
//para semiperiodo alto
else output_bit(PIN_B0,0);
//para semiperiodo bajo
set_timer0 (0x06); }
//se recarga el timer0
void main() {
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_2); //configuracin timer0
set_timer0 (0x06);
//carga del timer0
enable_interrupts(INT_TIMER0);
//habilita interrupcion timer0
enable_interrupts(global);
//habilita interrupcin general
while (1);
//bucle infinito
}
76
77
main ()
{
setup_timer_1 (T1_INTERNAL | T1_DIV_BY_8);
while(1){
temp1s();
}
80
81
82
x = 125
Con Fosc=4MHz
//variable de cambio
preescaler 4
postscaler 1
//Funcin Interrupcin
//se complementa la variable
//para semiperiodo alto
//para semiperiodo bajo
//se recarga el timer0
void main() {
setup_timer_2 (T2_DIV_BY_4 ,124,1); //configuracin timer2
enable_interrupts(INT_TIMER2);
//habilita interrupcion timer0
enable_interrupts(global);
//habilita interrupcin general
while (1);
//bucle infinito
}
83
84
OS C1/CLKIN
OS C2/CLKOUT
MCLR/V pp/ THV
RA 0/AN0
RA 1/AN1
RA 2/AN2/V RE FRA 3/AN3/V RE F+
RA 4/T0CKI
RA 5/AN4/S S
RB0/INT
RB 1
RB 2
RB 3/PGM
RB 4
RB 5
RB 6/PGC
RB 7/PGD
RC0/T1OS O/T 1CKI
RC1/T 1OSI/CCP2
RC2 /CCP1
RC3/SCK/ SCL
RC4/ SDI /SDA
RC5/SDO
RC6/T X/CK
RC7/RX/DT
21
22
23
24
25
26
27
28
11
12
13
14
15
16
17
18
D3
D1
D2
R3
R1
R2
180
180
180
PIC16F876
COMPILAR (F9)
MONTARLO
85
86
D0
D1
D2
D3
D4
D5
D6
D7
RS
RW
E
VSS
VDD
VEE
U1(RB0/INT )
2
3
4
5
6
7
RA0/AN0
RA1/AN1
RA2/AN2/VREFRA3/AN3/VREF+
RA4/T 0CKI
RA5/AN4/SS
RB0/INT
RB1
RB2
RB3/PGM
RB4
RB5
RB6/PGC
RB7/PGD
RC0/T 1OSO/T 1CKI
RC1/T 1OSI/CCP2
RC2/CCP1
RC3 /SCK/SCL
RC4/SDI/SDA
RC5/SDO
RC6/T X/CK
RC7/RX/DT
4
5
6
21
22
23
24
25
26
27
28
7
8
9
10
11
12
13
14
OSC1/CLKIN
OSC2/CLKOUT
MCLR/Vpp/T HV
1
2
3
U1
9
10
1
11
12
13
14
15
16
17
18
PIC16F876
88
89
COMPILAR (F9)
MONTARLO
90
D0
D1
D2
D3
D4
D5
D6
D7
RS
RW
E
4
5
6
1
2
3
7
8
9
10
11
12
13
14
VSS
VDD
VEE
LM016L
U1
9
10
1
2
3
4
5
6
7
OSC1/CLKIN
OSC2/CLKOUT
MCLR/Vpp/T HV
RA0/AN0
RA1/AN1
RA2/AN2/VREFRA3/AN3/VREF+
RA4/T 0CKI
RA5/AN4/SS
RB0/INT
RB1
RB2
RB3/PGM
RB4
RB5
RB6/PGC
RB7/PGD
RC0/T1OSO/T 1CKI
RC1/T1OSI/CCP2
RC2/CCP1
RC3/SCK/SCL
RC4/SDI/SDA
RC5/SDO
RC6/TX/CK
RC7/RX/DT
21
22
23
24
25
26
27
28
11
12
13
14
15
16
17
18
PIC16F876
Simularlo con
el ISIS y leer la
EEPROM con el
DEBUG
91