Você está na página 1de 96

Sistemas Embebidos

Programación en C
microcontroladores PIC
CCS C

PIC16F877A
Puertos de entrada y salida

 PORTA ( RA5, RA4, RA3, RA2, RA1, RA0 )

 PORTB ( RB7, RB6, RB5, RB4, RB3, RB2, RB1, RB0 )

 PORTC ( RC7, RC6, RC5, RC4, RC3, RC2, RC1, RC0 )

 PORTD ( RD7, RD6, RD5, RD4, RD3, RD2, RD1, RD0 )

 PORTE ( RE2, RE1, RE0 )


PUERTOS

Puerto # funciones Funciones


PORTA 3 Entradas digital
Salidas digital
Entradas analógicas
PORTB 2 Entradas digital
Salidas digital
PORTC 3 Entradas digital
Salidas digital
Medios de comunicación
PORTD 3 Entradas digital
Salidas digital
Puerto paralelo esclavo
PORTE 4 Entradas digital
Salidas digital
Entradas analógicas
Control del puerto paralelo esclavo
FUNCIONES PORTA

Terminal Funciones
RA0 Ent. Digital Sal. Digital Ent. Analógica

RA1 Ent. Digital Sal. Digital Ent. Analógica

RA2 Ent. Digital Sal. Digital Ent. Analógica VREF -

RA3 Ent. Digital Sal. Digital Ent. Analógica VREF +

RA4 Ent. Digital Sal. Digital Ent. contador 1

RA5 Ent. Digital Sal. Digital Ent. Analógica


FUNCIONES PORTB

Terminal Funciones
RB0 Ent. Digital Sal. Digital Ent. Interrupción 0

RB1 Ent. Digital Sal. Digital

RB2 Ent. Digital Sal. Digital

RB3 Ent. Digital Sal. Digital PGM ( función LVP )

RB4 Ent. Digital Sal. Digital

RB5 Ent. Digital Sal. Digital

RB6 Ent. Digital Sal. Digital PGC ( función LVP )

RB7 Ent. Digital Sal. Digital PGD ( función LVP )


FUNCIÓN PORTC

Terminal Funciones
RC0 Ent. Digital Sal. Sal. Osc timer 1 Ent. Contador 1
Digital

RC1 Ent. Digital Sal. Ent. Osc Timer 1 Captura/Comp/PWM 1


Digital

RC2 Ent. Digital Sal. Captura/Comp/PWM 2


Digital

RC3 Ent. Digital Sal. Reloj sincrono SPI Reloj síncrono I2C
Digital

RC4 Ent. Digital Sal. Datos entrada SPI Datos I2C


Digital

RC5 Ent. Digital Sal. Datos salida SPI


Digital

RC6 Ent. Digital Sal. Transmisión USART


Digital

RC7 Ent. Digital Sal. Recepción USART


Digital
FUNCIONES PORTD

Terminal Funciones
RD0 Ent. Digital Sal. Digital Bit 0 puerto paralelo esclavo

RD1 Ent. Digital Sal. Digital Bit 1 puerto paralelo esclavo

RD2 Ent. Digital Sal. Digital Bit 2 puerto paralelo esclavo

RD3 Ent. Digital Sal. Digital Bit 3 puerto paralelo esclavo

RD4 Ent. Digital Sal. Digital Bit 4 puerto paralelo esclavo

RD5 Ent. Digital Sal. Digital Bit 5 puerto paralelo esclavo

RD6 Ent. Digital Sal. Digital Bit 6 puerto paralelo esclavo

RD7 Ent. Digital Sal. Digital Bit 7 puerto paralelo esclavo


FUNCIONES PORTE

Terminal Funciones
RE0 Ent. Digital Sal. Digital Ent. Analógica Lectura PSP

RE1 Ent. Digital Sal. Digital Ent. Analógica Escritura PSP

RE2 Ent. Digital Sal. Digital Ent. Analógica Habilitación PSP


Tipos de datos

Tipo bytes Rango


(unsigned) char 1 0 .. 255
signed char 1 - 128 .. 127
(signed) short (int) 1 - 128 .. 127
unsigned short (int) 1 0 .. 255
(signed) int 2 -32768 .. 32767
unsigned (int) 2 0 .. 65535
(signed) long (int) 4 -2147483648 .. 2147483647
unsigned long (int) 4 0 .. 4294967295
Tipos de datos 2

Tipo bytes Rango

float 4 ±1.17549435082 x 10-38 .. ±6.80564774407 x 1038

double 4 ±1.17549435082 x 10-38 .. ±6.80564774407 x 1038

long double 4 ±1.17549435082 x 10-38 .. ±6.80564774407 x 1038


Asignación de datos

 Decimal
 int i = 10; /* decimal 10 */
 int j = -10; /* decimal -10 */
 int p = 0; /* decimal 0 */

 Hexadecimal
 short x = 0x37; /* decimal 55 */
 short y = 0x7F; /* decimal 127 */
 int z = 0x125; /* decimal 293 */
Asignación de datos

 Octal
 int m = 023; /* 19 */
 short n = 016; /* 14 */

 Binario
 char dato = 0b00001111;
 short dat = 0b10101010;
 unsigned char sig = 0b11001100;

 ASCII
 char dat = ‘a’;
 char m = ‘5’;
Registros asociados

Entrada/salida Configuración
 PORTA TRISA

 PORTB TRISB

 PORTC TRISC

 PORTD TRISD

 PORTE TRISE
Entrada o salida

 DECLARACIÓN DE PUERTOS
#byte REGISTRO=0xDIRECCIÓN
REGISTRO=0xDATO;

#byte PORTD=0x08
PORTD=0x00;

 SALIDA DE DATOS :
output_PUERTO(DATO);
output_a(0x08);
Entrada o salida

 ENTRADA DE DATOS:
value = input_a();

 La asignación es individual correspondiente a cada


terminal del puerto.

VAR=input(PIN_D7);
Acceso individual de bits 1

 CCS te permite acceso individual en variables de 8 bits


(char and unsigned short).

 Ejemplo:
output_low(PIN_D0);
output_high(PIN_D1);
Entrada o salida

 Si deseamos configurar el puerto A con la siguiente


asignación:
RA0 salida
RA1 salida
RA2 salida
RA3 salida
RA4 entrada
RA5 entrada
RA6 entrada

 Posibles instrucciones a utilizar


ADCON1 = 6; \\ instrucción indispensable para usar el
puerto A y el puerto E como entrada o
salida de datos digitales
TRISA = 0b’01110000’; o
TRISA = 0x70; o
TRISA = 112;
ADCON1

ADCON1 = 0 0 0 0 0 1 1 0

ADCON1 = 6 ;
Delay_ms (retardo por software)

 Descripción: Crea un retardo por software dado el tiempo en


milisegundos (constante). El rango de constantes aplicables a la
función depende de la frecuencia del oscilador. Es una función interna;
El código es generado en el lugar donde se hace la llamada, así que la
llamada de esta función no cuenta dentro del limite de llamadas
anidadas.

 void Delay_ms(const time_in_ms)

 Ejemplo:
Generar un retardo de 1 segundo

Delay_ms(1000); /* Pausa de un segundo */


Estructura de un programa en C

// Definición de variables globales


( ciclo while )
// Definición de funciones

void main(void)
{
// Definición de variables locales

// Configuración de registros (recursos y puertos)

// ciclo infinito
while ( 1 )
{

// Programa de usuario

}
}
Estructura de un programa en C

// Definición de variables globales


( ciclo for )
// Definición de funciones

void main(void)
{
// Definición de variables locales

// Configuración de registros (recursos y puertos)

// ciclo infinito
for ( ; ; )
{

// Programa de usuario

}
}
Estructura de un programa en C
// Definición de variables globales

// Definición de funciones
( ciclo do - while )
void main(void)
{
// Definición de variables locales

// Configuración de registros (recursos y puertos)

// ciclo infinito
do
{

// Programa de usuario

} while ( 1 ) ;
}
1.- Encendido de LED

 Crear un programa que encienda y apague un led,


ubicado en la terminal RD0 del puerto D. El tiempo
de encendido y apagado es de 100 milisegundos.
Encendido de LED (algoritmo)

1. Configurar el bit 0 del puerto D como salida de


datos
2. Encendido del led
3. Retardo por software de 100 milisegundos.
4. Apagado del led
5. Retardo por software de 100 milisegundos
6. Repetir el paso 2
Encendido de LED (diagrama de flujo)
Led

Configura bit del


puerto como salida

Enciende bit

Retardo de 100ms

Apaga bit

Retardo de 100 ms
Encendido de LED (Programa)
Ejercicios propuestos 1

1. El alumno encenderá y apagará en forma


alternada dos led’s ubicados en los bit’s 2 y 3 del
puerto B. Los retardos serán de 500
milisegundos (ambos). Usando asignación
directa a bits.

2. El alumno encenderá y apagara un led ubicado


en el bit 5 del puerto C. Los retardos serán de
100 milisegundos y 2 segundos,
respectivamente. Usando asignación de byte.
2.- Luces secuenciales

 Programa que envíe la siguiente secuencia de datos


al puerto de salida D.

Secuencia :
 00000001
 00000010
 00000100
 00001000
 00010000
 00100000
 01000000
 10000000
Luces secuenciales (algoritmo)

1. Configuración de puerto como salida de datos.


2. Envío de primer dato al puerto de salida
3. Envío de segundo dato al puerto de salida
4. Envío de tercer dato al puerto de salida
.
.
.
9. Envío de ultimo dato al puerto de salida
10. Regresar a 2
Luces secuenciales (diagrama de flujo)

Luces

Configura puerto
como salida Envía 00000100 Envía 00100000

Envía 00000001 Envía 00001000 Envía 01000000

Envía 00000010 Envía 00010000 Envía 10000000


Luces secuenciales (esquemático)
Luces secuenciales (programa)
void main(void)
{
TRISD = 0; // CONFIGURACION COMO PUERTO
DE SALIDA

while ( 1 ) // CICLO INFINITO


{
PORTD = 0b00000001; // ENVIA PRIMER DATO
Delay_ms(500);
PORTD = 0b00000010; // ENVIA SEGUNDO DATO
Delay_ms(500);
PORTD = 0b00000100; // ENVIA TERCER DATO
Delay_ms(500);
PORTD = 0b00001000;
Delay_ms(500);
PORTD = 0b00010000;
Delay_ms(500);
PORTD = 0b00100000;
Delay_ms(500);
PORTD = 0b01000000;
Delay_ms(500);
PORTD = 0b10000000;
Delay_ms(500);
}
}
Arreglos (definiciones)

#define MAX 50
int vector_one[10]; /* arreglo de 10 enteros */
float vector_two[MAX]; /* arreglo 50 flotantes */
float vector_three[MAX - 20]; /* arreglo 30 flotantes */
char numero[5];
short dato[8];
long temperatura[15];
unsigned peso[7];
unsigned short d[3];
Arreglos (Inicializando)

/* Arreglo el cúal contiene el número de días de cada mes */

int days[12] = {31,28,31,30,31,30,31,31,30,31,30,31};

/* La declaraciones es identica a la anterior */

int *days = {31,28,31,30,31,30,31,31,30,31,30,31};

/* Las dos declaraciones son identicas */

const char msg1[ ] = {'T', 'e', 's', 't', '\0'};


const char msg2[ ] = "Test";
Condicionante if

if (expresión) conjunto 1 [else conjunto 2]

 Cuando la expresión evaluada es verdadera, Las


instrucciones del conjunto 1 son ejecutadas. Si la
expresión es falso, las instrucciones del conjunto 2
es ejecutada. La expresión debe ser evaluada a un
valor entero. Los paréntesis que encierra la
expresión son obligatorios.
 La palabra especial “else conjunto 2” es opcional.
Símbolos de condición

Operador Operación
== igual
!= no igual
> mayor que
< menor que
>= mayor que o igual a
<= menor que o igual a
3.- Luces con arreglo (algoritmo)

1. Configuración de puerto como salida.


2. Inicializa apuntador.
3. Envío de dato apuntado.
4. Incrementa apuntador.
5. Si apuntador es mayor que o igual a 8 inicia el
apuntador.
6. Regresa a 3.
Luces con arreglo (diagrama de flujo)

Luces

Configura puerto Incrementa


como salida apuntador

Limpia apuntador si
apuntador ≥ 8 Limpia
apuntador

Envía dato
no
apuntado
Ejercicio propuesto

1. Enviar una secuencia por el puerto B usando los


valores almacenado en un arreglo.
00000011
00000110
00001100
00011000
00110000
01100000
11000000
Operadores a nivel de bits

Operador operacion
AND; compara pares de bits y regresa 1 si ambos son 1’s,
& de otra manera regresa 0.

OR (inclusive); compara pares de bits y regresa 1 si uno o


| ambos son 1’s, de otra manera regresa 0.

OR (exclusiva); compara pares de bits y regresa 1 si los


^ bits son complementarios, de otra manera regresa 0.

Complemento (unitario); invierte cada bit


~
<< Corrimiento hacia la izquierda; mueve los bits hacia la
izquierda, descartando el bit mas a la izquierda y
asignando ceros al bit a la derecha.
>> Corrimiento hacia la derecha; mueve los bits hacia la
derecha, descartando el bit mas a la derecha y asignando
ceros al bit a la izquierda.
Ejemplos operadores lógicos

0x1234 & 0x5678 /* Igual 0x1230 */

porque...
0x1234 : 0001 0010 0011 0100
0x5678: 0101 0110 0111 1000
-----------------------------------
&: 0001 0010 0011 0000 esto es, 0x1230

/* De forma similar: */

0x1234 | 0x5678; /* Igual 0x567C */


0x1234 ^ 0x5678; /* Igual 0x444C */
~ 0x1234; /* Igual 0xEDCB */
Ejemplos a nivel de bits

000001 << 5; /* Igual 000040 */


0x3801 << 4; /* Igual 0x8010, sobreflujo! */

0x02F6 >> 4; /* Igual 0x002F */


0xFF56 >> 4; /* Igual 0x0FF5 */

Corrimiento a la derecha division entre 2n.


Corrimiento a la izquierda producto por 2n.
4.- Luces con desplazamiento (algoritmo)

1. Configuración de puerto como salida.


2. Inicializa variable.
3. Envía valor de la variable al puerto.
4. Modifica la variable.
5. Si variable es cero, Inicializa la variable.
6. Regresa a 3.
Luces con desplazamiento (diagrama de
flujo)

Luces

Configura puerto Modifica


como salida variable

Inicializa variable si
variable = 0 Inicializa
variable

Envía variable
no
al puerto
Operaciones aritméticas
Operador Operación

+ Suma

- Resta

* Multiplicación

/ División

% Resto, regresa el residuo de la división entera (no puede ser usado


con variables flotantes
++ Como prefijo Incrementa en uno el valor de la variable antes de
evaluar la expresión. Como Postfijo suma en uno la variable después
de ser evaluado la expresión.
-- Como prefijo decrementa en uno el valor de la variable antes de
evaluar la expresión. Como Postfijo resta en uno la variable después
de ser evaluado la expresión.
Ejercicios propuestos

1. Realizar un programa que envíe al puerto C los


siguientes valores utilizando para generarlas, las
instrucciones de desplazamiento y/o aritméticas.

1, 5, 9, 13, 17, 21, 25, 29, 33, 37, 41, 45

2. Lo mismo que el ejercicio anterior con la


siguiente secuencia:

3, 6, 12, 24, 48, 92, 172, 1, 3, 6, 9, 12, 15, 18, 21, 24


Acceso a bits individual

 mikroC te permite acceso individual en variables de 8 bits


(char and unsigned short). Simplemente usando el
selector (.) seguido de uno de los identificadores F0, F1, …
, F7, siendo F7 el bit mas significativo.

 Ejemplo:
// Si RB0 es uno, colocar en uno la terminal RC0:
if ( PORTB.F0 )
PORTC.F0 = 1;

Los Identificadores F0–F7 no se reconocen en minúsculas.


5.- Secuencias condicionadas ( problema )

 Realizar un programa que envíe secuencias distintas


al puerto D, dependiendo del valor de la terminal
RA0. Si RA0 es igual a cero se envía la serie de dos
bits desplazados hacia la izquierda, mientras que si
RA0 es igual a 1 entonces se envía la serie de tres bits
desplazados hacia la derecha.
Secuencias condicionadas (algoritmo)

1. Configuración de puertos
2. Inicia contador
3. Si RA0 es igual a 0 entonces envía
secuencia_izquierda
4. De lo contrario envía secuencia_derecha
5. Incrementa contador
6. Si contador es igual a 8 entonces contador igual a
0
7. Regresa a 3
Secuencias condicionadas (diagrama de flujo)

Luces
Envía
Configura puertos
RD salida, RA entrada secuencia_izquierda

Incrementa
Limpia contador contador

si
si Contador = 10 Limpia
RA0 = 0 contador

Envía no
no Secuencia_derecha
Secuencias condicionadas (programa)

short izquierda[10] = { 0, 1, 3, 6, 12, 24, 48, 96, 192, 128 };


short derecha[10] = { 128, 192, 226, 102, 56, 28, 14, 7, 3, 1 };
void main ( void )
{
TRISD = 0;
ADCON1 = 6;
TRISA = 0x7F;

Contador = 0;

for ( ; ; )
{
Delay_ms ( 500 );

if ( PORTA.F0 = = 0 )
PORTD = izquierda [ contador];
else
PORTD = derecha [ contador];

contador + + ;

If ( contador = = 10 )
contador = 0;
}
}
Ejercicio propuesto

1. Desarrollar un programa que envíe una secuencia


de números BCD a un display de 7 segmentos
ubicados en el puerto D. Si la terminal RA1
ubicada en el puerto A, es igual a 0, la numeración
debe ser incremental; en caso contrario debe
decrementarse.
MOTOR A PASOS 2
 Unipolar.- Tiene 4 bobinas independientes (A, B,
C, D) y dos terminales comunes.
Ejercicios propuestos 5 (esquemático)
MOTOR A PASOS 1
 Unipolar.- Tiene 4 bobinas independientes (A, B, C,
D) y una terminal común a todas ellas.
MOTOR A PASOS 2
 Bipolar.- Tiene 2 bobinas (A – C, B – D)
Secuencias de activación 1
 Unipolar.- Movimiento de 1 paso por pulso
(mayor torque).

Paso A B C D

1 1 1 0 0
2 0 1 1 0
3 0 0 1 1
4 1 0 0 1
Secuencias de activación 2
 Unipolar.- Movimiento de 1 paso por pulso
(mayor velocidad).

Paso A B C D

1 1 0 0 0
2 0 1 0 0
3 0 0 1 0
4 0 0 0 1
Secuencias de activación 3
 Unipolar.- Movimiento de 1/2 paso por pulso.

Paso A B C D
0.5 1 0 0 0
1 1 1 0 0
1.5 0 1 0 0
2 0 1 1 0
2.5 0 0 1 0
3 0 0 1 1
3.5 0 0 0 1
4 1 0 0 1
Secuencias de activación 4
 Bipolar.- Movimiento de un paso

Paso A C B D
1 1 0 1 0
2 1 0 0 1
3 0 1 0 1
4 0 1 1 0
Secuencia de activación 5
•Bipolar.- Movimiento de medio paso
Paso A C B D
0.5 1 0 1 0
1 1 0 0 0
1.5 1 0 0 1
2 0 0 0 1
2.5 0 1 0 1
3 0 1 0 0
3.5 0 1 1 0
4 0 0 1 0
Circuito de potencia 1 (motor unipolar )
Circuito de potencia 2 (motor unipolar )
Circuito de potencia 3 (motor bipolar )

Este mismo diagrama se repetiría para manejar la segunda bobina


Circuito de potencia x (motor a pasos )

Circuito integrado UCN 5804 Circuito integrado SAA1042


Circuito de potencia x1 (motor unipolar )
Circuito de potencia x2 (motor bipolar )
Ejercicio propuesto

2.- Desarrollar un programa que envíe la secuencia de


activación de un motor a pasos ubicado en el
puerto D. Si la terminal ubicada en el puerto A,
RA6, sea igual a 0, el motor debe girar a la
derecha, en caso contrario debe girar a la
izquierda.
Ejercicios propuestos 5 (esquemático)
6.- Display de 7 segmentos

 Realizar un programa en donde se implemente un


contador de 00-99 desplegando en un par de
display’s de 7 segmentos. El programa debe realizar
la visualización utilizando el multiplexaje de los
datos, utilizando el puerto B como bus de datos y las
terminales RC0 y RC1 como terminales de
habilitación de display.
Display de 7 segmentos (algoritmo)

1. Configurar los puertos, inicialización de variables (unidades = ‘0’


decenas = ‘0’)
2. Envío de decenas
3. Habilitación de decenas
4. Envío de unidades
5. Habilitación de unidades
6. Incremento de unidades
7. Si unidades mayor de ‘9’ entonces 9
8. Sigue 2
9. Unidades = ‘0’
10. Incrementa decenas
11. Si decenas mayor de ‘9’ entonces 12
12. Sigue 2
13. Decenas=‘0’
14. Sigue 2
Display de 7 segmentos (diagrama de flujo)

Display

Limpia unidades
Incrementa decenas
Configura puertos
Inicia variables
si
Envía decena Decenas>’9’
Envía unidad
Incrementa unidad no

si Limpia decenas
Unidades>’9’

no
Display de 7 segmentos (programa)

short numero[ ] = { 0x3F, 0x06, 0x1B, 0x4F, 0x66, 0x6D, 0x5E, 0x07, 0x7F, 0x67 };

void main ( void ) // Programa principal


{
TRISB = 0; // Configuración de puertos
TRISC = 0;
unidades = decenas = ‘0’; // Inicialización de variables

while ( 1 ) // Programa de usuario


{
PORTB = numero [ decenas ]; // Envía decenas
PORTC.F0 = 1; // Habilita el display de
decenas
delay-ms( 10 );
PORTC.F0 = 0;
PORTB = numero [ unidades ]; // Envía unidades
PORTC.F1 = 1; // Habilita el display de
decenas
delay-ms( 10 );
PORTC.F1 = 0;

unidades++; // Incrementa unidades


if ( unidades > ’9’ )
{
unidades = ‘0’; // Reinicia unidades
decenas++; // Incrementa decenas
if ( decenas > ’9’ )
{
decenas = ‘0’; // Reinicie decenas
}
}

}
Display de 7 segmentos ( esquemático )
Ejercicio propuesto

 Modificar el programa elaborado de tal forma que se


cambie el incremento por decremento, al usar un
interruptor. Si el interruptor esta apagado el conteo
será incremental, en caso contrario, el conteo será
decremental. El interruptor estará ubicado en la
terminal RE0 del puerto E.
Ejercicio propuesto 6 (esquemático)
Conversión de tipo de datos

Tipo de dato a cadena


 ByteToStr
 ShortToStr
 WordToStr
 IntToStr
 LongToStr
 FloatToStr
ByteToStr

Descripcion: Crea una cadena de salida de un pequeño numero


sin signo (valor numérico menos a 0x100). La cadena esta
ajustada a un ancho de 3 caracteres; Las posiciones a la
izquierda que no se usan en la conversión se rellenan con
espacios.

void ByteToStr(unsigned short number, char *output);

Ejemplo:
unsigned short t = 24;
char *txt=“ “; //se inicializa un apuntador a 4
espacios

ByteToStr(t, txt); // txt es " 24" (un espacio en blanco)


ShortToStr

Descripción: Crea una cadena de salida de un numero


pequeño con signo (valor numérico menor a 0x100). La
cadena esta ajustada a un ancho de 4 caracteres; Las
posiciones a la izquierda que no se usan en la conversión se
rellenan con espacios.

void ShortToStr(short number, char *output);

Ejemplo:
short t = -4;
char *txt=“ “; // Se inicializa un apuntador de 5
espacios

ShortToStr(t, txt); // txt es " -4" (dos espacio en


blanco)
WordToStr

Descripción: Crea una cadena de salida de un numero sin


signo (Valor numérico de una variable unsigned). La
cadena esta ajustada a un ancho de 5 caracteres; Las
posiciones a la izquierda que no se usan en la conversión
se rellenan con espacios.

void WordToStr(unsigned number, char *output);

Ejemplo:
unsigned t = 437;
char *txt=“ “; // Inicializa un apuntador con 6 espacios

WordToStr(t, txt); // txt es “ 437" (dos espacios vacios)


IntToStr

Descripción: Crea una cadena de salida de un numero con signo


(Valor numérico de una variable int). La cadena esta ajustada a
un ancho de 6 caracteres; Las posiciones a la izquierda que no se
usan en la conversión se rellenan con espacios.

void IntToStr(int number, char *output);

Ejemplo:
int j = -4220;
char *txt=“ “; // Inicializa un apuntador con 6 espacios

IntToStr(j, txt); // txt es " -4220" (un espacio en blanco)


LongToStr

Descripción: Crea una cadena de salida de un numero largo con


signo (Valor numérico de una variable long). La cadena esta
ajustada a un ancho de 11 caracteres; Las posiciones a la
izquierda que no se usan en la conversión se rellenan con
espacios.

void LongToStr(long number, char *output);

Ejemplo:
long jj = -3700000;
char *txt=“ “; // Inicializa un apuntador con 12 espacios

LongToStr(jj, txt); // txt es “ -3700000" (3 espacios en blanco)


FloatToStr

Descripción: Crea una cadena de salida de un numero de punto


flotante. La cadena contiene un formato normalizado de un
numero (mantisa entre 0 y 1) con signo en la primera posición.
La mantisa esta ajustada a un formato de 6 dígitos, 0.ddddd; Hay
siempre 5 dígitos a continuación del punto decimal.

void FloatToStr(float number, char *output);

Ejemplo:
float ff = -374.2;
char *txt=“ “; // Inicializa un apuntador con 14 espacios

FloatToStr(ff, txt); // txt es "-0.37420e3"


Teclado matricial (esquemático)
Teclado matricial (funciones)

 Keypad_Init
 Keypad_Read
 Keypad_Released
Keypad_Init

 Descripción: Inicializa el puerto para trabajar con el


teclado. Las terminales del teclado deben estar
conectadas de la siguiente forma:
port.F0 columna 1
port.F1 columna 2
port.F2 columna 3
port.F3 columna 4
port.F4 fila 1
port.F5 fila 2
port.F6 fila 3
port.F7 fila 4

 void Keypad_Init(unsigned *port);


Keypad_Init 2

Ejemplo:
Keypad_Init(&PORTB);
Keypad_Read

 Descripción: Verifica si alguna tecla fue presionada. La función


regresa 1 a 12, dependiendo la tecla presionada, o 0 si no existe tecla
presionada.
1 1
2 2
… …
9 9
* 10
0 11
# 12

 unsigned short Keypad_Read(void);

 Ejemplo:
kp = Keypad_Read();
Keypad_Released

 Descripción: La llamada a la función Keypad_Released es una


función blocking call: La función espera hasta que cualquier tecla sea
presionada y liberada. Cuando se libera, la función regresa de 1 a 12,
dependiendo de la tecla presionada.

 unsigned short Keypad_Released(void);

 Ejemplo:
Keypad_Released();
10.- Teclado matricial (problema)

 Se desea un programa con el cual se muestre en un


LCD (bus 8 bits en puerto B y puerto C como
control) la tecla presionada en un teclado matricial
(puerto D).
Teclado matricial (algoritmo)

1. Configuración de puertos (teclado y lcd).


2. Lectura de teclado
3. Conversión a ASCII
4. Envío al LCD
5. Regresar a 2
Teclado matricial (diagramas de flujo)
teclado

Inicializa puertos
(LCD y teclado)

Lee teclado

Convierte a ASCII

Envía a LCD
Teclado matricial (esquemático)
Teclado matricial (programa)
unsigned short kp, cnt;
char txt[5];

void main()
{ cnt = 0;
Keypad_Init(&PORTD);
Lcd8_Init(&PORTC, &PORTB, 0, 2, 1, 7, 6, 5, 4, 3, 2, 1, 0); // Inicializa LCD en puerto B
y puerto C
Lcd8_Cmd(LCD_CLEAR); // Limpia display
Lcd8_Cmd(LCD_CURSOR_OFF); // Cursor apagado
Lcd8_Out(1, 1, "Key :");
Lcd8_Out(2, 1, "Times:");
do { kp = 0; // Espera a que se presione una tecla
pressed
do kp = Keypad_Read();
while (!kp); // Prepara valor para salida
switch (kp)
{ case 10: kp = 42;
break; // '*'
case 11: kp = 48;
break; // '0'
case 12: kp = 35;
break; // '#'
default: kp += 48;
}
cnt++;
Lcd9_Chr(1, 10, kp);
if (cnt == 255) { cnt = 0; Lcd8_Out(2, 10, " "); } // Imprime en LCD
WordToStr(cnt, txt);
Lcd8_Out(2, 10, txt);
} while (1);
Ejercicio propuesto 9

1. Realizar un programa que tome 3 números desde


un teclado matricial, los guarde en un arreglo, los
convierta a un número que se guarde en una
variable tipo entera. Con este número el alumno
deberá proporcionar el producto por 2 y división
entre 2 resultantes. Visualizando los resultados en
un LCD.
Ejercicio propuesto 9

Cual es el numero de 3 cifras: Cual es el numero de 3 cifras:


025

Cual es el numero de 3 cifras: Cual es el numero de 3 cifras:


025 025
El producto por 2 es: 050 El producto por 2 es: 050
La división entre 2 es: 012

Você também pode gostar