SlideShare une entreprise Scribd logo
1  sur  160
Télécharger pour lire hors ligne
PIC16F877
CURSO-TALLER PROGRAMACIÓN
EN LENGUAJE C PARA
MICROCONTROLADORES PIC
CARACTERÍSTICAS
• Velocidad de operación: hasta 20 MHz de reloj
• 8K x 14 bits por palabra de memoria de programa FLASH
• 368 x 8 bytes de memoria de datos (RAM)
• 256 x 8 bytes de memoria de datos EEPROM
CARACTERÍSTICAS (2)
• 14 fuentes de interrupciones
• Memoria de pila (stack) de 8 niveles de profundidad
• Protecciones:
• Power-on Reset (POR)
• Power-up Timer (PWRT)
• Oscillator Start-up Timer (OST)
• Watchdog Timer (WDT) independiente del cristal.
PUERTOS DE ENTRADAY 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 )
CARACTERÍSTICAS (PERIFÉRICOS)
• Timer 0: timer/counter de 8 bits con un pre-escalador de 8
valores.
• Timer 1: 16-bit timer/counter con pre-escalador
• Timer 2: 8-bit timer/counter con registro de estado de 8-bit,
pre-escalador y post-escalador
• Dos módulos de Capture, Compare, PWM
• Capture es de 16-bit, max. resolución es 12.5 ns
• Compare es de 16-bit, max. resolución es 200 ns
• PWM max. resolución de 10-bit
CARACTERÍSTICAS (PERIFÉRICOS 2)
• Convertidor analógico a digital de 10-bit multi-canal
• Puerto serial síncrono (SSP) con SPI. (modo maestro) e I2C
(maestro/esclavo)
• Transmisor-Receptor síncrono-asíncrono universal (USART/SCI) con 9-bit
• Puerto paralelo esclavo (PSP) con 8-bits de ancho, con terminales de control RD,
WR y CS
ARQUITECTURA INTERNA
• Arquitectura HARVARD.
• Buses separados (datos e instrucciones).
• Memoria de programa : 14 bits.
• Memoria de datos: 8 bits.
• Recursos mapeados en memoria de datos.
ARQUITECTURA INTERNA
TERMINALES FISICAS
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 )
FUNCION PORTC
Terminal Funciones
RC0 Ent. Digital Sal. Digital Sal. Osc timer 1 Ent. Contador 1
RC1 Ent. Digital Sal. Digital Ent. Osc Timer 1 Captura/Comp/PWM 1
RC2 Ent. Digital Sal. Digital Captura/Comp/PWM 2
RC3 Ent. Digital Sal. Digital Reloj sincrono SPI Reloj síncrono I2C
RC4 Ent. Digital Sal. Digital Datos entrada SPI Datos I2C
RC5 Ent. Digital Sal. Digital Datos salida SPI
RC6 Ent. Digital Sal. Digital Transmisión USART
RC7 Ent. Digital Sal. Digital Recepción USART
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
ENTRADAO SALIDA
• SALIDA DE DATOS : 0
• ENTRADADE DATOS: 1
• La asignación es individual correspondiente a cada terminal del puerto.
ACCESO INDIVIDUALDE BITS 1
• 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:
PORTC.F0 = 1;
PORTD.F5 = 0;
PORTB.F7 = 1;
Los identificadores F0–F7 no se reconocen en minúsculas.
NOTA: Entre dos accesos a bits se debe tener un retardo mínimo de 2
microsegundos.
ENTRADAO SALIDA
• Si deseamos configurar el puerto C con la siguiente
asignación:
RC0 entrada
RC1 entrada
RC2 entrada
RC3 entrada
RC4 salida
RC5 salida
RC6 salida
RC7 salida
• Posibles instrucciones a utilizar
TRISC = 0b‟00001111‟; o
TRISC = 0x0F; o
TRISC = 15;
ENTRADAO SALIDA
• Si deseamos configurar el puerto D con la siguiente
asignación:
RD0 entrada
RD1 salida
RD2 entrada
RD3 salida
RD4 entrada
RD5 salida
RD6 entrada
RD7 salida
• Debemos utilizar cualquiera de las siguientes instrucciones
TRISD = 0b‟01010101‟; o
TRISD = 0x55; o
TRISD = 85;
ENTRADAO 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
( CICLO WHILE )
// Definición de variables globales
// 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
( CICLO FOR )
// Definición de variables globales
// 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
( CICLO DO - WHILE )
// Definición de variables globales
// Definición de funciones
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 RD7 del puerto
D. El tiempo de encendido es de 1000 milisegundo y el de apagado de 300 milisegundos.
ENCENDIDO DE LED (ALGORITMO)
1. Configurar el bit 7 del puerto D como salida de datos
2. Encendido del led
3. Retardo por software de 1000 milisegundos.
4. Apagado del led
5. Retardo por software de 300 milisegundos
6. Repetir el paso 2
ENCENDIDO DE LED (DIAGRAMADE FLUJO)
Led
Configura bit del
puerto como salida
Enciende bit
Retardo de 1000ms
Apaga bit
Retardo de 300 ms
ENCENDIDO DE LED (ESQUEMÁTICO)
ENCENDIDO DE LED (PROGRAMA)
void main ( void )
{
TRISD.F7 = 0;
while( 1 )
{
PORTD.F7 = 1;
Delay_ms( 1000 );
PORTD.F7 = 0;
Delay_ms( 300 );
}
}
ENCENDIDO DE LED (PROGRAMA2)
void main ( void )
{
TRISD = 0;
while( 1 )
{
PORTD = 0x80;
Delay_ms( 1000 );
PORTD = 0;
Delay_ms( 300 );
}
}
EJERCICIOS PROPUESTOS 1
1. El alumno encenderá y apagara 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 (DIAGRAMADE FLUJO)
Luces
Configura puerto
como salida
Envía 00000001
Envía 00000010
Envía 00000100
Envía 00001000
Envía 00010000
Envía 00100000
Envía 01000000
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);
}
}
EJERCICIOS PROPUESTOS 2
1. El alumno enviara una secuencia de datos distinta por el puerto
B, utilizando retardos por software de distintas duraciones, con
incrementos de 100 milisegundos entre si.
2. El alumno enviara la secuencia de datos por el puerto A,
utilizando retardos por software con duración de 800
milisegundos.
100001
010010
001100
010010
100001
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 (DIAGRAMADE FLUJO)
Luces
Configura puerto
como salida
Limpia apuntador
Envía dato
apuntado
Incrementa
apuntador
apuntador ≥ 8 Limpia
apuntador
si
no
LUCES CON ARREGLO (PROGRAMA)
short dato [ 8 ] = {1, 2, 4, 8, 16, 32, 64, 128};
short apunta;
void main(void)
{
TRISB = 0; // Configura puerto
apunta = 0; // Limpia apuntador
while(1) // Ciclo infinito
{
PORTB = dato [ apunta ]; // Envía dato
Delay_ms(1000);
apunta ++; // Incrementa apuntador
if ( apunta > = 8 ) // Si apuntador ≥ 8
apunta = 0; // Limpia apuntador
}
}
EJERCICIOS PROPUESTOS 3
1. El alumno enviara 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
(DIAGRAMADE FLUJO)
Luces
Configura puerto
como salida
Inicializa variable
Envía variable
al puerto
Modifica
variable
variable = 0 Inicializa
variable
si
no
LUCES CON DESPLAZAMIENTO
(PROGRAMA1)
void main ( void )
{ unsigned short dato;
TRISD = 0;
dato = 0b00000001;
while ( 1 )
{
PORTD = dato;
Delay_ms ( 300 );
dato = dato << 1;
if ( dato == 0 )
dato = 0x01;
}
}
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.
LUCES CON DESPLAZAMIENTO
(PROGRAMA2)
void main ( void )
{ unsigned short dato;
TRISD = 0;
dato = 1;
while ( 1 )
{
PORTD = dato;
Delay_ms (250);
dato = dato * 2;
if ( dato == 0 )
dato = 0x01;
}
}
EJERCICIOS PROPUESTOS 4
1. El alumno realizara 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
ACCESOA 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
(DIAGRAMADE FLUJO)
Luces
Configura puertos
RD salida, RA entrada
Limpia contador
Envía
secuencia_izquierda
Incrementa
contador
Contador = 10 Limpia
contador
si
no
RA0 = 0
Envía
Secuencia_derecha
si
no
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;
}
}
EJERCICIOS PROPUESTOS 5
1. El alumno desarrollara 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.
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
• Unipolar.- Tiene 4 bobinas independientes (A, B, C, D) y
dos terminales comunes.
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
SECUENCIADE ACTIVACIÓN 5
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
•Bipolar.- Movimiento de medio paso
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 )
EJERCICIOS PROPUESTOS 5
2.- El alumno desarrollara 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 (DIAGRAMADE
FLUJO)
Configura puertos
Inicia variables
Display
Envía decena
Envía unidad
Incrementa unidad
Unidades>’9’
Limpia unidades
Incrementa decenas
Decenas>’9’
Limpia decenas
si
si
no
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 6 (D7SEG)
• El alumno modificara 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)
DISPLAY DE CRISTAL LIQUIDO
LCD (FUNCIONES BUS 8 BITS)
• Lcd8_Config
• Lcd8_Init
• Lcd8_Out
• Lcd8_Out_Cp
• Lcd8_Chr
• Lcd8_Chr_Cp
• Lcd8_Cmd
LCD8_CONFIG
• Descripción: Inicializa el LCD usando un bus de datos de 8 bits. Los puertos de Control (ctrlport) y
Datos (dataport) usan la asignación de terminales especificada.
• void Lcd8_Config( unsigned short *ctrlport,
unsigned short *dataport,
unsigned short RS,
unsigned short EN,
unsigned short WR,
unsigned short D7,
unsigned short D6,
unsigned short D5,
unsigned short D4,
unsigned short D3,
unsigned short D2,
unsigned short D1,
unsigned short D0 );
LCD8_CONFIG 2
Ejemplo:
Lcd8_Config(&PORTC,&PORTD,0,1,2,0,1,2,3,4,5,6,7);
LCD8_INIT
• Descripción: Inicializa el LCD usando un bus de 8 bits. Los puertos de
Control (ctrlport) y Datos (dataport) usan la siguiente asignación de
terminales.-
E → ctrlport.3
RS → ctrlport.2
R/W → ctrlport.0
D7 → dataport.7
D6 → dataport.6
D5 → dataport.5
D4 → dataport.4
D3 → dataport.3
D2 → dataport.2
D1 → dataport.1
D0 → dataport.0
• void Lcd8_Init(unsigned short *ctrlport, unsigned short *dataport);
LCD8_INIT 2
Ejemplo:
Lcd8_Init(&PORTB, &PORTC);
LCD8_OUT
• Descripción: Imprime mensaje en el LCD en la fila y
columna especificada (row y col).
• void Lcd8_Out( unsigned short row,
unsigned short col,
char *text );
• Ejemplo:
-Imprime “Hello!” en el LCD en la linea 1, columna 3
Lcd8_Out(1, 3, "Hello!");
LCD8_OUT_CP
• Descripción: Imprime mensaje en el LCD en la posición actual del cursor.
• void Lcd8_Out_Cp(char *text);
• Ejemplo: Imprime “Here!” en la posición actual del cursor
Lcd8_Out_Cp("Here!");
LCD8_CHR
• Descripción: Imprime un caracter en el LCD en la fila y
columna especificada (row y col).
• void Lcd8_Chr( unsigned short row,
unsigned short col,
char character );
Ejemplo: Imprime la letra “i” en el LCD en la línea 2,y
columna 3
Lcd8_Out(2, 3, 'i');
LCD8_CHR_CP
• Descripción: Imprime un caracter en el LCD en la posición actual del cursor.
• void Lcd8_Chr_Cp(char character);
• Ejemplo: Imprime la letra “e” en la posición actual del cursor
Lcd8_Chr_Cp('e');
LCD8_CMD
• Descripción: Envía un comando al LCD. Se puede pasar a la función una de las
constantes predefinidas.
• void Lcd8_Cmd(unsigned short command);
• Ejemplo: Limpia el LCD
Lcd8_Cmd(LCD_CLEAR);
COMANDOS PREDEFINIDOS
Comando Función
LCD_FIRST_ROW Mueve el cursor a la 1a. fila.
LCD_SECOND_ROW Mueve el cursor a la 2a. fila.
LCD_THIRD_ROW Mueve el cursor a la 3a. fila.
LCD_FOURTH_ROW Mueve el cursor a la 4a. fila.
LCD_CLEAR Limpia el display.
LCD_RETURN_HOME Regresa elcursora la posición1,1.Los datos de la RAM no son
afectados.
LCD_CURSOR_OFF Apaga el cursor.
LCD_UNDERLINE_ON Coloca el caractersubrayado.
LCD_BLINK_CURSOR_ON Parpadeo delcursor.
LCD_MOVE_CURSOR_LEFT Mueve el cursor haciala izquierda sin cambiar la RAM
LCD_MOVE_CURSOR_RIGHT Mueve el cursor haciala derecha sin cambiarel contenido de la RAM
LCD_TURN_ON Enciende eldisplay
LCD_TURN_OFF Apaga el display
LCD_SHIFT_LEFT Mueve el display haciala izquierda sin cambiar elcontenidode la RAM
LCD_SHIFT_RIGHT Mueve el display haciala derecha sin cambiarel contenido de la RAM
7.- LCD 8 BITS
• Diseñar el programa que inicialice un LCD, usando un bus de datos de 8 bits, y a
continuación mande un mensaje de bienvenida. El mensaje debe desplazarse hacia la
izquierda en forma continua.
LCD 8 BITS (ALGORITMO)
1. Inicialice los puertos de datos y control.
2. Envía mensaje a desplegar.
3. Envía comando de desplazamiento hacia la izquierda.
4. Repite el paso 3.
LCD 8 BITS (DIAGRAMADE FLUJO)
Inicializa puertos de
datos y control
Envía mensaje
Envía comando de
Corrimiento a la izq.
LCD 8 bits
LCD 8 BITS (ESQUEMÁTICO)
LCD 8 BITS (PROGRAMA1)
Void main(void)
{ TRISB = 0;
TRISC = 0;
Lcd8_Config(&PORTC,&PORTB,0,2,1,7,6,5,4,3,2,1,0);
Lcd8_Out(1,1,”Hola mundo cruel”);
while(1)
{
Lcd8_Cmd(LCD_SHIFT_LEFT);
Delay_ms(100);
}
}
LCD 8 BITS (PROGRAMA2)
char mensaje[ ] = “Programa numero 2”;
void main(void)
{ TRISB = 0;
TRISC = 0;
Lcd8_Config(&PORTC,&PORTB,0,2,1,7,6,5,4,3,2,1,0);
Lcd8_Out(1,1,mensaje);
while(1)
{
Lcd8_Cmd(LCD_SHIFT_LEFT);
Delay_ms(500);
}
}
LCD 8 BITS (ESQUEMÁTICO)
LCD 8 BITS (PROGRAMA3)
char *mensaje3 = “mensaje tres”;
void main(void)
{ TRISB = 0;
TRISC = 0;
Lcd8_Init(&PORTC,&PORTB);
Lcd8_Out(1,1,mensaje3);
Lcd8_Out(2,1,”segunda fila”);
while(1)
{
Lcd8_Cmd(LCD_SHIFT_LEFT);
Delay_ms(50);
}
EJERCICIOS PROPUESTOS 7
1. Programa que forme la palabra „HOLA‟ en un LCD,
configurado para utilizar un bus de 8 bits. Las letras
deben desplazarse de derecha a izquierda. Primero
debe aparecer la H, moviendose desde la derecha a
la primer columna a la izquierda. Enseguida debe
aparecer la O, tambien saliendo de la derecha y
terminando a la derecha de la letra H. Lo mismo
debe suceder para las letras L y A. El programa debe
ser ciclico.
EJERCICIO PROPUESTO 8
H
H
H O
H
O
O
H
H
HO
H O L A
L
.
.
.
LCD (FUNCIONES BUS 4 BITS)
• Lcd_Config
• Lcd_Init
• Lcd_Out
• Lcd_Out_Cp
• Lcd_Chr
• Lcd_Chr_Cp
• Lcd_Cmd
LCD_CONFIG
• Descripción: Inicializa LCD usando un bus de datos de 4
bits. El puerto de Control (ctrlport) y Datos (dataport) tiene las
asignaciones de terminales especificadas.
• void Lcd_Config( unsigned short *ctrl_data_port,
unsigned short RS,
unsigned short EN,
unsigned short WR,
unsigned short D7,
unsigned short D6,
unsigned short D5,
unsigned short D4 );
LCD_CONFIG 2
Ejemplo:
Lcd_Config(&PORTC,0,1,2,4,5,6,7);
LCD_INIT
• Descripción: Inicializa el LCD usando un bus de 4 bits.
El puerto de Control (ctrlport) y Datos (dataport) tiene la
siguiente asignación de terminales.-
E → ctrl_data_port.3
RS → ctrl_data_port.2
D7 → ctrl_data_port.7
D6 → ctrl_data_port.6
D5 → ctrl_data_port.5
D4 → ctrl_data_port.4
• void Lcd_Init(unsigned short *ctrl_data_port);
LCD_INIT 2
Ejemplo:
Lcd_Init(&PORTB);
LCD_OUT
• Descripción: Imprime mensaje en el LCD en la fila y
columna especificada (row y col).
• void Lcd_Out( unsigned short row,
unsigned short col,
char *text );
• Ejemplo:
-Imprime “Hello!” en el LCD en la línea 1, columna 3
Lcd_Out(1, 3, "Hello!");
LCD_OUT_CP
• Descripción: Imprime mensaje en el LCD en la
posición actual del cursor.
• void Lcd_Out_Cp(char *text);
• Ejemplo:
- Imprime “Here!” en la posición actual del cursor
Lcd_Out_Cp("Here!");
LCD_CHR
• Descripción: Imprime un caracter en el LCD en la fila
y columna especificada (row y col).
• void Lcd_Chr( unsigned short row,
unsigned short col,
char character );
Ejemplo:
- Imprime la letra „i‟ en el LCD en la línea 2,y columna 3
Lcd_Out(2, 3, 'i');
LCD_CHR_CP
• Descripción: Imprime un caracter en el LCD en la
posición actual del cursor.
• void Lcd_Chr_Cp(char character);
• Ejemplo:
- Imprime la letra „e‟ en la posición actual del cursor
Lcd_Chr_Cp('e');
LCD_CMD
• Descripción: Envía un comando al LCD. Se puede pasar a la
función una de las constantes predefinidas. Los comandos son
los mismos para ambos modos de manejo del LCD (bus 8 o 4
bits).
• void Lcd_Cmd(unsigned short command);
• Ejemplo:
- Apaga el cursor, no aparece en el LCD
Lcd_Cmd(LCD_CURSOR_OFF);
8.- LCD 4 BITS
• Diseñar el programa que inicialice un LCD, usando un bus de datos de 4 bits, y a
continuación mande un mensaje cualquiera de bienvenida. El mensaje debe desplazarse
hacia la derecha en forma continua.
LCD 4 BITS (ALGORITMO)
1. Inicialice los puertos de datos y control.
2. Envía mensaje a desplegar.
3. Envía comando de desplazamiento hacia la derecha.
4. Repite el paso 3.
LCD 4 BITS (DIAGRAMADE FLUJO)
Inicializa puertos de
datos y control
Envía mensaje
Envía comando de
Corrimiento a la der.
LCD 8 bits
LCD 4 BITS (ESQUEMÁTICO CONFIG)
LCD 4 BITS (PROGRAMA1)
void main(void)
{ TRISD = 0;
Lcd_Config(&PORTD,0,2,1,7,6,5,4);
Lcd_Out(1,1,”Envio de datos”);
Lcd_Out(2,1,”Usando bus de 4 bits”);
while(1)
{
Lcd_Cmd(LCD_SHIFT_RIGHT);
Delay_ms(200);
}
}
LCD 4 BITS (PROGRAMA2)
char mensaje[11]={„B‟, „u‟, „s‟, „ ‟, „4‟, „ ‟, „b‟, „i‟, „t‟, „s‟, „0‟};
void main(void)
{ TRISD = 0;
Lcd_Config(&PORTD,0,2,1,7,6,5,4);
Lcd_Out(1, 6, mensaje);
while(1)
{
Lcd_Cmd(LCD_SHIFT_RIGHT);
Delay_ms(200);
}
}
LCD 4 BITS (ESQUEMÁTICO INIT)
LCD 4 BITS (PROGRAMA3)
char *mensaje3 = “programa 3 usando bus 4 bits”;
void main(void)
{ TRISB = 0;
TRISC = 0;
Lcd8_Init(&PORTC,&PORTB);
Lcd8_Out(1,16,mensaje3);
Lcd8_Out(2,1,”fila=2 columna=5”);
while(1)
{
Lcd8_Cmd(LCD_SHIFT_LEFT);
Delay_ms(50);
}
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"
9.- CONTADOR 0-9 (PROBLEMA)
• Se quiere un programa que visualice un conteo de 0 a 9 en un LCD.
CONTADOR 0-9 (ALGORITMO)
1. Configura el LCD
2. Inicializa el contador
3. Convierte a ASCII el valor del contador
4. Envía valor en ASCII al LCD
5. Incrementa el contador
6. Regresa a 3
CONTADOR 0-9 (DIAGRAMADE FLUJO)
teclado
Inicializa puertos
(LCD)
Convierte contador
a ASCII
Envía a LCD
ASCII
Incrementa
contador
Inicializa contador
CONTADOR 0-9 (PROGRAMA)
void main(void)
{ unsigned short contador;
char cadena[ 5 ] = “ “;
TRISD = 0;
Lcd_Config(&PORTD,0,2,1,7,6,5,4);
contador = 0;
Lcd_Out(1,1,”Contador 0-9”);
while(1)
{
ShortToStr ( contador , cadena );
Lcd_Out ( 2 , 8 , cadena );
contador ++;
Delay_ms(500);
CONTADOR 0-9 (ESQUEMÁTICO)
CONTADOR 0-9 (FUNCIONAMIENTO)
Contador 0-9 :
0
Contador 0-9 :
1
Contador 0-9 :
2
Contador 0-9 :
3
Contador 0-9 :
4
Contador 0-9 :
5
Contador 0-9 :
6
Contador 0-9 :
9
. . .
EJERCICIO PROPUESTO 8
1. Programa que utilice un LCD, configurado para usar
un bus de 8 bits. En el LCD deben aparecer en forma
secuencial, los números de la secuencia 1 – 2 – 4 – 8 –
16 – 32 – 64 – 128 – 256 – 512 – 1024 – 2048 – 4096 – 8192
– 16384 - 32768. Los numero deben ser generados por
operaciones aritméticas. El desplegado debe hacerse
de la forma mostrada en las siguientes figuras. Se
utiliza la segunda fila, presentando hasta 3 numeros
consecutivos, un numero a la izquierda, uno mas al
centro y otro a la derecha.
EJERCICIO PROPUESTO 8
Serie de numeros Serie de numeros
1
Serie de numeros
1 2
Serie de numeros
1 2 4
Serie de numeros
8
Serie de numeros
8 16
Serie de numeros
8 16 32
Serie de numeros
8192 16384 32768
. . .
EJERCICIO PROPUESTO 9
1. El alumno diseñara un programa en donde se muestre en un LCD los números desde
00 hasta el 99. Con un intervalo de tiempo entre cambio igual a 500 milisegundos.
EJERCICIO PROPUESTO 9
Contador 00-99 cada 500 mseg
00
Contador 00-99 cada 500 mseg
01
Contador 00-99 cada 500 mseg
02
Contador 00-99 cada 500 mseg
03
Contador 00-99 cada 500 mseg
04
Contador 00-99 cada 500 mseg
05
Contador 00-99 cada 500 mseg
06
Contador 00-99 cada 500 mseg
99
. . .
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. El alumno realizara un programa que tome 3 números desde un teclado matricial, los
guarde en un arreglo, los convierta a un numero que se guarde en una variable tipo
entera. Con este numero 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:
025
El producto por 2 es: 050
Cual es el numero de 3 cifras:
025
El producto por 2 es: 050
La división entre 2 es: 012

Contenu connexe

Tendances

FET (Transistores de Efecto de Campo)
FET (Transistores de Efecto de Campo)FET (Transistores de Efecto de Campo)
FET (Transistores de Efecto de Campo)
Jorge Cortés Alvarez
 
Conceptos basicos de_vhdl
Conceptos basicos de_vhdlConceptos basicos de_vhdl
Conceptos basicos de_vhdl
Angie Cardenas
 

Tendances (20)

Ejercicios 07 interrupciones
Ejercicios 07 interrupcionesEjercicios 07 interrupciones
Ejercicios 07 interrupciones
 
PROYECTOS CON PIC 16F84
PROYECTOS CON PIC 16F84PROYECTOS CON PIC 16F84
PROYECTOS CON PIC 16F84
 
Guia osciladores pic18f4550
Guia osciladores pic18f4550Guia osciladores pic18f4550
Guia osciladores pic18f4550
 
ADC and its Circuit design
ADC and its Circuit designADC and its Circuit design
ADC and its Circuit design
 
Modulador y demodulador ask
Modulador y demodulador askModulador y demodulador ask
Modulador y demodulador ask
 
Verilog tutorial
Verilog tutorialVerilog tutorial
Verilog tutorial
 
FET (Transistores de Efecto de Campo)
FET (Transistores de Efecto de Campo)FET (Transistores de Efecto de Campo)
FET (Transistores de Efecto de Campo)
 
Modulacion pwm
Modulacion pwmModulacion pwm
Modulacion pwm
 
Programacion en WinCupl
Programacion en WinCuplProgramacion en WinCupl
Programacion en WinCupl
 
circuitos de temperatura con LM741 y termistor
circuitos de temperatura con LM741 y termistorcircuitos de temperatura con LM741 y termistor
circuitos de temperatura con LM741 y termistor
 
Transistoresfet
TransistoresfetTransistoresfet
Transistoresfet
 
programacion con microcontrolador pic 16f84
programacion con microcontrolador pic 16f84programacion con microcontrolador pic 16f84
programacion con microcontrolador pic 16f84
 
PWM con PIC16F877A: Modulos y Registros Involucrados
PWM con PIC16F877A: Modulos y Registros InvolucradosPWM con PIC16F877A: Modulos y Registros Involucrados
PWM con PIC16F877A: Modulos y Registros Involucrados
 
Simulacion ac ac
Simulacion ac acSimulacion ac ac
Simulacion ac ac
 
Conceptos basicos de_vhdl
Conceptos basicos de_vhdlConceptos basicos de_vhdl
Conceptos basicos de_vhdl
 
Arduino consola y puerto serie
Arduino consola y puerto serieArduino consola y puerto serie
Arduino consola y puerto serie
 
Micro2 tema 2
Micro2 tema 2Micro2 tema 2
Micro2 tema 2
 
TIMERS&TEMPORIZADORES EN "C"
TIMERS&TEMPORIZADORES EN "C"TIMERS&TEMPORIZADORES EN "C"
TIMERS&TEMPORIZADORES EN "C"
 
PROGRAMACION DE LOS PIC 2021-1.pdf
PROGRAMACION DE LOS  PIC 2021-1.pdfPROGRAMACION DE LOS  PIC 2021-1.pdf
PROGRAMACION DE LOS PIC 2021-1.pdf
 
Fuentes dvd
Fuentes dvdFuentes dvd
Fuentes dvd
 

Similaire à pic16f877-con-mikroc.pdf

Curso de lenguaje c para microcontroladores pic dia 1(2)(2)(2)(2)(2)(2)
Curso de lenguaje c para microcontroladores pic dia 1(2)(2)(2)(2)(2)(2)Curso de lenguaje c para microcontroladores pic dia 1(2)(2)(2)(2)(2)(2)
Curso de lenguaje c para microcontroladores pic dia 1(2)(2)(2)(2)(2)(2)
Franz Amaya
 
28812521 Practica1 1
28812521 Practica1 128812521 Practica1 1
28812521 Practica1 1
carlos
 
Curso de programacion en c++ para microcontroladores pic 16 f87xx
Curso de programacion en c++ para microcontroladores pic 16 f87xxCurso de programacion en c++ para microcontroladores pic 16 f87xx
Curso de programacion en c++ para microcontroladores pic 16 f87xx
Jose Manuel Mansilla Carrasco
 
Curso de programacion en c++ para microcontroladores pic 16 f87xx
Curso de programacion en c++ para microcontroladores pic 16 f87xxCurso de programacion en c++ para microcontroladores pic 16 f87xx
Curso de programacion en c++ para microcontroladores pic 16 f87xx
freddymadriz
 
Curso de programacion en c++ para microcontroladores pic 16 f87xx
Curso de programacion en c++ para microcontroladores pic 16 f87xxCurso de programacion en c++ para microcontroladores pic 16 f87xx
Curso de programacion en c++ para microcontroladores pic 16 f87xx
Jose Manuel Mansilla Carrasco
 
381429156-PLC-DVP-Fundamentals-RevB.pdf
381429156-PLC-DVP-Fundamentals-RevB.pdf381429156-PLC-DVP-Fundamentals-RevB.pdf
381429156-PLC-DVP-Fundamentals-RevB.pdf
elkinmeza1
 

Similaire à pic16f877-con-mikroc.pdf (20)

Curso de lenguaje c para microcontroladores pic dia 1(2)(2)(2)(2)(2)(2)
Curso de lenguaje c para microcontroladores pic dia 1(2)(2)(2)(2)(2)(2)Curso de lenguaje c para microcontroladores pic dia 1(2)(2)(2)(2)(2)(2)
Curso de lenguaje c para microcontroladores pic dia 1(2)(2)(2)(2)(2)(2)
 
Clase 2
Clase 2Clase 2
Clase 2
 
28683892 Practica1 1
28683892 Practica1 128683892 Practica1 1
28683892 Practica1 1
 
Introducción Arquitectura Microcontroladores.pdf
Introducción Arquitectura Microcontroladores.pdfIntroducción Arquitectura Microcontroladores.pdf
Introducción Arquitectura Microcontroladores.pdf
 
Introduccion al DSC dsPIC30F4013.pptx
Introduccion al DSC dsPIC30F4013.pptxIntroduccion al DSC dsPIC30F4013.pptx
Introduccion al DSC dsPIC30F4013.pptx
 
28812521 Practica1 1
28812521 Practica1 128812521 Practica1 1
28812521 Practica1 1
 
⭐⭐⭐⭐⭐ (Práctica 5) DESARROLLO DE APLICACIONES CON #PIC16F886
⭐⭐⭐⭐⭐ (Práctica 5) DESARROLLO DE APLICACIONES CON #PIC16F886⭐⭐⭐⭐⭐ (Práctica 5) DESARROLLO DE APLICACIONES CON #PIC16F886
⭐⭐⭐⭐⭐ (Práctica 5) DESARROLLO DE APLICACIONES CON #PIC16F886
 
Micro
MicroMicro
Micro
 
Pic16 f877
Pic16 f877Pic16 f877
Pic16 f877
 
Microcontroladores: Fundamentos de microprocesadores y microcontroladores
Microcontroladores: Fundamentos de microprocesadores y microcontroladoresMicrocontroladores: Fundamentos de microprocesadores y microcontroladores
Microcontroladores: Fundamentos de microprocesadores y microcontroladores
 
Presentacionarduino
PresentacionarduinoPresentacionarduino
Presentacionarduino
 
Curso de programacion en c++ para microcontroladores pic 16 f87xx
Curso de programacion en c++ para microcontroladores pic 16 f87xxCurso de programacion en c++ para microcontroladores pic 16 f87xx
Curso de programacion en c++ para microcontroladores pic 16 f87xx
 
Curso de programacion en c++ para microcontroladores pic 16 f87xx
Curso de programacion en c++ para microcontroladores pic 16 f87xxCurso de programacion en c++ para microcontroladores pic 16 f87xx
Curso de programacion en c++ para microcontroladores pic 16 f87xx
 
Curso de programacion en c++ para microcontroladores pic 16 f87xx
Curso de programacion en c++ para microcontroladores pic 16 f87xxCurso de programacion en c++ para microcontroladores pic 16 f87xx
Curso de programacion en c++ para microcontroladores pic 16 f87xx
 
381429156-PLC-DVP-Fundamentals-RevB.pdf
381429156-PLC-DVP-Fundamentals-RevB.pdf381429156-PLC-DVP-Fundamentals-RevB.pdf
381429156-PLC-DVP-Fundamentals-RevB.pdf
 
⭐⭐⭐⭐⭐ (Práctica 6) DESARROLLO DE APLICACIONES CON PIC16F886
⭐⭐⭐⭐⭐ (Práctica 6) DESARROLLO DE APLICACIONES CON PIC16F886⭐⭐⭐⭐⭐ (Práctica 6) DESARROLLO DE APLICACIONES CON PIC16F886
⭐⭐⭐⭐⭐ (Práctica 6) DESARROLLO DE APLICACIONES CON PIC16F886
 
⭐⭐⭐⭐⭐ (Práctica 4) DESARROLLO DE APLICACIONES CON #PIC16F886
⭐⭐⭐⭐⭐ (Práctica 4) DESARROLLO DE APLICACIONES CON #PIC16F886⭐⭐⭐⭐⭐ (Práctica 4) DESARROLLO DE APLICACIONES CON #PIC16F886
⭐⭐⭐⭐⭐ (Práctica 4) DESARROLLO DE APLICACIONES CON #PIC16F886
 
1. microcontrolador
1. microcontrolador1. microcontrolador
1. microcontrolador
 
Arduino uno
Arduino unoArduino uno
Arduino uno
 
Cartilla pic16f877
Cartilla pic16f877Cartilla pic16f877
Cartilla pic16f877
 

Dernier (6)

Vision de asignatura ESTRUCTURA DE DATOS.pptx
Vision de asignatura ESTRUCTURA DE DATOS.pptxVision de asignatura ESTRUCTURA DE DATOS.pptx
Vision de asignatura ESTRUCTURA DE DATOS.pptx
 
LAS TETAS DE MARIA GUEVARA REVISTA DIGITAL INF.pdf
LAS TETAS DE MARIA GUEVARA REVISTA DIGITAL INF.pdfLAS TETAS DE MARIA GUEVARA REVISTA DIGITAL INF.pdf
LAS TETAS DE MARIA GUEVARA REVISTA DIGITAL INF.pdf
 
PPT obligaciones ambientales oefa minan.pptx
PPT obligaciones ambientales oefa minan.pptxPPT obligaciones ambientales oefa minan.pptx
PPT obligaciones ambientales oefa minan.pptx
 
PPT SESION 5 ARTE Y CREATIVIDAD (1).pptx
PPT SESION 5 ARTE Y CREATIVIDAD (1).pptxPPT SESION 5 ARTE Y CREATIVIDAD (1).pptx
PPT SESION 5 ARTE Y CREATIVIDAD (1).pptx
 
Taller construcción de Prototipos Uno uML
Taller construcción de Prototipos Uno uMLTaller construcción de Prototipos Uno uML
Taller construcción de Prototipos Uno uML
 
477407774-EMBRIOLOGIA-DEL-SISTEMA-NERVIOSO.pptx
477407774-EMBRIOLOGIA-DEL-SISTEMA-NERVIOSO.pptx477407774-EMBRIOLOGIA-DEL-SISTEMA-NERVIOSO.pptx
477407774-EMBRIOLOGIA-DEL-SISTEMA-NERVIOSO.pptx
 

pic16f877-con-mikroc.pdf

  • 1. PIC16F877 CURSO-TALLER PROGRAMACIÓN EN LENGUAJE C PARA MICROCONTROLADORES PIC
  • 2. CARACTERÍSTICAS • Velocidad de operación: hasta 20 MHz de reloj • 8K x 14 bits por palabra de memoria de programa FLASH • 368 x 8 bytes de memoria de datos (RAM) • 256 x 8 bytes de memoria de datos EEPROM
  • 3. CARACTERÍSTICAS (2) • 14 fuentes de interrupciones • Memoria de pila (stack) de 8 niveles de profundidad • Protecciones: • Power-on Reset (POR) • Power-up Timer (PWRT) • Oscillator Start-up Timer (OST) • Watchdog Timer (WDT) independiente del cristal.
  • 4. PUERTOS DE ENTRADAY 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 )
  • 5. CARACTERÍSTICAS (PERIFÉRICOS) • Timer 0: timer/counter de 8 bits con un pre-escalador de 8 valores. • Timer 1: 16-bit timer/counter con pre-escalador • Timer 2: 8-bit timer/counter con registro de estado de 8-bit, pre-escalador y post-escalador • Dos módulos de Capture, Compare, PWM • Capture es de 16-bit, max. resolución es 12.5 ns • Compare es de 16-bit, max. resolución es 200 ns • PWM max. resolución de 10-bit
  • 6. CARACTERÍSTICAS (PERIFÉRICOS 2) • Convertidor analógico a digital de 10-bit multi-canal • Puerto serial síncrono (SSP) con SPI. (modo maestro) e I2C (maestro/esclavo) • Transmisor-Receptor síncrono-asíncrono universal (USART/SCI) con 9-bit • Puerto paralelo esclavo (PSP) con 8-bits de ancho, con terminales de control RD, WR y CS
  • 7. ARQUITECTURA INTERNA • Arquitectura HARVARD. • Buses separados (datos e instrucciones). • Memoria de programa : 14 bits. • Memoria de datos: 8 bits. • Recursos mapeados en memoria de datos.
  • 10. 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
  • 11. 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
  • 12. 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 )
  • 13. FUNCION PORTC Terminal Funciones RC0 Ent. Digital Sal. Digital Sal. Osc timer 1 Ent. Contador 1 RC1 Ent. Digital Sal. Digital Ent. Osc Timer 1 Captura/Comp/PWM 1 RC2 Ent. Digital Sal. Digital Captura/Comp/PWM 2 RC3 Ent. Digital Sal. Digital Reloj sincrono SPI Reloj síncrono I2C RC4 Ent. Digital Sal. Digital Datos entrada SPI Datos I2C RC5 Ent. Digital Sal. Digital Datos salida SPI RC6 Ent. Digital Sal. Digital Transmisión USART RC7 Ent. Digital Sal. Digital Recepción USART
  • 14. 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
  • 15. 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
  • 16. 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
  • 17. 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
  • 18. 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 */
  • 19. 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‟;
  • 20. REGISTROS ASOCIADOS Entrada/salida Configuración • PORTA TRISA • PORTB TRISB • PORTC TRISC • PORTD TRISD • PORTE TRISE
  • 21. ENTRADAO SALIDA • SALIDA DE DATOS : 0 • ENTRADADE DATOS: 1 • La asignación es individual correspondiente a cada terminal del puerto.
  • 22. ACCESO INDIVIDUALDE BITS 1 • 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: PORTC.F0 = 1; PORTD.F5 = 0; PORTB.F7 = 1; Los identificadores F0–F7 no se reconocen en minúsculas. NOTA: Entre dos accesos a bits se debe tener un retardo mínimo de 2 microsegundos.
  • 23. ENTRADAO SALIDA • Si deseamos configurar el puerto C con la siguiente asignación: RC0 entrada RC1 entrada RC2 entrada RC3 entrada RC4 salida RC5 salida RC6 salida RC7 salida • Posibles instrucciones a utilizar TRISC = 0b‟00001111‟; o TRISC = 0x0F; o TRISC = 15;
  • 24. ENTRADAO SALIDA • Si deseamos configurar el puerto D con la siguiente asignación: RD0 entrada RD1 salida RD2 entrada RD3 salida RD4 entrada RD5 salida RD6 entrada RD7 salida • Debemos utilizar cualquiera de las siguientes instrucciones TRISD = 0b‟01010101‟; o TRISD = 0x55; o TRISD = 85;
  • 25. ENTRADAO 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;
  • 26. ADCON1 ADCON1 = 0 0 0 0 0 1 1 0 ADCON1 = 6 ;
  • 27. 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 */
  • 28. ESTRUCTURA DE UN PROGRAMA EN C ( CICLO WHILE ) // Definición de variables globales // 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 } }
  • 29. ESTRUCTURA DE UN PROGRAMA EN C ( CICLO FOR ) // Definición de variables globales // 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 } }
  • 30. ESTRUCTURA DE UN PROGRAMA EN C ( CICLO DO - WHILE ) // Definición de variables globales // Definición de funciones void main(void) { // Definición de variables locales // Configuración de registros (recursos y puertos) // ciclo infinito do { // Programa de usuario } while ( 1 ) ; }
  • 31. 1.- ENCENDIDO DE LED • Crear un programa que encienda y apague un led, ubicado en la terminal RD7 del puerto D. El tiempo de encendido es de 1000 milisegundo y el de apagado de 300 milisegundos.
  • 32. ENCENDIDO DE LED (ALGORITMO) 1. Configurar el bit 7 del puerto D como salida de datos 2. Encendido del led 3. Retardo por software de 1000 milisegundos. 4. Apagado del led 5. Retardo por software de 300 milisegundos 6. Repetir el paso 2
  • 33. ENCENDIDO DE LED (DIAGRAMADE FLUJO) Led Configura bit del puerto como salida Enciende bit Retardo de 1000ms Apaga bit Retardo de 300 ms
  • 34. ENCENDIDO DE LED (ESQUEMÁTICO)
  • 35. ENCENDIDO DE LED (PROGRAMA) void main ( void ) { TRISD.F7 = 0; while( 1 ) { PORTD.F7 = 1; Delay_ms( 1000 ); PORTD.F7 = 0; Delay_ms( 300 ); } }
  • 36. ENCENDIDO DE LED (PROGRAMA2) void main ( void ) { TRISD = 0; while( 1 ) { PORTD = 0x80; Delay_ms( 1000 ); PORTD = 0; Delay_ms( 300 ); } }
  • 37. EJERCICIOS PROPUESTOS 1 1. El alumno encenderá y apagara 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.
  • 38. 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
  • 39. 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
  • 40. LUCES SECUENCIALES (DIAGRAMADE FLUJO) Luces Configura puerto como salida Envía 00000001 Envía 00000010 Envía 00000100 Envía 00001000 Envía 00010000 Envía 00100000 Envía 01000000 Envía 10000000
  • 42. 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); } }
  • 43. EJERCICIOS PROPUESTOS 2 1. El alumno enviara una secuencia de datos distinta por el puerto B, utilizando retardos por software de distintas duraciones, con incrementos de 100 milisegundos entre si. 2. El alumno enviara la secuencia de datos por el puerto A, utilizando retardos por software con duración de 800 milisegundos. 100001 010010 001100 010010 100001
  • 44. 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];
  • 45. 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";
  • 46. 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.
  • 47. 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
  • 48. 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.
  • 49. LUCES CON ARREGLO (DIAGRAMADE FLUJO) Luces Configura puerto como salida Limpia apuntador Envía dato apuntado Incrementa apuntador apuntador ≥ 8 Limpia apuntador si no
  • 50. LUCES CON ARREGLO (PROGRAMA) short dato [ 8 ] = {1, 2, 4, 8, 16, 32, 64, 128}; short apunta; void main(void) { TRISB = 0; // Configura puerto apunta = 0; // Limpia apuntador while(1) // Ciclo infinito { PORTB = dato [ apunta ]; // Envía dato Delay_ms(1000); apunta ++; // Incrementa apuntador if ( apunta > = 8 ) // Si apuntador ≥ 8 apunta = 0; // Limpia apuntador } }
  • 51. EJERCICIOS PROPUESTOS 3 1. El alumno enviara una secuencia por el puerto B usando los valores almacenado en un arreglo. 00000011 00000110 00001100 00011000 00110000 01100000 11000000
  • 52. 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.
  • 53. 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 */
  • 54. 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.
  • 55. 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.
  • 56. LUCES CON DESPLAZAMIENTO (DIAGRAMADE FLUJO) Luces Configura puerto como salida Inicializa variable Envía variable al puerto Modifica variable variable = 0 Inicializa variable si no
  • 57. LUCES CON DESPLAZAMIENTO (PROGRAMA1) void main ( void ) { unsigned short dato; TRISD = 0; dato = 0b00000001; while ( 1 ) { PORTD = dato; Delay_ms ( 300 ); dato = dato << 1; if ( dato == 0 ) dato = 0x01; } }
  • 58. 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.
  • 59. LUCES CON DESPLAZAMIENTO (PROGRAMA2) void main ( void ) { unsigned short dato; TRISD = 0; dato = 1; while ( 1 ) { PORTD = dato; Delay_ms (250); dato = dato * 2; if ( dato == 0 ) dato = 0x01; } }
  • 60. EJERCICIOS PROPUESTOS 4 1. El alumno realizara 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
  • 61. ACCESOA 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.
  • 62. 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.
  • 63. 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
  • 64. SECUENCIAS CONDICIONADAS (DIAGRAMADE FLUJO) Luces Configura puertos RD salida, RA entrada Limpia contador Envía secuencia_izquierda Incrementa contador Contador = 10 Limpia contador si no RA0 = 0 Envía Secuencia_derecha si no
  • 65. 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; } }
  • 66. EJERCICIOS PROPUESTOS 5 1. El alumno desarrollara 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.
  • 68. MOTOR A PASOS 1 • Unipolar.- Tiene 4 bobinas independientes (A, B, C, D) y una terminal común a todas ellas.
  • 69. MOTOR A PASOS 2 • Unipolar.- Tiene 4 bobinas independientes (A, B, C, D) y dos terminales comunes.
  • 70. MOTOR A PASOS 2 • Bipolar.- Tiene 2 bobinas (A – C, B – D)
  • 71. 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
  • 72. 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
  • 73. 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
  • 74. 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
  • 75. SECUENCIADE ACTIVACIÓN 5 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 •Bipolar.- Movimiento de medio paso
  • 76. CIRCUITO DE POTENCIA 1 (MOTOR UNIPOLAR )
  • 77. CIRCUITO DE POTENCIA 2 (MOTOR UNIPOLAR )
  • 78. CIRCUITO DE POTENCIA 3 (MOTOR BIPOLAR ) Este mismo diagrama se repetiría para manejar la segunda bobina
  • 79. CIRCUITO DE POTENCIA X (MOTOR A PASOS ) Circuito integrado UCN 5804 Circuito integrado SAA1042
  • 80. CIRCUITO DE POTENCIA X1 (MOTOR UNIPOLAR )
  • 81. CIRCUITO DE POTENCIA X2 (MOTOR BIPOLAR )
  • 82. EJERCICIOS PROPUESTOS 5 2.- El alumno desarrollara 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.
  • 84. 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.
  • 85. 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
  • 86. DISPLAY DE 7 SEGMENTOS (DIAGRAMADE FLUJO) Configura puertos Inicia variables Display Envía decena Envía unidad Incrementa unidad Unidades>’9’ Limpia unidades Incrementa decenas Decenas>’9’ Limpia decenas si si no no
  • 87. 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 } } } }
  • 88. DISPLAY DE 7 SEGMENTOS ( ESQUEMÁTICO )
  • 89. EJERCICIO PROPUESTO 6 (D7SEG) • El alumno modificara 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.
  • 90. EJERCICIO PROPUESTO 6 (ESQUEMÁTICO)
  • 92. LCD (FUNCIONES BUS 8 BITS) • Lcd8_Config • Lcd8_Init • Lcd8_Out • Lcd8_Out_Cp • Lcd8_Chr • Lcd8_Chr_Cp • Lcd8_Cmd
  • 93. LCD8_CONFIG • Descripción: Inicializa el LCD usando un bus de datos de 8 bits. Los puertos de Control (ctrlport) y Datos (dataport) usan la asignación de terminales especificada. • void Lcd8_Config( unsigned short *ctrlport, unsigned short *dataport, unsigned short RS, unsigned short EN, unsigned short WR, unsigned short D7, unsigned short D6, unsigned short D5, unsigned short D4, unsigned short D3, unsigned short D2, unsigned short D1, unsigned short D0 );
  • 95. LCD8_INIT • Descripción: Inicializa el LCD usando un bus de 8 bits. Los puertos de Control (ctrlport) y Datos (dataport) usan la siguiente asignación de terminales.- E → ctrlport.3 RS → ctrlport.2 R/W → ctrlport.0 D7 → dataport.7 D6 → dataport.6 D5 → dataport.5 D4 → dataport.4 D3 → dataport.3 D2 → dataport.2 D1 → dataport.1 D0 → dataport.0 • void Lcd8_Init(unsigned short *ctrlport, unsigned short *dataport);
  • 97. LCD8_OUT • Descripción: Imprime mensaje en el LCD en la fila y columna especificada (row y col). • void Lcd8_Out( unsigned short row, unsigned short col, char *text ); • Ejemplo: -Imprime “Hello!” en el LCD en la linea 1, columna 3 Lcd8_Out(1, 3, "Hello!");
  • 98. LCD8_OUT_CP • Descripción: Imprime mensaje en el LCD en la posición actual del cursor. • void Lcd8_Out_Cp(char *text); • Ejemplo: Imprime “Here!” en la posición actual del cursor Lcd8_Out_Cp("Here!");
  • 99. LCD8_CHR • Descripción: Imprime un caracter en el LCD en la fila y columna especificada (row y col). • void Lcd8_Chr( unsigned short row, unsigned short col, char character ); Ejemplo: Imprime la letra “i” en el LCD en la línea 2,y columna 3 Lcd8_Out(2, 3, 'i');
  • 100. LCD8_CHR_CP • Descripción: Imprime un caracter en el LCD en la posición actual del cursor. • void Lcd8_Chr_Cp(char character); • Ejemplo: Imprime la letra “e” en la posición actual del cursor Lcd8_Chr_Cp('e');
  • 101. LCD8_CMD • Descripción: Envía un comando al LCD. Se puede pasar a la función una de las constantes predefinidas. • void Lcd8_Cmd(unsigned short command); • Ejemplo: Limpia el LCD Lcd8_Cmd(LCD_CLEAR);
  • 102. COMANDOS PREDEFINIDOS Comando Función LCD_FIRST_ROW Mueve el cursor a la 1a. fila. LCD_SECOND_ROW Mueve el cursor a la 2a. fila. LCD_THIRD_ROW Mueve el cursor a la 3a. fila. LCD_FOURTH_ROW Mueve el cursor a la 4a. fila. LCD_CLEAR Limpia el display. LCD_RETURN_HOME Regresa elcursora la posición1,1.Los datos de la RAM no son afectados. LCD_CURSOR_OFF Apaga el cursor. LCD_UNDERLINE_ON Coloca el caractersubrayado. LCD_BLINK_CURSOR_ON Parpadeo delcursor. LCD_MOVE_CURSOR_LEFT Mueve el cursor haciala izquierda sin cambiar la RAM LCD_MOVE_CURSOR_RIGHT Mueve el cursor haciala derecha sin cambiarel contenido de la RAM LCD_TURN_ON Enciende eldisplay LCD_TURN_OFF Apaga el display LCD_SHIFT_LEFT Mueve el display haciala izquierda sin cambiar elcontenidode la RAM LCD_SHIFT_RIGHT Mueve el display haciala derecha sin cambiarel contenido de la RAM
  • 103. 7.- LCD 8 BITS • Diseñar el programa que inicialice un LCD, usando un bus de datos de 8 bits, y a continuación mande un mensaje de bienvenida. El mensaje debe desplazarse hacia la izquierda en forma continua.
  • 104. LCD 8 BITS (ALGORITMO) 1. Inicialice los puertos de datos y control. 2. Envía mensaje a desplegar. 3. Envía comando de desplazamiento hacia la izquierda. 4. Repite el paso 3.
  • 105. LCD 8 BITS (DIAGRAMADE FLUJO) Inicializa puertos de datos y control Envía mensaje Envía comando de Corrimiento a la izq. LCD 8 bits
  • 106. LCD 8 BITS (ESQUEMÁTICO)
  • 107. LCD 8 BITS (PROGRAMA1) Void main(void) { TRISB = 0; TRISC = 0; Lcd8_Config(&PORTC,&PORTB,0,2,1,7,6,5,4,3,2,1,0); Lcd8_Out(1,1,”Hola mundo cruel”); while(1) { Lcd8_Cmd(LCD_SHIFT_LEFT); Delay_ms(100); } }
  • 108. LCD 8 BITS (PROGRAMA2) char mensaje[ ] = “Programa numero 2”; void main(void) { TRISB = 0; TRISC = 0; Lcd8_Config(&PORTC,&PORTB,0,2,1,7,6,5,4,3,2,1,0); Lcd8_Out(1,1,mensaje); while(1) { Lcd8_Cmd(LCD_SHIFT_LEFT); Delay_ms(500); } }
  • 109. LCD 8 BITS (ESQUEMÁTICO)
  • 110. LCD 8 BITS (PROGRAMA3) char *mensaje3 = “mensaje tres”; void main(void) { TRISB = 0; TRISC = 0; Lcd8_Init(&PORTC,&PORTB); Lcd8_Out(1,1,mensaje3); Lcd8_Out(2,1,”segunda fila”); while(1) { Lcd8_Cmd(LCD_SHIFT_LEFT); Delay_ms(50); }
  • 111. EJERCICIOS PROPUESTOS 7 1. Programa que forme la palabra „HOLA‟ en un LCD, configurado para utilizar un bus de 8 bits. Las letras deben desplazarse de derecha a izquierda. Primero debe aparecer la H, moviendose desde la derecha a la primer columna a la izquierda. Enseguida debe aparecer la O, tambien saliendo de la derecha y terminando a la derecha de la letra H. Lo mismo debe suceder para las letras L y A. El programa debe ser ciclico.
  • 112. EJERCICIO PROPUESTO 8 H H H O H O O H H HO H O L A L . . .
  • 113. LCD (FUNCIONES BUS 4 BITS) • Lcd_Config • Lcd_Init • Lcd_Out • Lcd_Out_Cp • Lcd_Chr • Lcd_Chr_Cp • Lcd_Cmd
  • 114. LCD_CONFIG • Descripción: Inicializa LCD usando un bus de datos de 4 bits. El puerto de Control (ctrlport) y Datos (dataport) tiene las asignaciones de terminales especificadas. • void Lcd_Config( unsigned short *ctrl_data_port, unsigned short RS, unsigned short EN, unsigned short WR, unsigned short D7, unsigned short D6, unsigned short D5, unsigned short D4 );
  • 116. LCD_INIT • Descripción: Inicializa el LCD usando un bus de 4 bits. El puerto de Control (ctrlport) y Datos (dataport) tiene la siguiente asignación de terminales.- E → ctrl_data_port.3 RS → ctrl_data_port.2 D7 → ctrl_data_port.7 D6 → ctrl_data_port.6 D5 → ctrl_data_port.5 D4 → ctrl_data_port.4 • void Lcd_Init(unsigned short *ctrl_data_port);
  • 118. LCD_OUT • Descripción: Imprime mensaje en el LCD en la fila y columna especificada (row y col). • void Lcd_Out( unsigned short row, unsigned short col, char *text ); • Ejemplo: -Imprime “Hello!” en el LCD en la línea 1, columna 3 Lcd_Out(1, 3, "Hello!");
  • 119. LCD_OUT_CP • Descripción: Imprime mensaje en el LCD en la posición actual del cursor. • void Lcd_Out_Cp(char *text); • Ejemplo: - Imprime “Here!” en la posición actual del cursor Lcd_Out_Cp("Here!");
  • 120. LCD_CHR • Descripción: Imprime un caracter en el LCD en la fila y columna especificada (row y col). • void Lcd_Chr( unsigned short row, unsigned short col, char character ); Ejemplo: - Imprime la letra „i‟ en el LCD en la línea 2,y columna 3 Lcd_Out(2, 3, 'i');
  • 121. LCD_CHR_CP • Descripción: Imprime un caracter en el LCD en la posición actual del cursor. • void Lcd_Chr_Cp(char character); • Ejemplo: - Imprime la letra „e‟ en la posición actual del cursor Lcd_Chr_Cp('e');
  • 122. LCD_CMD • Descripción: Envía un comando al LCD. Se puede pasar a la función una de las constantes predefinidas. Los comandos son los mismos para ambos modos de manejo del LCD (bus 8 o 4 bits). • void Lcd_Cmd(unsigned short command); • Ejemplo: - Apaga el cursor, no aparece en el LCD Lcd_Cmd(LCD_CURSOR_OFF);
  • 123. 8.- LCD 4 BITS • Diseñar el programa que inicialice un LCD, usando un bus de datos de 4 bits, y a continuación mande un mensaje cualquiera de bienvenida. El mensaje debe desplazarse hacia la derecha en forma continua.
  • 124. LCD 4 BITS (ALGORITMO) 1. Inicialice los puertos de datos y control. 2. Envía mensaje a desplegar. 3. Envía comando de desplazamiento hacia la derecha. 4. Repite el paso 3.
  • 125. LCD 4 BITS (DIAGRAMADE FLUJO) Inicializa puertos de datos y control Envía mensaje Envía comando de Corrimiento a la der. LCD 8 bits
  • 126. LCD 4 BITS (ESQUEMÁTICO CONFIG)
  • 127. LCD 4 BITS (PROGRAMA1) void main(void) { TRISD = 0; Lcd_Config(&PORTD,0,2,1,7,6,5,4); Lcd_Out(1,1,”Envio de datos”); Lcd_Out(2,1,”Usando bus de 4 bits”); while(1) { Lcd_Cmd(LCD_SHIFT_RIGHT); Delay_ms(200); } }
  • 128. LCD 4 BITS (PROGRAMA2) char mensaje[11]={„B‟, „u‟, „s‟, „ ‟, „4‟, „ ‟, „b‟, „i‟, „t‟, „s‟, „0‟}; void main(void) { TRISD = 0; Lcd_Config(&PORTD,0,2,1,7,6,5,4); Lcd_Out(1, 6, mensaje); while(1) { Lcd_Cmd(LCD_SHIFT_RIGHT); Delay_ms(200); } }
  • 129. LCD 4 BITS (ESQUEMÁTICO INIT)
  • 130. LCD 4 BITS (PROGRAMA3) char *mensaje3 = “programa 3 usando bus 4 bits”; void main(void) { TRISB = 0; TRISC = 0; Lcd8_Init(&PORTC,&PORTB); Lcd8_Out(1,16,mensaje3); Lcd8_Out(2,1,”fila=2 columna=5”); while(1) { Lcd8_Cmd(LCD_SHIFT_LEFT); Delay_ms(50); }
  • 131. CONVERSIÓN DE TIPO DE DATOS Tipo de dato a cadena • ByteToStr • ShortToStr • WordToStr • IntToStr • LongToStr • FloatToStr
  • 132. 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)
  • 133. 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)
  • 134. 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)
  • 135. 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)
  • 136. 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)
  • 137. 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"
  • 138. 9.- CONTADOR 0-9 (PROBLEMA) • Se quiere un programa que visualice un conteo de 0 a 9 en un LCD.
  • 139. CONTADOR 0-9 (ALGORITMO) 1. Configura el LCD 2. Inicializa el contador 3. Convierte a ASCII el valor del contador 4. Envía valor en ASCII al LCD 5. Incrementa el contador 6. Regresa a 3
  • 140. CONTADOR 0-9 (DIAGRAMADE FLUJO) teclado Inicializa puertos (LCD) Convierte contador a ASCII Envía a LCD ASCII Incrementa contador Inicializa contador
  • 141. CONTADOR 0-9 (PROGRAMA) void main(void) { unsigned short contador; char cadena[ 5 ] = “ “; TRISD = 0; Lcd_Config(&PORTD,0,2,1,7,6,5,4); contador = 0; Lcd_Out(1,1,”Contador 0-9”); while(1) { ShortToStr ( contador , cadena ); Lcd_Out ( 2 , 8 , cadena ); contador ++; Delay_ms(500);
  • 143. CONTADOR 0-9 (FUNCIONAMIENTO) Contador 0-9 : 0 Contador 0-9 : 1 Contador 0-9 : 2 Contador 0-9 : 3 Contador 0-9 : 4 Contador 0-9 : 5 Contador 0-9 : 6 Contador 0-9 : 9 . . .
  • 144. EJERCICIO PROPUESTO 8 1. Programa que utilice un LCD, configurado para usar un bus de 8 bits. En el LCD deben aparecer en forma secuencial, los números de la secuencia 1 – 2 – 4 – 8 – 16 – 32 – 64 – 128 – 256 – 512 – 1024 – 2048 – 4096 – 8192 – 16384 - 32768. Los numero deben ser generados por operaciones aritméticas. El desplegado debe hacerse de la forma mostrada en las siguientes figuras. Se utiliza la segunda fila, presentando hasta 3 numeros consecutivos, un numero a la izquierda, uno mas al centro y otro a la derecha.
  • 145. EJERCICIO PROPUESTO 8 Serie de numeros Serie de numeros 1 Serie de numeros 1 2 Serie de numeros 1 2 4 Serie de numeros 8 Serie de numeros 8 16 Serie de numeros 8 16 32 Serie de numeros 8192 16384 32768 . . .
  • 146. EJERCICIO PROPUESTO 9 1. El alumno diseñara un programa en donde se muestre en un LCD los números desde 00 hasta el 99. Con un intervalo de tiempo entre cambio igual a 500 milisegundos.
  • 147. EJERCICIO PROPUESTO 9 Contador 00-99 cada 500 mseg 00 Contador 00-99 cada 500 mseg 01 Contador 00-99 cada 500 mseg 02 Contador 00-99 cada 500 mseg 03 Contador 00-99 cada 500 mseg 04 Contador 00-99 cada 500 mseg 05 Contador 00-99 cada 500 mseg 06 Contador 00-99 cada 500 mseg 99 . . .
  • 149. TECLADO MATRICIAL(FUNCIONES) • Keypad_Init • Keypad_Read • Keypad_Released
  • 150. 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);
  • 152. 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();
  • 153. 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();
  • 154. 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).
  • 155. 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
  • 156. TECLADO MATRICIAL(DIAGRAMAS DE FLUJO) teclado Inicializa puertos (LCD y teclado) Lee teclado Convierte a ASCII Envía a LCD
  • 158. 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); }
  • 159. EJERCICIO PROPUESTO 9 1. El alumno realizara un programa que tome 3 números desde un teclado matricial, los guarde en un arreglo, los convierta a un numero que se guarde en una variable tipo entera. Con este numero el alumno deberá proporcionar el producto por 2 y división entre 2 resultantes. Visualizando los resultados en un LCD.
  • 160. 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: 025 El producto por 2 es: 050 Cual es el numero de 3 cifras: 025 El producto por 2 es: 050 La división entre 2 es: 012