Está en la página 1de 33

SISTEMAS DIGITALES

C5. Introducción a la

Programación en C con el Pic16

Tipos de datos en C para el Pic16 Programar en C:

Operadores

Instrucciones

Trabajo con registros (Puertos E/S)

Subrutinas de retardo

Creación de funciones Puertos E/S

Introducción a la Programación en C con el Pic16

SD-2

TIPOS DE DATOS EN C

E

N

T

E

R

O

S

D

E

C

I

M

A

L

E

S

Introducción a la Programación en C con el Pic16 SD-2 TIPOS DE DATOS EN C E
Introducción a la Programación en C con el Pic16 SD-2 TIPOS DE DATOS EN C E

Introducción a la Programación en C con el Pic16

OPERADORES EN C

Operadores ARITMÉTICOS:

SD-3

OPERADORES ARITMÉTICOS (se opera con enteros) Operador + - * / % Operación Suma resta

OPERADORES ARITMÉTICOS

OPERADORES ARITMÉTICOS (se opera con enteros)

(se opera con enteros)

Operador

+

-

*

/

%

%

Operación

Suma

resta

Multiplicación

División

Módulo (resto en una

división)

EJEMPLO

División Módulo (resto en una división) EJEMPLO (E1 tiene el valor 0x05 y E2 tiene el
(E1 tiene el valor 0x05 y E2 tiene el valor 0x02)

(E1 tiene el valor 0x05 y E2 tiene el valor 0x02)

Expresión

E1 + E2

E2 E1

E1 * E2

E1 / E2

E1 % E2

E1 % E2

Valor en W

0x07h

0xFD (-3 en CA2)

0x0A

0x02

0x01

0x01

Introducción a la Programación en C con el Pic16

OPERADORES EN C

SD-4

Operadores LOGICOS y de RELACIÓN sobre expresiones:

OPERADORES LÓGICOS Y DE RELACIÓN

EJEMPLO:

E1 tiene el valor 0x20 (VERDADERO) y E2 tiene el valor 0x21 (VERDADERO)

Operador

Operación

 

Expresión

Valor en W

!

Negación lógica (NOT)

 

!E1

0x00

&&

Producto lógico

 

E1 && E2

0x01

(AND)

|

|

Suma lógica (OR)

 

E1 | | E2

0x01

>

Mayor que

 

E1> E2

0x00

<

Menor que

 

E1 < E2

0x01

>=

Mayor o igual que

 

E1 >=

E2

0x00

<=

Menor o igual

 

E1 <= E2

0x01

==

Igual a

 

E1 == E2

0x00

!=

No igual a

 

E1 != E2

0x01

Introducción a la Programación en C con el Pic16

OPERADORES EN C

Operadores LOGICOS SOBRE BITS:

SD-5

OPERADORES LÓGICOS (se opera con los bits de igual posición de los símbolos y constantes)

EJEMPLO (E1 tiene el valor 0x05 y E2 tiene el valor 0x02)

Operador

Operación

Expresión

Valor en W

~ NOT

 

~E1

0xFB (-5 en CA2)

& AND

 

E1 & E2

0x00

|

OR

E1 | E2

0x07

^

OR Exclusivo (XOR)

E1^ E2

0x07

>>

Desplazar a la derecha

E1 >>

E2

0x01

<<

Desplazar a la izquierda

E1 << E2

0x14

Introducción a la Programación en C con el Pic16

OPERADORES EN C

Operadores de ASIGNACIÓN:

SD-6

Operador

Operación

Ejemplo

Significado

=

Asignación aritmética o lógica

var = 0

var = 0

++

Incrementar

var ++

var = var + 1

--

Decrementar

var --

var = var -1

+=

Sumar y asignar

var += k

var = var + k

-=

Restar y asignar

var -= k

var = var - k

*=

Multiplicar y asignar

var *= k

var = var * k

/=

Dividir y asignar

var /= k

var = var / k

%=

Módulo y asignar

var %= k

var = var % k

&=

AND y asignar

var &= k

var = var & k

|=

OR y asignar

var |= k

var = var | k

^=

XOR y asignar

var ^= k

var = var ^ k

>>=

Desplazar a la derecha y asignar

var >>= k

var = var >> k

<<=

Desplazar a la izquierda y asignar

var <<= k

var = var << k

rol

Rotar hacia la izquierda y asignar

var rol 1

Var = var rol 1

ror

Rotar hacia la derecha y asignar

var ror 1

Var = var ror 1

Introducción a la Programación en C con el Pic16

OPERADORES EN C

Operadores de DIRECCION:

SD-7

Operador

Operación

Ejemplo

Valor en W

low

Byte bajo de la dirección

 

x =

low etiqueta

Bits 7 a 0 de la dirección etiqueta

high

Byte alto de la dirección

x

= high etiqueta

Bits 15 a 8 de la dirección etiqueta

highword

Word más alto de la dirección

x

= highword etiqueta

Bits 31 a 16 de la dirección etiqueta

Introducción a la Programación en C con el Pic16

INSTRUCCIONES EN C

while(expr==1){ //acción} Ejemplo:

While(var<10){

}

var++;

do{//acción}while(expr==1);

Ejemplo:

Do {

var++;

}while(var<3);

for(var=inic;condición;paso){//acción}

Ejemplo:

For(var=0;var<100;var++){

//accion }

If(expr1){ //acción 1}

[else if(expr2){ //acción 2}]

[else { //acción n}]

Var=2;

If(var==1){ //acción1}

else if(var==2){ //acción a ejecutar}

else { //acción por defecto}

Switch(variable){

Case A: //acción Break; Case B: //acción

Break;

Case…

Default: //acción Break

}

SD-8

Introducción a la Programación en C con el Pic16

SD-9

CUERPO DEL PROGRAMA

Función main()

CREACION DE FUNCIONES

Podemos crear nuestras propias funciones.

Normalmente se ponen al final del archivo

(después de main())

Deben estar declaradas antes de usarse

Normalmente se añade una lista de declaraciones de funciones antes del main()

Se pueden pasar parámetros de entrada y

resultados

Introducción a la Programación en C con el Pic16

FUNCIONES

SD-10

Declaración: Antes de la función main

t_dato_retorno

nombre_función(t_dato nombre1, t_dato2 nombre2, …);

t_dato_retorno = tipo de dato que devuelve la función (puede ser void) nombre función = nombre con el que se llamará a la función desde el programa t_dato1, t_dato2 = tipo de dato de entrada (esta parte puede estar vacia) nombre1, nombre2 = nombres de cada una de las variables de entrada que existirán únicamente de manera interna a la función.

Código: Después de la función main

t_dato_retorno

nombre_función(t_dato nombre1, t_dato2 nombre2, …){

DECLARACIÓN DE VARIABLES INTERNAS DE LA FUNCIÓN; CODIGO DE LA FUNCIÓN;

return variable;

// en el caso de que retorne algo

}

Introducción a la Programación en C con el Pic16

SD-11

ESTRUCTURA DEL PROGRAMA

Se trata de programación básica en C, independientemente de la programación del microcontrolador.

// AQUÍ IRÁN LOS ARCHIVOS DE DEFINICIONES

#include<htc.h> //Incluimos libreria del micro a usar #define _XTAL_FREQ 4000000 //Oscilador Interno de 4MHZ

CONFIG(WRT_OFF

& WDTE_OFF & PWRTE_OFF & FOSC_XT & LVP_OFF);

// DECLARACIÓN DE VARIABLES GLOBALES

Int x,y;

//DECLARACIÓN DE FUNCIONES void funcion(void);

//AQUÍ COMIENZA EL PROGRAMA PRINCIPAL void main(void){

DECLARACIÓN DE VARIABLES INTERNAS DEL PROGRAMA

//

AQUÍ IRÁ EL CÓDIGO DEL PROGRAMA PRINCIPAL

}

//AQUÍ IRÁ EL CÓDIGO DE LAS FUNCIONES DEFINIDAS AL PRINCIPIO

void funcion(void){ //

}

AQUÍ IRÁ EL CÓDIGO DE LA FUNCION

Introducción a la Programación en C con el Pic16

SD-12

EJERCICIO1 : BÚSQUEDA DEL VALOR MÁXIMO DE UNA LISTA

INICIO
INICIO

Inicializar índice

posiciones

MÁXIMO DE UNA LISTA INICIO Inicializar índice posiciones Inicializar MAXIMO con 0 Comparar el primer elemento

Inicializar

MAXIMO con 0

Inicializar índice posiciones Inicializar MAXIMO con 0 Comparar el primer elemento de la lista con MAX

Comparar el primer

elemento de la lista

con MAX

con 0 Comparar el primer elemento de la lista con MAX Incrementar Índice de posiciones ¿Elemento

Incrementar

Índice

de

posiciones

la lista con MAX Incrementar Índice de posiciones ¿Elemento Mayor? SI Elemento a MAX NO ¿Acabó
¿Elemento Mayor? SI
¿Elemento
Mayor?
SI

Elemento a MAX

NO

con MAX Incrementar Índice de posiciones ¿Elemento Mayor? SI Elemento a MAX NO ¿Acabó lista? SI
¿Acabó lista? SI FIN
¿Acabó
lista?
SI
FIN

SIGUE

Introducción a la Programación en C con el Pic16

SD-13

EJERCICIO 2: CONVERSION BINARIO-DECIMAL-ASCII El microcontrolador trabaja internamente en binario, pero el resultado hay que sacarlo generalmente al exterior sobre un dispositivo (terminal CRT, impresora) que admite caracteres ASCII.

CARÁCTER

 

ASCII

NUMÉRICO

BINARIO

HEXADECIMAL

DECIMAL

0

0011

0000

30

48

1

0011 0001

31

49

2

0011

0010

32

50

3

0011

0011

33

51

4

0011

0100

34

52

5

0011

0101

35

53

6

0011

0110

36

54

7

0011

0111

37

55

8

0011

1000

38

56

9

0011

1001

39

57

El número binario a convertir está contenido en un byte. En decimal puede ser de 0 a 255. Se debe representar con tres caracteres ASCII.

NUMERO: 254 BINARIO: 1111 1110 HEXAD: 0xFE
NUMERO: 254 BINARIO: 1111 1110 HEXAD: 0xFE
NUMERO: 254 BINARIO: 1111 1110 HEXAD: 0xFE

NUMERO: 254 BINARIO: 1111 1110 HEXAD: 0xFE

NUMERO: 254 BINARIO: 1111 1110 HEXAD: 0xFE
NUMERO: 254 BINARIO: 1111 1110 HEXAD: 0xFE
NUMERO: 254 BINARIO: 1111 1110 HEXAD: 0xFE
NUMERO: 254 BINARIO: 1111 1110 HEXAD: 0xFE
NUMERO: 254 BINARIO: 1111 1110 HEXAD: 0xFE
NUMERO: 254 BINARIO: 1111 1110 HEXAD: 0xFE
caracteres ASCII. NUMERO: 254 BINARIO: 1111 1110 HEXAD: 0xFE DECENA: 5 BINARIO: 0000 0101 HEXAD: 0x05

DECENA: 5 BINARIO: 0000 0101 HEXAD: 0x05 ASCII: 35h = 30h + 05h

5 BINARIO: 0000 0101 HEXAD: 0x05 ASCII: 35h = 30h + 05h CENTENA: 2 BINARIO: 0000

CENTENA: 2 BINARIO: 0000 0010

HEXAD:0x02

ASCII: 32h = 30h + 02h

UNIDAD: 4 BINARIO: %0000 0100 HEXAD: 0x04 ASCII: 34h = 30h + 04h

Introducción a la Programación en C con el Pic16

SD-14

INICIALIZANDO EL MICROCONTROLADOR

htc.h

Sirve para programar los registros de configuración Debe estar en el directorio de trabajo

// Comandos Obligatorios para el funcionamiento del debugger

#include<htc.h> //Incluimos libreria del micro a usar

CONFIG(WRT_OFF

& WDTE_OFF & PWRTE_OFF & FOSC_XT & LVP_OFF);

#define _XTAL_FREQ 4000000 //Oscilador Interno de 4MHZ

// Explicación de los comandos de configuración utilizados

/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ //WRT_OFF = Codigo no Potegido //WDTE_OFF = Watch Dog Timer Desactivado //PWRTE_OFF = Power Activado

//FOSC_XT = Osiclador cristal

//LVP_OFF = Low Voltage Porgramming Desactivado /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ void main(void){

//

AQUÍ IRÁ EL CÓDIGO DEL PROGRAMA

}

Introducción a la Programación en C con el Pic16

SD-15

CONFIGURACIÓN DEL PIC16

CONFIG

Oscillator

// RC oscillator

FOSC_EXTRC

// HS oscillator

FOSC_HS

// XT oscillator

FOSC_XT

// LP oscillator

FOSC_LP

Watchdog Timer Enable bit

// WDT enabled

WDTE_ON

// WDT disabled

WDTE_OFF

Power-up Timer Enable bit

// PWRT disabled

PWRTE_OFF

// PWRT enabled

PWRTE_ON

Brown-out Reset Enable bit

// BOR enabled

BOREN_ON

// BOR disabled

BOREN_OFF

Low-Voltage (Single-Supply) In-Circuit Serial Programming Enable bit

//RB3/PGM pin has PGM function;

LVP_ON

// RB3 is digital I/O, HV must be used

LVP_OFF

Data EEPROM Memory Code Protection bit

// Data EEPROM code protection off // Data EEPROM code-protected

CPD_OFF

CPD_ON

In-Circuit Debugger Mode bit

// In-Circuit Debugger disabled // In-Circuit Debugger enabled

DEBUG_OFF

DEBUG_ON

Flash Program Memory Code Protection bit

// Code protection off

CP_OFF

// All program memory code-protected

CP_ON

Introducción a la Programación en C con el Pic16

SD-16

ACCESO A LOS REGISTROS

El fichero <procesador>.h (ej. <pic16F877A.h>) incluye las definiciones de todos los registros de

control de periféricos.

Cualquier registro de control se puede acceder

de dos modos:

En formato byte al registro completo <nombre_registro> (ej. PORTA)

Bit a bit: <nombre_registro>bits.<nombre_bit> o

<nombre_bit> (ej. PORTAbits.RA0 o RA0)

Introducción a la Programación en C con el Pic16

Introducción a la Programación en C con el Pic16 SD-17
Introducción a la Programación en C con el Pic16 SD-17

SD-17

Introducción a la Programación en C con el Pic16

SD-18

FUNCIONAMIENTO DE LOS PUERTOS

DIAGRAMA DE BLOQUES INTERNO

Y

ESQUEMA ELÉCTRICO

DE LOS PUERTOS

DE BLOQUES INTERNO Y ESQUEMA ELÉCTRICO DE LOS PUERTOS ES PARTICULAR DE CADA PUERTO INCLUSO EN

ES PARTICULAR DE CADA PUERTO INCLUSO EN EL MISMO PUERTO

HAY PINES CON CARACTERÍSTICAS

DISTINTAS

EL MISMO PUERTO HAY PINES CON CARACTERÍSTICAS DISTINTAS ES NECESARIO SABER INTERPRETAR EL ESQUEMA INTERNO PARTICULAR

ES NECESARIO SABER INTERPRETAR EL ESQUEMA INTERNO PARTICULAR

PARA SABER QUÉ CONEXIONES

SE PUEDEN HACER

Introducción a la Programación en C con el Pic16

SD-19

FUNCIONAMIENTO DE LOS PUERTOS

REGISTROS ASOCIADOS AL PUERTO A (PORTA)

Dirección

Registro

Bit 7

Bit 6

Bit 5

Bit 4

Bit 3

Bit 2

Bit 1

 

Bit 0

Valores después del reset por encendido (POR) o por caída de tensión (BOR)

05h

 

PORTA

-

-

RA5

RA4

RA3

RA2

RA1

 

RA0

--0x 0000

85h

 

TRISA

-

-

Registro de direcciones de datos del PORTA

 

--11 1111

9Fh

ADCON1

ADFM

-

-

-

PCFG3

PCFG2

PCFG1

PCFG0

0--- 0000

REGISTROS ASOCIADOS AL PUERTO B (PORTB)

 

Dirección

Registro

 

Bit 7

 

Bit 6

Bit 5

 

Bit 4

Bit 3

Bit 2

Bit 1

Bit 0

Valores después del reset por encendido (POR) o por caída de tensión (BOR)

05h, 106h

PORTB

 

RB7

 

RB6

RB5

 

RB4

RB3

RB2

RB1

RB0

xxxx xxxx

86h, 186h

TRISB

Registro de direcciones de datos del PORTB

 

1111

1111

81h, 181h

OPTION_REG

RBPU#

INTEDG

T0CS

T0SE

PSA

PS2

PS1

PS0

1111

1111

0Bh, 8Bh

                   

10Bh, 18Bh

INTCON

 

GIE

 

PEIE

TOIE

 

INTE

RBIE

TOIF

INTF

RBIB

0000 000x

Introducción a la Programación en C con el Pic16

SD-20

FUNCIONAMIENTO DE LOS PUERTOS

REGISTROS ASOCIADOS AL PUERTO C (PORTC)

Dirección

Registro

Bit 7

Bit 6

Bit 5

Bit 4

Bit 3

Bit 2

Bit 1

Bit 0

Valores después del reset por encendido (POR) o por caída de tensión (BOR)

07h

PORTC

RC7

RC6

RC5

RC4

RC3

RC2

RC1

RC0

xxxx xxxx

87h

TRISC

Registro de direcciones de datos del PORTC

 

1111

1111

REGISTROS ASOCIADOS AL PUERTO D (PORTD)

 

Dirección

Registro

Bit 7

Bit 6

Bit 5

Bit 4

Bit 3

Bit 2

Bit 1

Bit 0

Valores después del reset por encendido (POR) o por caída de tensión (BOR)

08h

PORTD

RD7

RD6

RD5

RD4

RD3

RD2

RD1

RD0

xxxx xxxx

88h

TRISD

Registro de direcciones de datos del PORTD

 

1111

1111

REGISTROS ASOCIADOS AL PUERTO E (PORTE)

                   

Valores después del reset

Dirección

Registro

Bit 7

Bit 6

Bit 5

Bit 4

Bit 3

Bit 2

Bit 1

Bit 0

por encendido (POR) o por caída de tensión (BOR)

09h

PORTE

-

-

-

-

-

RE2

RE1

RE0

---- -xxx

89h

TRISE

IBF

OBF

IBOV

PSPMODE

 

Registro de direcciones de

0000 -111

-

datos del PORT

 

9Fh

ADCON1

ADFM

-

-

-

PCFG3

PCFG2

PCFG1

PCFG0

0--- 0000

Introducción a la Programación en C con el Pic16

SD-21

CONEXIONES ASOCIADAS A LA PLACA PICDEM2+ (INPUTS)

PULSADORES

Introducción a la Programación en C con el Pic16 SD-21 CONEXIONES ASOCIADAS A LA PLACA PICDEM2+
Introducción a la Programación en C con el Pic16 SD-21 CONEXIONES ASOCIADAS A LA PLACA PICDEM2+

Introducción a la Programación en C con el Pic16

SD-22

CONEXIONES ASOCIADAS A LA PLACA PICDEM2+ (OUTPUTS)

LEDS

Introducción a la Programación en C con el Pic16 SD-22 CONEXIONES ASOCIADAS A LA PLACA PICDEM2+

ZUMBADOR

Introducción a la Programación en C con el Pic16 SD-22 CONEXIONES ASOCIADAS A LA PLACA PICDEM2+

Introducción a la Programación en C con el Pic16

SD-23

EJERCICIO 3: Escribir un programa en C para encender los LEDS

EJERCICIO 4: Escribir un programa para que encienda los Leds en función de un pulsador. Al pulsar RA4 se encenderá RB1 y se apagará RB0.

EJERCICIO 5: Controlar el zumbador conectado a RC2 con el pulsador RA4.

#include<htc.h> //Incluimos libreria del micro a usar

CONFIG(WRT_OFF

& WDTE_OFF & PWRTE_OFF & FOSC_XT & LVP_OFF);

#define _XTAL_FREQ 4000000 //Oscilador Interno de 4MHZ

//Definición de variables

void main(void){

//Configuración

*******PROGRAMA******

while(1)

//Bucle infinito

}

Introducción a la Programación en C con el Pic16

SD-24

GENERACION DE RETARDOS

Hay tres maneras de generar retardos con el

Pic16:

Bucles (similar a ensamblador pero sin control)

Funciones de la librería delays.h o htc.h (programadas en ensamblador)

Temporizadores (Timers) => Capítulo 6

Introducción a la Programación en C con el Pic16

SD-25

RETARDOS MEDIANTE BUCLES

TIEMPO DE EJECUCIÓN

Ciclo de instrucción = ¼ de la frecuencia del oscilador

1s para un reloj trabajando a 4MHz.

Ciclo de Instrucción

del oscilador • 1  s para un reloj trabajando a 4MHz. Ciclo de Instrucción Q1

Q1

Q2

del oscilador • 1  s para un reloj trabajando a 4MHz. Ciclo de Instrucción Q1

Q3

del oscilador • 1  s para un reloj trabajando a 4MHz. Ciclo de Instrucción Q1

Q4

del oscilador • 1  s para un reloj trabajando a 4MHz. Ciclo de Instrucción Q1
del oscilador • 1  s para un reloj trabajando a 4MHz. Ciclo de Instrucción Q1
del oscilador • 1  s para un reloj trabajando a 4MHz. Ciclo de Instrucción Q1
del oscilador • 1  s para un reloj trabajando a 4MHz. Ciclo de Instrucción Q1
del oscilador • 1  s para un reloj trabajando a 4MHz. Ciclo de Instrucción Q1

Fases

Q1

del oscilador • 1  s para un reloj trabajando a 4MHz. Ciclo de Instrucción Q1
del oscilador • 1  s para un reloj trabajando a 4MHz. Ciclo de Instrucción Q1

T osc

Oscilador

del oscilador • 1  s para un reloj trabajando a 4MHz. Ciclo de Instrucción Q1

Introducción a la Programación en C con el Pic16

SD-26

EJERCICIO 6: Generar un retardo con un bucle “for” que active y desactive el zumbador conectado a RC2.

¿Cuál es la frecuencia de la señal y el

periodo de encendido de los LED?

#include<htc.h> //Incluimos libreria del micro a usar

CONFIG(WRT_OFF

& WDTE_OFF & PWRTE_OFF & FOSC_XT & LVP_OFF);

#define _XTAL_FREQ 4000000 //Oscilador Interno de 4MHZ

void main(void){

/* PROGRAMA*/

}

EJERCICIO 7: Mostrar una secuencia que vaya encenciendo los LEDs conectados a RB0:RB3 de forma que hagan un contador binario.

Introducción a la Programación en C con el Pic16

RETARDOS

MEDIANTE LA LIBRERÍA “htc.h”

Es necesario definir la frecuencia del oscilador: _XTAL

NOP() Retardo de un ciclo de instrucción

delay_us(400)

delay_ms(2)

_delay(1000) Retardo de x ciclos de instrucción

Retardo de x microsegundos

Retardo de x milisegundos

FREQ

SD-27

de x microsegundos  Retardo de x milisegundos FREQ SD-27 MEDIANTE LA LIBRERÍA “delay.h” • DelayUs(x)

MEDIANTE LA LIBRERÍA “delay.h”

DelayUs(x) Retardo de x microsegundos

DelayMs(x) Retardo de x milisegundos

X es del tipo Unsigned Char < 255

Introducción a la Programación en C con el Pic16

SD-28

MEZCLANDO ENSAMBLADOR Y C

El código en lenguaje ensamblador puede mezclarse con el código en C utilizando diferentes técnicas:

1ª.- Incluyendo el código en ensamblador en línea dentro del módulo en C, que se puede hacer de dos formas diferentes:

a) Utilizando las directivas #asm y #endasm al principio y al final del código en ensamblador respectivamente. El bloque generado con estas directivas no obedece las reglas de flujo normales de los programas en C por lo que no se recomienda su utilización dentro de estructuras como if(), while() o for(). Sin embargo es la manera más sencilla de añadir múltiples instrucciones en ensamblador. b) Utilizando la sentencia asm(); para incluir cada única instrucción en código ensamblador en cualquier punto del programa en C, la cual interactuará correctamente con las estructuras de control de flujo de programa en C.

EJEMPLO:

estructuras de control de flujo de programa en C. EJEMPLO: 2ª.- Escribiendo el código en ensamblador
estructuras de control de flujo de programa en C. EJEMPLO: 2ª.- Escribiendo el código en ensamblador

2ª.- Escribiendo el código en ensamblador en un módulo separado del código en C Esta es la opción más adecuada frente a la anterior ya que se genera un código en ensamblador autocontenido en lugar de un ensamblado en línea aunque requiere de un mayor control del compilador en C

Introducción a la Programación en C con el Pic16

SD-29

EJERCICIO 8: Escribir un programa en C para monitorizar el estado del bit RB0. Si es Alto, generar pitidos de frecuencia 1kHz, duración 0.2 segundos cada pitido y a intervalos de 1 segundo. EJERCICIO 9: Crear una función que vaya iluminando los LEDS conectados a RB0:RB3 de derecha a izquierda cada 200ms y de forma indefinida.

EJERCICIO 10: Escribir un programa para leer un bit del puerto RA4, esperar 0.5 segundos y enviarlo al puerto RB1 . XTAL=4MHz

#include<htc.h> //Incluimos libreria del micro a usar

CONFIG(WRT_OFF

& WDTE_OFF & PWRTE_OFF & FOSC_XT & LVP_OFF);

#define _XTAL_FREQ 4000000 //Oscilador Interno de 4MHZ

#include <delay.h>

void main(void){

// PROGRAMA //

}

Introducción a la Programación en C con el Pic16

SD-30

MANEJO DE LA PANTALLA LCD EN ‘C’

Librería LCD.h

Inicialización:

lcd_init(void) Inicializar la pantalla LCD en modo 4 bits/dos líneas de caracteres 5x7.

Ejecutar esta función sólo al comienzo

Posición del cursor:

extern void lcd_goto(unsigned char pos) Ir a una posición de la pantalla LCD

char pos)  Ir a una posición de la pantalla LCD • Borrado de pantalla: –

Borrado de pantalla:

lcd_clear(void) Limpia la pantalla LCD

Manejo de Cadenas de caracteres:

lcd_puts(const char *s)

lcd_putch(char) Inserta el caracter de la tabla CGROM indicado por el dato

Escribir una cadena de caracteres en la pantalla LCD

Comandos genéricos:

LCR_RS=0; // RD4=0;

lcd_write(unsigned char c) Enviar un comando a la pantalla LCD

Los puertos de E/S

EJEMPLO 1:

SD31

#include <htc.h> #include "lcd.h" CONFIG(WRT_OFF

& WDTE_OFF & PWRTE_OFF & FOSC_XT & LVP_OFF);

#define _XTAL_FREQ 4000000 //Oscilador Interno de 4MHZ

void main(void) { unsigned char a=0xB5;

lcd_init(); lcd_clear();

lcd_goto(0x02);

lcd_puts("Hello world!");

lcd_goto(0x40);

lcd_putch('5');

lcd_putch(a);

for(;;);

}

// Inicializa la pantalla LCD // Limpiamos la pantalla LCD // Selecciona la tercera celda

// Escribe una cadena de caracteres

// Selecciona la segunda línea // Escribe el carácter 5 // Escribe el caracter con código 0xB5

Los puertos de E/S

EJERCICIO 11:

SD32

Escribir un programa que cuente las pulsaciones (0-9) del interruptor conectado a RB0 y muestre por la pantalla LCD el número de pulsaciones seguido de la palabra “veces”. El programa reiniciará la cuenta cuando se pulse RA4 mostrando la palabra “PULSE RB0.

#include<htc.h> //Incluimos libreria del micro a usar #include "lcd.h“ // librería de funciones de la pantalla LCD

CONFIG(WRT_OFF

& WDTE_OFF & PWRTE_OFF & FOSC_XT & LVP_OFF);

#define _XTAL_FREQ 4000000 //Oscilador Interno de 4MHZ

void main(void){

// PROGRAMA //

}

Los puertos de E/S

EJERCICIO 12:

SD33

Realizar un cronómetro MM:SS.

Se inicia en 00:00.

Cuando se pulse RA4, inicia/detiene la cuenta

Cuando se pulse RB0 resetea el contador.

Usar subrutinas para generar los retardos

La cuenta se debe poder parar y resetear en cualquier momento

EJERCICIO 13:

Realizar un programa que muestre un carácter cambiante de 0 a F en el display:

Cambia con una cadencia de 0.5 segundos

El carácter irá desplazándose de izquierda a derecha en la segunda línea de la pantalla LCD.

Implementarlo utilizando temporizadores con interrupciones.