practicas con pic 16f877a
TRANSCRIPT
-
8/12/2019 practicas con pic 16f877a
1/160
Microcontroladores PICPIC16F877
-
8/12/2019 practicas con pic 16f877a
2/160
Caractersticas
Velocidad de operacin: 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
-
8/12/2019 practicas con pic 16f877a
3/160
Caractersticas (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.
-
8/12/2019 practicas con pic 16f877a
4/160
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 )
-
8/12/2019 practicas con pic 16f877a
5/160
Caractersticas (perifricos)
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 mdulos de Capture, Compare, PWM
Capture es de 16-bit, max. resolucin es 12.5 ns
Compare es de 16-bit, max. resolucin es 200 ns
PWM max. resolucin de 10-bit
-
8/12/2019 practicas con pic 16f877a
6/160
Caractersticas (perifricos 2)
Convertidor analgico a digital de 10-bitmulti-canal
Puerto serial sncrono (SSP) con SPI. (modomaestro) e I2C (maestro/esclavo)
Transmisor-Receptor sncrono-asncronouniversal (USART/SCI) con 9-bit
Puerto paralelo esclavo (PSP) con 8-bits deancho, con terminales de control RD, WR yCS
-
8/12/2019 practicas con pic 16f877a
7/160
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.
-
8/12/2019 practicas con pic 16f877a
8/160
Arquitectura interna
-
8/12/2019 practicas con pic 16f877a
9/160
Terminales fisicas
-
8/12/2019 practicas con pic 16f877a
10/160
PUERTOSPuerto # funciones Funciones
PORTA 3 Entradas digitalSalidas digital
Entradas analgicas
PORTB 2 Entradas digital
Salidas digital
PORTC 3 Entradas digitalSalidas digital
Medios de comunicacin
PORTD 3 Entradas digital
Salidas digital
Puerto paralelo esclavoPORTE 4 Entradas digital
Salidas digital
Entradas analgicas
Control del puerto paralelo esclavo
-
8/12/2019 practicas con pic 16f877a
11/160
FUNCIONES PORTA
Terminal Funciones
RA0 Ent. Digital Sal. Digital Ent. Analgica
RA1 Ent. Digital Sal. Digital Ent. Analgica
RA2 Ent. Digital Sal. Digital Ent. Analgica VREF-
RA3 Ent. Digital Sal. Digital Ent. Analgica VREF+
RA4 Ent. Digital Sal. Digital Ent. contador 1
RA5 Ent. Digital Sal. Digital Ent. Analgica
-
8/12/2019 practicas con pic 16f877a
12/160
FUNCIONES PORTB
Terminal Funciones
RB0 Ent. Digital Sal. Digital Ent. Interrupcin 0
RB1 Ent. Digital Sal. Digital
RB2 Ent. Digital Sal. Digital
RB3 Ent. Digital Sal. Digital PGM ( funcin LVP )
RB4 Ent. Digital Sal. Digital
RB5 Ent. Digital Sal. Digital
RB6 Ent. Digital Sal. Digital PGC ( funcin LVP )
RB7 Ent. Digital Sal. Digital PGD ( funcin LVP )
-
8/12/2019 practicas con pic 16f877a
13/160
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 sncrono I2C
RC4 Ent. Digital Sal. Digital Datos entrada SPI Datos I2C
RC5 Ent. Digital Sal. Digital Datos salida SPI
RC6 Ent. Digital Sal. Digital Transmisin USART
RC7 Ent. Digital Sal. Digital Recepcin USART
-
8/12/2019 practicas con pic 16f877a
14/160
FUNCIONES PORTD
Terminal FuncionesRD0 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
RD5Ent. 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
-
8/12/2019 practicas con pic 16f877a
15/160
FUNCIONES PORTE
Terminal Funciones
RE0 Ent. Digital Sal. Digital Ent. Analgica Lectura PSP
RE1 Ent. Digital Sal. Digital Ent. Analgica Escritura PSP
RE2 Ent. Digital Sal. Digital Ent. Analgica Habilitacin PSP
-
8/12/2019 practicas con pic 16f877a
16/160
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
-
8/12/2019 practicas con pic 16f877a
17/160
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
-
8/12/2019 practicas con pic 16f877a
18/160
Asignacin de datos
Decimal
inti = 10; /* decimal 10 */
intj = -10;/* decimal -10 */
intp = 0; /* decimal 0 */
Hexadecimal
short x = 0x37; /* decimal 55 */
short y = 0x7F; /* decimal 127 */
int z = 0x125; /* decimal 293 */
-
8/12/2019 practicas con pic 16f877a
19/160
Asignacin 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;
-
8/12/2019 practicas con pic 16f877a
20/160
Registros asociados
Entrada/salida Configuracin
PORTA TRISA
PORTB TRISB
PORTC TRISC
PORTD TRISD
PORTE TRISE
-
8/12/2019 practicas con pic 16f877a
21/160
Entrada o salida
SALIDA DE DATOS : 0
ENTRADA DE DATOS: 1
La asignacin es individual correspondiente a
cada terminal del puerto.
-
8/12/2019 practicas con pic 16f877a
22/160
Acceso individual de 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 F7el bit mas significativo.
Ejemplo:PORTC.F0 = 1;PORTD.F5 = 0;PORTB.F7 = 1;
Los identificadores F0F7 no se reconocen en minsculas.
NOTA: Entre dos accesos a bits se debe tener un retardo mnimo de 2microsegundos.
-
8/12/2019 practicas con pic 16f877a
23/160
Entrada o salida Si deseamos configurar el puerto C con la
siguiente asignacin:RC0 entradaRC1 entradaRC2 entradaRC3 entrada
RC4 salidaRC5 salidaRC6 salidaRC7 salida
Posibles instrucciones a utilizar
TRISC = 0b00001111; oTRISC = 0x0F; oTRISC = 15;
-
8/12/2019 practicas con pic 16f877a
24/160
Entrada o salida Si deseamos configurar el puerto D con la
siguiente asignacin:RD0 entradaRD1 salidaRD2 entradaRD3 salida
RD4 entradaRD5 salidaRD6 entradaRD7 salida
Debemos utilizar cualquiera de las siguientes instrucciones
TRISD = 0b01010101; oTRISD = 0x55; oTRISD = 85;
-
8/12/2019 practicas con pic 16f877a
25/160
Entrada o salida Si deseamos configurar el puerto A con la siguiente
asignacin:RA0 salida
RA1 salida
RA2 salida
RA3 salida
RA4 entrada
RA5 entradaRA6 entrada
Posibles instrucciones a utilizar
ADCON1 = 6; \\ instruccin indispensable para usar elpuerto A y el puerto E como entrada osalida de datos digitales
TRISA = 0b01110000; oTRISA = 0x70; oTRISA = 112;
-
8/12/2019 practicas con pic 16f877a
26/160
ADCON1
ADCON1 = 0 0 0 0 0 1 1 0
ADCON1 = 6 ;
-
8/12/2019 practicas con pic 16f877a
27/160
Delay_ms (retardo por software)
Descripcin: Crea un retardo por software dado el tiempo enmilisegundos (constante). El rango de constantes aplicables a la funcindepende de la frecuencia del oscilador. Es una funcin interna; El cdigoes generado en el lugar donde se hace la llamada, as que la llamada de
esta funcin no cuenta dentro del limite de llamadas anidadas.
voidDelay_ms(consttime_in_ms)
Ejemplo:
Generar un retardo de 1 segundo
Delay_ms(1000); /* Pausa de un segundo */
-
8/12/2019 practicas con pic 16f877a
28/160
Estructura de un programa en C( ciclo while)
// Definicin de variables globales
// Definicin de funciones
void main(void)
{
// Definicin de variables locales
// Configuracin de registros (recursos y puertos)
// ciclo infinito
while ( 1 )
{
// Programa de usuario
}
}
-
8/12/2019 practicas con pic 16f877a
29/160
Estructura de un programa en C( ciclo for)
// Definicin de variables globales
// Definicin de funciones
void main(void)
{
// Definicin de variables locales
// Configuracin de registros (recursos y puertos)
// ciclo infinito
for ( ; ; )
{
// Programa de usuario
}
}
-
8/12/2019 practicas con pic 16f877a
30/160
Estructura de un programa en C( ciclo do - while)
// Definicin de variables globales
// Definicin de funciones
void main(void)
{
// Definicin de variables locales
// Configuracin de registros (recursos y puertos)
// ciclo infinito
do
{
// Programa de usuario
} while ( 1 ) ;
}
-
8/12/2019 practicas con pic 16f877a
31/160
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 300milisegundos.
-
8/12/2019 practicas con pic 16f877a
32/160
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
-
8/12/2019 practicas con pic 16f877a
33/160
Encendido de LED (diagrama de flujo)Led
Configura bit del
puerto como salida
Enciende bit
Retardo de 1000ms
Apaga bit
Retardo de 300 ms
-
8/12/2019 practicas con pic 16f877a
34/160
Encendido de LED (esquemtico)
-
8/12/2019 practicas con pic 16f877a
35/160
Encendido de LED (programa)
void main ( void )
{
TRISD.F7 = 0;
while( 1 )
{
PORTD.F7 = 1;
Delay_ms( 1000 );
PORTD.F7 = 0;
Delay_ms( 300 );
}
}
-
8/12/2019 practicas con pic 16f877a
36/160
Encendido de LED (programa 2)
void main ( void )
{
TRISD = 0;
while( 1 )
{
PORTD = 0x80;
Delay_ms( 1000 );
PORTD = 0;
Delay_ms( 300 );
}
}
-
8/12/2019 practicas con pic 16f877a
37/160
Ejercicios propuestos 1
1. El alumno encender y apagara en formaalternada dos leds ubicados en los bits 2 y 3 delpuerto B. Los retardos sern de 500 milisegundos(ambos). Usando asignacin directa a bits.
2. El alumno encender y apagara un led ubicado en
el bit 5 del puerto C. Los retardos sern de 100milisegundos y 2 segundos, respectivamente.Usando asignacin de byte.
-
8/12/2019 practicas con pic 16f877a
38/160
2.- Luces secuenciales
Programa que enve la siguiente secuencia de datosal puerto de salida D.
Secuencia :
00000001 00000010 00000100 00001000
00010000 00100000 01000000 10000000
-
8/12/2019 practicas con pic 16f877a
39/160
Luces secuenciales (algoritmo)
1. Configuracin de puerto como salida de datos.2. Envo de primer dato al puerto de salida
3. Envo de segundo dato al puerto de salida
4. Envo de tercer dato al puerto de salida.
.
.9. Envo de ultimo dato al puerto de salida
10. Regresar a 2
-
8/12/2019 practicas con pic 16f877a
40/160
Luces secuenciales (diagrama de flujo)Luces
Configura puerto
como salida
Enva 00000001
Enva 00000010
Enva 00000100
Enva 00001000
Enva 00010000
Enva 00100000
Enva 01000000
Enva 10000000
-
8/12/2019 practicas con pic 16f877a
41/160
Luces secuenciales (esquemtico)
-
8/12/2019 practicas con pic 16f877a
42/160
Luces secuenciales (programa)void main(void)
{TRISD = 0; // CONFIGURACION COMO PUERTO DE SALIDA
while ( 1 ) // CICLO INFINITO{
PORTD = 0b00000001; // ENVIA PRIMER DATODelay_ms(500);PORTD = 0b00000010; // ENVIA SEGUNDO DATODelay_ms(500);PORTD = 0b00000100; // ENVIA TERCER DATODelay_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);
}}
-
8/12/2019 practicas con pic 16f877a
43/160
Ejercicios propuestos 2
1. El alumno enviara una secuencia de datos distinta por elpuerto B, utilizando retardos por software de distintasduraciones, con incrementos de 100 milisegundos entre si.
2. El alumno enviara la secuencia de datos por el puerto A,
utilizando retardos por software con duracin de 800milisegundos.
100001010010
001100010010100001
-
8/12/2019 practicas con pic 16f877a
44/160
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];
unsignedshort d[3];
-
8/12/2019 practicas con pic 16f877a
45/160
Arreglos (Inicializando)
/* Arreglo el cal contiene el nmero de das de cada mes */
intdays[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 charmsg1[ ] = {'T', 'e', 's', 't', '\0'};
const charmsg2[ ] = "Test";
-
8/12/2019 practicas con pic 16f877a
46/160
Condicionante if
if(expresin) conjunto 1[elseconjunto 2]
Cuando la expresinevaluada es verdadera, Lasinstrucciones del conjunto 1son ejecutadas. Si laexpresines falso, las instrucciones del conjunto 2esejecutada. La expresindebe ser evaluada a un valorentero. Los parntesis que encierra la expresinsonobligatorios.
La palabra especial else conjunto 2es opcional.
-
8/12/2019 practicas con pic 16f877a
47/160
Smbolos de condicin
Operador Operacin
== igual
!= no igual
> mayor que
< menor que
>= mayor que o igual a
-
8/12/2019 practicas con pic 16f877a
48/160
3.- Luces con arreglo (algoritmo)1. Configuracin de puerto como salida.
2. Inicializa apuntador.
3. Envo de dato apuntado.
4. Incrementa apuntador.
5. Si apuntador es mayor que o igual a 8 inicia el
apuntador.
6. Regresa a 3.
-
8/12/2019 practicas con pic 16f877a
49/160
Luces con arreglo (diagrama de flujo)
Luces
Configura puerto
como salida
Limpia apuntador
Enva dato
apuntado
Incrementa
apuntador
apuntador 8 Limpia
apuntador
si
no
-
8/12/2019 practicas con pic 16f877a
50/160
Luces con arreglo (programa)
short dato [ 8 ] = {1, 2, 4, 8, 16, 32, 64, 128};short apunta;
void main(void){
TRISB = 0; // Configura puertoapunta = 0; // Limpia apuntador
while(1) // Ciclo infinito{PORTB = dato [ apunta ]; // Enva dato
Delay_ms(1000);
apunta ++; // Incrementa apuntadorif ( apunta > = 8 ) // Si apuntador 8apunta = 0; // Limpia apuntador
}}
-
8/12/2019 practicas con pic 16f877a
51/160
Ejercicios propuestos 3
1. El alumno enviara una secuencia por elpuerto B usando los valores almacenado enun arreglo.
0000001100000110
00001100
00011000
0011000001100000
11000000
d l d b
-
8/12/2019 practicas con pic 16f877a
52/160
Operadores a nivel de bitsOperador operacion
& AND; compara pares de bits y regresa 1 si ambos son 1s,de otra manera regresa 0.
| OR (inclusive); compara pares de bits y regresa 1 si uno oambos son 1s, de otra manera regresa 0.
^ OR (exclusiva); compara pares de bits y regresa 1 si losbits son complementarios, de otra manera regresa 0.
~ Complemento (unitario); invierte cada bit
> Corrimiento hacia la derecha; mueve los bits hacia laderecha, descartando el bit mas a la derecha y asignando
ceros al bit a la izquierda.
-
8/12/2019 practicas con pic 16f877a
53/160
Ejemplos operadores lgicos
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 */
-
8/12/2019 practicas con pic 16f877a
54/160
Ejemplos a nivel de bits
000001 4; /* Igual 0x002F */
0xFF56 >> 4; /* Igual 0x0FF5 */
Corrimiento a la derecha division entre 2n.
Corrimiento a la izquierda producto por 2n.
-
8/12/2019 practicas con pic 16f877a
55/160
4.- Luces con desplazamiento (algoritmo)
1. Configuracin de puerto como salida.
2. Inicializa variable.
3. Enva valor de la variable al puerto.
4. Modifica la variable.
5. Si variable es cero, Inicializa la variable.
6. Regresa a 3.
-
8/12/2019 practicas con pic 16f877a
56/160
Luces con desplazamiento (diagrama de flujo)
Luces
Configura puerto
como salida
Inicializa variable
Enva variable
al puerto
Modifica
variable
variable = 0 Inicializa
variable
si
no
-
8/12/2019 practicas con pic 16f877a
57/160
Luces con desplazamiento (programa 1)void main ( void )
{ unsigned short dato;
TRISD = 0;
dato = 0b00000001;
while ( 1 ){
PORTD = dato;Delay_ms ( 300 );dato = dato
-
8/12/2019 practicas con pic 16f877a
58/160
Operaciones aritmticasOperador Operacin
+ Suma
- Resta
* Multiplicacin
/ Divisin
% Resto, regresa el residuo de la divisin entera (no puede ser usado
con variables flotantes
++ Como prefijo Incrementa en uno el valor de la variable antes de
evaluar la expresin. Como Postfijo suma en uno la variable despusde ser evaluado la expresin.
-- Como prefijo decrementa en uno el valor de la variable antes de
evaluar la expresin. Como Postfijo resta en uno la variable despus
de ser evaluado la expresin.
-
8/12/2019 practicas con pic 16f877a
59/160
Luces con desplazamiento (programa 2)
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;}
}
-
8/12/2019 practicas con pic 16f877a
60/160
Ejercicios propuestos 4
1. El alumno realizara un programa que enve alpuerto C los siguientes valores utilizando paragenerarlas, las instrucciones de desplazamientoy/o aritmticas.
1, 5, 9, 13, 17, 21, 25, 29, 33, 37, 41, 45
2. Lo mismo que el ejercicio anterior con la siguientesecuencia:
3, 6, 12, 24, 48, 92, 172, 1, 3, 6, 9, 12, 15, 18, 21, 24
-
8/12/2019 practicas con pic 16f877a
61/160
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 F7el bit mas significativo.
Ejemplo:
// Si RB0 es uno, colocar en uno la terminal RC0:if ( PORTB.F0 )
PORTC.F0 = 1;
Los Identificadores F0F7 no se reconocen en minsculas.
-
8/12/2019 practicas con pic 16f877a
62/160
5.- Secuencias condicionadas ( problema)
Realizar un programa que enve secuencias
distintas al puerto D, dependiendo del valor de la
terminal RA0. Si RA0 es igual a cero se enva laserie de dos bits desplazados hacia la izquierda,
mientras que si RA0 es igual a 1 entonces se
enva la serie de tres bits desplazados hacia la
derecha.
-
8/12/2019 practicas con pic 16f877a
63/160
Secuencias condicionadas (algoritmo)
1. Configuracin de puertos
2. Inicia contador
3. Si RA0 es igual a 0 entonces enva secuencia_izquierda
4. De lo contrario enva secuencia_derecha
5. Incrementa contador
6. Si contador es igual a 8 entonces contador igual a 0
7. Regresa a 3
-
8/12/2019 practicas con pic 16f877a
64/160
Secuencias condicionadas (diagrama de flujo)Luces
Configura puertos
RD salida, RA entrada
Limpia contador
Enva
secuencia_izquierda
Incrementa
contador
Contador = 10 Limpia
contador
si
no
RA0 = 0
Enva
Secuencia_derecha
si
no
-
8/12/2019 practicas con pic 16f877a
65/160
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];
elsePORTD = derecha [ contador];
contador + + ;
If ( contador = = 10 )contador = 0;
}}
-
8/12/2019 practicas con pic 16f877a
66/160
Ejercicios propuestos 5
1. El alumno desarrollara un programa que enve
una secuencia de nmeros 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 numeracin debe ser incremental; en caso
contrario debe decrementarse.
-
8/12/2019 practicas con pic 16f877a
67/160
Ejercicios propuestos 5 (esquemtico)
MOTOR A PASOS
-
8/12/2019 practicas con pic 16f877a
68/160
MOTOR A PASOS 1
Unipolar.- Tiene 4 bobinas independientes (A, B, C, D) y
una terminal comn a todas ellas.
MOTOR A PASOS 2
-
8/12/2019 practicas con pic 16f877a
69/160
MOTOR A PASOS 2
Unipolar.- Tiene 4 bobinas independientes (A, B, C, D) y dos
terminales comunes.
MOTOR A PASOS 2
-
8/12/2019 practicas con pic 16f877a
70/160
MOTOR A PASOS 2
Bipolar.- Tiene 2 bobinas (A C, B D)
Secuencias de activacin 1
-
8/12/2019 practicas con pic 16f877a
71/160
Secuencias de activacin 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 14 1 0 0 1
Secuencias de activacin 2
-
8/12/2019 practicas con pic 16f877a
72/160
Secuencias de activacin 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 04 0 0 0 1
Secuencias de activacin 3
-
8/12/2019 practicas con pic 16f877a
73/160
Secuencias de activacin 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 activacin 4
-
8/12/2019 practicas con pic 16f877a
74/160
Secuencias de activacin 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 activacin 5
-
8/12/2019 practicas con pic 16f877a
75/160
Secuencia de activacin 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
d
-
8/12/2019 practicas con pic 16f877a
76/160
Circuito de potencia 1 (motor unipolar )
C d ( )
-
8/12/2019 practicas con pic 16f877a
77/160
Circuito de potencia 2 (motor unipolar )
Ci i d i ( )
-
8/12/2019 practicas con pic 16f877a
78/160
Circuito de potencia 3 (motor bipolar )
Este mismo diagrama se repetira para manejar la segunda bobina
Ci i d i ( )
-
8/12/2019 practicas con pic 16f877a
79/160
Circuito de potencia x (motor a pasos )
Circuito integrado UCN 5804 Circuito integrado SAA1042
Ci i d i ( )
-
8/12/2019 practicas con pic 16f877a
80/160
Circuito de potencia x1 (motor unipolar )
Ci i d i ( )
-
8/12/2019 practicas con pic 16f877a
81/160
Circuito de potencia x2 (motor bipolar )
Ej i i
-
8/12/2019 practicas con pic 16f877a
82/160
Ejercicios propuestos 5
2.- El alumno desarrollara un programa que
enve la secuencia de activacin 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.
Ej i i t ( )
-
8/12/2019 practicas con pic 16f877a
83/160
Ejercicios propuestos 5 (esquemtico)
6 Di l d
-
8/12/2019 practicas con pic 16f877a
84/160
6.- Display de 7 segmentos
Realizar un programa en donde se implemente
un contador de 00-99 desplegando en un par de
displays de 7 segmentos. El programa deberealizar la visualizacin utilizando el multiplexaje
de los datos, utilizando el puerto B como bus de
datos y las terminales RC0 y RC1 como
terminales de habilitacin de display.
Di l d t ( )
-
8/12/2019 practicas con pic 16f877a
85/160
Display de 7 segmentos (algoritmo)
1. Configurar los puertos, inicializacin de variables (unidades = 0decenas = 0)
2. Envo de decenas3. Habilitacin de decenas4. Envo de unidades
5. Habilitacin de unidades6. Incremento de unidades7. Si unidades mayor de 9entonces 98. Sigue 29. Unidades = 010. Incrementa decenas
11. Si decenas mayor de 9entonces 1212. Sigue 213. Decenas=014. Sigue 2
Di l d t ( )
-
8/12/2019 practicas con pic 16f877a
86/160
Display de 7 segmentos(diagrama de flujo)
Configura puertos
Inicia variables
Display
Enva decenaEnva unidad
Incrementa unidad
Unidades>9
Limpia unidades
Incrementa decenas
Decenas>9
Limpia decenassi
si
no
no
Di l d t ( )
-
8/12/2019 practicas con pic 16f877a
87/160
Display de 7 segmentos (programa)short numero[ ] = { 0x3F, 0x06, 0x1B, 0x4F, 0x66, 0x6D, 0x5E, 0x07, 0x7F, 0x67 };
void main ( void ) // Programa principal
{
TRISB = 0; // Configuracin de puertos
TRISC = 0;
unidades = decenas = 0; // Inicializacin de variables
while ( 1 ) // Programa de usuario
{
PORTB = numero [ decenas ]; // Enva decenas
PORTC.F0 = 1; // Habilita el display de decenas
delay-ms( 10 );PORTC.F0 = 0;
PORTB = numero [ unidades ]; // Enva 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
}
}
}
}
Displa de segmentos ( )
-
8/12/2019 practicas con pic 16f877a
88/160
Display de 7 segmentos ( esquemtico )
Ej i i t 6 ( )
-
8/12/2019 practicas con pic 16f877a
89/160
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 elinterruptor esta apagado el conteo ser
incremental, en caso contrario, el conteo ser
decremental. El interruptor estar ubicado en la
terminal RE0 del puerto E.
Ej i i t 6 ( )
-
8/12/2019 practicas con pic 16f877a
90/160
Ejercicio propuesto 6 (esquemtico)
Di l d i t l li id
-
8/12/2019 practicas con pic 16f877a
91/160
Display de cristal liquido
LCD ( )
-
8/12/2019 practicas con pic 16f877a
92/160
LCD (funciones bus 8 bits)
Lcd8_Config
Lcd8_Init
Lcd8_Out
Lcd8_Out_Cp
Lcd8_Chr
Lcd8_Chr_Cp
Lcd8_Cmd
L d8 C fi
-
8/12/2019 practicas con pic 16f877a
93/160
Lcd8_Config
Descripcin: Inicializa el LCD usando un bus de datos de 8 bits. Los puertos deControl (ctrlport) y Datos (dataport) usan la asignacin de terminalesespecificada.
voidLcd8_Config( unsigned short*ctrlport,unsigned short*dataport,
unsigned shortRS,
unsigned shortEN,unsigned shortWR,
unsigned shortD7,
unsigned shortD6,
unsigned shortD5,
unsigned shortD4,
unsigned shortD3,unsigned shortD2,
unsigned shortD1,
unsigned shortD0 );
Lcd8 Config 2
-
8/12/2019 practicas con pic 16f877a
94/160
Lcd8_Config 2Ejemplo:
Lcd8_Config(&PORTC,&PORTD,0,1,2,0,1,2,3,4,5,6,7);
Lcd8 Init
-
8/12/2019 practicas con pic 16f877a
95/160
Lcd8_Init
Descripcin: Inicializa el LCD usando un bus de 8 bits. Lospuertos de Control (ctrlport) y Datos (dataport) usan lasiguiente asignacin de terminales.-
E ctrlport.3
RS ctrlport.2R/W ctrlport.0
D7 dataport.7D6 dataport.6D5 dataport.5D4 dataport.4D3 dataport.3D2 dataport.2
D1 dataport.1D0 dataport.0
voidLcd8_Init(unsigned short*ctrlport, unsigned short*dataport);
Lcd8_Init 2
-
8/12/2019 practicas con pic 16f877a
96/160
Ejemplo:
Lcd8_Init(&PORTB, &PORTC);
Lcd8 Out
-
8/12/2019 practicas con pic 16f877a
97/160
Lcd8_Out
Descripcin: Imprime mensaje en el LCD en la fila ycolumna especificada (row y col).
voidLcd8_Out( unsigned shortrow,unsigned shortcol,
char*text );
Ejemplo:-Imprime Hello!en el LCD en la linea 1, columna 3
Lcd8_Out(1, 3, "Hello!");
Lcd8 Out Cp
-
8/12/2019 practicas con pic 16f877a
98/160
Lcd8_Out_Cp
Descripcin: Imprime mensaje en el LCD en la posicin
actual del cursor.
voidLcd8_Out_Cp(char*text);
Ejemplo: Imprime Here!en la posicin actual del cursor
Lcd8_Out_Cp("Here!");
Lcd8 Chr
-
8/12/2019 practicas con pic 16f877a
99/160
Lcd8_Chr
Descripcin: Imprime un caracter en el LCD en la filay columna especificada (row y col).
voidLcd8_Chr(unsigned shortrow,
unsigned shortcol,
charcharacter );
Ejemplo: Imprime la letra ien el LCD en la lnea 2,ycolumna 3
Lcd8_Out(2, 3, 'i');
Lcd8 Chr Cp
-
8/12/2019 practicas con pic 16f877a
100/160
Lcd8_Chr_Cp
Descripcin: Imprime un caracter en el LCD en la posicin
actual del cursor.
voidLcd8_Chr_Cp(charcharacter);
Ejemplo: Imprime la letra een la posicin actual del
cursor
Lcd8_Chr_Cp('e');
Lcd8 Cmd
-
8/12/2019 practicas con pic 16f877a
101/160
Lcd8_Cmd
Descripcin: Enva un comando al LCD. Se puede
pasar a la funcin una de las constantes predefinidas.
voidLcd8_Cmd(unsigned shortcommand);
Ejemplo: Limpia el LCD
Lcd8_Cmd(LCD_CLEAR);
Comandos predefinidos
-
8/12/2019 practicas con pic 16f877a
102/160
Comando Funcin
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 el cursor a la posicin 1,1. Los datos de la RAM no son
afectados.LCD_CURSOR_OFF Apaga el cursor.
LCD_UNDERLINE_ON Coloca el caracter subrayado.
LCD_BLINK_CURSOR_ON Parpadeo del cursor.
LCD_MOVE_CURSOR_LEFT Mueve el cursor hacia la izquierda sin cambiar la RAM
LCD_MOVE_CURSOR_RIGHT Mueve el cursor hacia la derecha sin cambiar el contenido de la RAM
LCD_TURN_ON Enciende el display
LCD_TURN_OFF Apaga el display
LCD_SHIFT_LEFT Mueve el display hacia la izquierda sin cambiar el contenido de la RAM
LCD_SHIFT_RIGHT Mueve el display hacia la derecha sin cambiar el contenido de la RAM
7 LCD 8 BITS
-
8/12/2019 practicas con pic 16f877a
103/160
7.- LCD 8 BITS
Disear el programa que inicialice un LCD,
usando un bus de datos de 8 bits, y a
continuacin mande un mensaje de
bienvenida. El mensaje debe desplazarse
hacia la izquierda en forma continua.
LCD 8 BITS ( )
-
8/12/2019 practicas con pic 16f877a
104/160
LCD 8 BITS (algoritmo)
1. Inicialice los puertos de datos y control.
2. Enva mensaje a desplegar.
3. Enva comando de desplazamiento hacia la
izquierda.
4. Repite el paso 3.
LCD 8 BITS (d d fl )
-
8/12/2019 practicas con pic 16f877a
105/160
LCD 8 BITS (diagrama de flujo)
Inicializa puertos de
datos y control
Enva mensaje
Enva comando de
Corrimiento a la izq.
LCD 8 bits
LCD 8 BITS ( )
-
8/12/2019 practicas con pic 16f877a
106/160
LCD 8 BITS (esquemtico)
LCD 8 BITS ( )
-
8/12/2019 practicas con pic 16f877a
107/160
LCD 8 BITS (programa 1)
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 ( )
-
8/12/2019 practicas con pic 16f877a
108/160
LCD 8 BITS (programa 2)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 ( ti )
-
8/12/2019 practicas con pic 16f877a
109/160
LCD 8 BITS (esquemtico)
LCD 8 BITS ( )
-
8/12/2019 practicas con pic 16f877a
110/160
LCD 8 BITS (programa 3)
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
-
8/12/2019 practicas con pic 16f877a
111/160
Ejercicios propuestos 7
1. Programa que forme la palabra HOLAen 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
-
8/12/2019 practicas con pic 16f877a
112/160
j p p
H
H
H O
H
O
O
H
H
HO
H O L A
L
.
.
.
LCD (f nciones b s bits)
-
8/12/2019 practicas con pic 16f877a
113/160
LCD (funciones bus 4 bits)
Lcd_Config
Lcd_Init
Lcd_Out
Lcd_Out_Cp
Lcd_Chr
Lcd_Chr_Cp
Lcd_Cmd
Lcd Config
-
8/12/2019 practicas con pic 16f877a
114/160
Lcd_Config
Descripcin: Inicializa LCD usando un bus de datos de 4bits. El puerto de Control (ctrlport) y Datos (dataport) tienelas asignaciones de terminales especificadas.
voidLcd_Config( unsigned short*ctrl_data_port,unsigned shortRS,unsigned shortEN,unsigned shortWR,unsigned shortD7,
unsigned shortD6,unsigned shortD5,
unsigned shortD4 );
Lcd_Config 2
-
8/12/2019 practicas con pic 16f877a
115/160
g
Ejemplo:
Lcd_Config(&PORTC,0,1,2,4,5,6,7);
Lcd Init
-
8/12/2019 practicas con pic 16f877a
116/160
Lcd_Init Descripcin: Inicializa el LCD usando un bus de 4
bits. El puerto de Control (ctrlport) y Datos(dataport) tiene la siguiente asignacin determinales.-
E ctrl_data_port.3
RS ctrl_data_port.2D7 ctrl_data_port.7
D6 ctrl_data_port.6
D5 ctrl_data_port.5
D4 ctrl_data_port.4
voidLcd_Init(unsigned short*ctrl_data_port);
Lcd Init 2
-
8/12/2019 practicas con pic 16f877a
117/160
Lcd_Init 2Ejemplo:
Lcd_Init(&PORTB);
Lcd Out
-
8/12/2019 practicas con pic 16f877a
118/160
Lcd_Out
Descripcin: Imprime mensaje en el LCD en la fila ycolumna especificada (row y col).
voidLcd_Out( unsigned shortrow,unsigned shortcol,
char*text );
Ejemplo:-Imprime Hello!en el LCD en la lnea 1, columna 3
Lcd_Out(1, 3, "Hello!");
Lcd Out Cp
-
8/12/2019 practicas con pic 16f877a
119/160
Lcd_Out_Cp
Descripcin: Imprime mensaje en el LCD en la posicin
actual del cursor.
voidLcd_Out_Cp(char*text);
Ejemplo:
- Imprime Here!en la posicin actual del cursor
Lcd_Out_Cp("Here!");
Lcd Chr
-
8/12/2019 practicas con pic 16f877a
120/160
Lcd_Chr
Descripcin: Imprime un caracter en el LCD en la filay columna especificada (row y col).
voidLcd_Chr( unsigned shortrow,unsigned shortcol,
charcharacter );
Ejemplo:- Imprime la letra ien el LCD en la lnea 2,y columna 3
Lcd_Out(2, 3, 'i');
Lcd Chr Cp
-
8/12/2019 practicas con pic 16f877a
121/160
Lcd_Chr_Cp
Descripcin: Imprime un caracter en el LCD en la posicin
actual del cursor.
voidLcd_Chr_Cp(charcharacter);
Ejemplo:
- Imprime la letra een la posicin actual del cursor
Lcd_Chr_Cp('e');
Lcd Cmd
-
8/12/2019 practicas con pic 16f877a
122/160
Lcd_Cmd
Descripcin: Enva un comando al LCD. Se puede pasar a lafuncin una de las constantes predefinidas. Los comandosson los mismos para ambos modos de manejo del LCD (bus 8o 4 bits).
voidLcd_Cmd(unsigned shortcommand);
Ejemplo:
- Apaga el cursor, no aparece en el LCD
Lcd_Cmd(LCD_CURSOR_OFF);
8.- LCD 4 BITS
-
8/12/2019 practicas con pic 16f877a
123/160
8. LCD 4 BITS
Disear el programa que inicialice un LCD,
usando un bus de datos de 4 bits, y a
continuacin mande un mensaje cualquiera
de bienvenida. El mensaje debe desplazarse
hacia la derecha en forma continua.
LCD 4 BITS (algoritmo)
-
8/12/2019 practicas con pic 16f877a
124/160
LCD 4 BITS (algoritmo)
1. Inicialice los puertos de datos y control.
2. Enva mensaje a desplegar.
3. Enva comando de desplazamiento hacia la
derecha.
4. Repite el paso 3.
LCD 4 BITS (diagrama de flujo)
-
8/12/2019 practicas con pic 16f877a
125/160
LCD 4 BITS (diagrama de flujo)
Inicializa puertos de
datos y control
Enva mensaje
Enva comando de
Corrimiento a la der.
LCD 8 bits
LCD 4 BITS (esquemtico Config)
-
8/12/2019 practicas con pic 16f877a
126/160
LCD 4 BITS (esquemtico Config)
LCD 4 BITS (programa 1)
-
8/12/2019 practicas con pic 16f877a
127/160
LCD 4 BITS (programa 1)
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 (programa 2)
-
8/12/2019 practicas con pic 16f877a
128/160
LCD 4 BITS (programa 2)
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 (esquemtico Init)
-
8/12/2019 practicas con pic 16f877a
129/160
LCD 4 BITS (esquemtico Init)
LCD 4 BITS (programa 3)
-
8/12/2019 practicas con pic 16f877a
130/160
C 4 S (p g 3)
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);
}
}
Conversin de tipo de datos
-
8/12/2019 practicas con pic 16f877a
131/160
p
Tipo de dato a cadena
ByteToStr
ShortToStr
WordToStr
IntToStr
LongToStr
FloatToStr
ByteToStr
-
8/12/2019 practicas con pic 16f877a
132/160
y
Descripcion: Crea una cadena de salida de un pequeo numero sinsigno (valor numrico menos a 0x100). La cadena esta ajustada aun ancho de 3 caracteres; Las posiciones a la izquierda que no seusan en la conversin se rellenan con espacios.
voidByteToStr(unsigned shortnumber, char*output);
Ejemplo:
unsigned shortt = 24;
char*txt= ; //se inicializa un apuntador a 4 espacios
ByteToStr(t, txt); // txt es " 24" (un espacio en blanco)
ShortToStr
-
8/12/2019 practicas con pic 16f877a
133/160
Descripcin: Crea una cadena de salida de un numero pequeocon signo (valor numrico menor a 0x100). La cadena estaajustada a un ancho de 4 caracteres; Las posiciones a laizquierda que no se usan en la conversin se rellenan conespacios.
voidShortToStr(shortnumber, char*output);
Ejemplo:shortt = -4;
char*txt= ; //Se inicializa un apuntador de 5 espacios
ShortToStr(t, txt);// txt es " -4" (dos espacio en blanco)
WordToStr
-
8/12/2019 practicas con pic 16f877a
134/160
Descripcin: Crea una cadena de salida de un numero sin signo(Valor numrico de una variable unsigned). La cadena estaajustada a un ancho de 5 caracteres; Las posiciones a laizquierda que no se usan en la conversin se rellenan conespacios.
voidWordToStr(unsignednumber, char*output);
Ejemplo:unsignedt = 437;
char*txt= ; // Inicializa un apuntador con 6 espacios
WordToStr(t, txt); // txt es 437" (dos espacios vacios)
IntToStr
-
8/12/2019 practicas con pic 16f877a
135/160
Descripcin: Crea una cadena de salida de un numero con signo(Valor numrico de una variable int). La cadena esta ajustada a unancho de 6 caracteres; Las posiciones a la izquierda que no se usanen la conversin se rellenan con espacios.
voidIntToStr(intnumber, char*output);
Ejemplo:intj = -4220;
char*txt= ; //Inicializa un apuntador con 6 espacios
IntToStr(j, txt); // txt es " -4220" (un espacio en blanco)
LongToStr
-
8/12/2019 practicas con pic 16f877a
136/160
g
Descripcin: Crea una cadena de salida de un numero largo con signo(Valor numrico de una variable long). La cadena esta ajustada aun ancho de 11 caracteres; Las posiciones a la izquierda que no seusan en la conversin se rellenan con espacios.
voidLongToStr(longnumber, char*output);
Ejemplo:longjj = -3700000;char*txt= ; // Inicializa un apuntador con 12 espacios
LongToStr(jj, txt); // txt es -3700000" (3 espacios en blanco)
FloatToStr
-
8/12/2019 practicas con pic 16f877a
137/160
Descripcin: Crea una cadena de salida de un numero de puntoflotante. La cadena contiene un formato normalizado de unnumero (mantisa entre 0 y 1) con signo en la primera posicin. Lamantisa esta ajustada a un formato de 6 dgitos, 0.ddddd; Haysiempre 5 dgitos a continuacin del punto decimal.
voidFloatToStr(floatnumber, char*output);
Ejemplo:floatff = -374.2;
char*txt= ; // Inicializa un apuntador con 14 espacios
FloatToStr(ff, txt); // txt es "-0.37420e3"
9.- Contador 0-9 (problema)
-
8/12/2019 practicas con pic 16f877a
138/160
9 9 ( )
Se quiere un programa que visualice un
conteo de 0 a 9 en un LCD.
Contador 0-9 (algoritmo)
-
8/12/2019 practicas con pic 16f877a
139/160
9 ( )
1. Configura el LCD
2. Inicializa el contador
3. Convierte a ASCII el valor del contador
4. Enva valor en ASCII al LCD
5. Incrementa el contador
6. Regresa a 3
Contador 0-9 (diagrama de flujo)
-
8/12/2019 practicas con pic 16f877a
140/160
9 ( )teclado
Inicializa puertos
(LCD)
Convierte contador
a ASCII
Enva a LCD
ASCII
Incrementacontador
Inicializa contador
Contador 0-9 (programa)
-
8/12/2019 practicas con pic 16f877a
141/160
9
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 (esquemtico)
-
8/12/2019 practicas con pic 16f877a
142/160
9
Contador 0-9 (funcionamiento)
-
8/12/2019 practicas con pic 16f877a
143/160
9
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
-
8/12/2019 practicas con pic 16f877a
144/160
j p p
1. Programa que utilice un LCD, configurado parausar un bus de 8 bits. En el LCD deben aparecer enforma secuencial, los nmeros de la secuencia 1 24 8 16 32 64 128 256 512 1024 2048
4096 8192 16384 - 32768. Los numero deben sergenerados por operaciones aritmticas. Eldesplegado debe hacerse de la forma mostrada enlas siguientes figuras. Se utiliza la segunda fila,presentando hasta 3 numeros consecutivos, unnumero a la izquierda, uno mas al centro y otro a laderecha.
Ejercicio propuesto 8
-
8/12/2019 practicas con pic 16f877a
145/160
j p p
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. . .
-
8/12/2019 practicas con pic 16f877a
146/160
Ejercicio propuesto 9
-
8/12/2019 practicas con pic 16f877a
147/160
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 (esquemtico)
-
8/12/2019 practicas con pic 16f877a
148/160
Teclado matricial (funciones)
-
8/12/2019 practicas con pic 16f877a
149/160
Keypad_Init
Keypad_Read
Keypad_Released
Keypad_Init
-
8/12/2019 practicas con pic 16f877a
150/160
Descripcin: Inicializa el puerto para trabajar con el teclado.Las terminales del teclado deben estar conectadas de lasiguiente 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 3port.F7 fila 4
voidKeypad_Init(unsigned*port);
Keypad_Init 2
-
8/12/2019 practicas con pic 16f877a
151/160
Ejemplo:
Keypad_Init(&PORTB);
Keypad_Read
-
8/12/2019 practicas con pic 16f877a
152/160
Descripcin: Verifica si alguna tecla fue presionada. La funcin regresa1 a 12, dependiendo la tecla presionada, o 0 si no existe tecla presionada.
1 1
2 2
9 9
* 100 11
# 12
unsigned shortKeypad_Read(void);
Ejemplo:kp = Keypad_Read();
Keypad_Released
-
8/12/2019 practicas con pic 16f877a
153/160
Descripcin: La llamada a la funcin Keypad_Released es una funcin blocking
call: La funcin espera hasta que cualquier tecla sea presionada y liberada. Cuando se
libera, la funcin regresa de 1 a 12, dependiendo de la tecla presionada.
unsigned shortKeypad_Released(void);
Ejemplo:
Keypad_Released();
10.- Teclado matricial (problema)
-
8/12/2019 practicas con pic 16f877a
154/160
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)
-
8/12/2019 practicas con pic 16f877a
155/160
1. Configuracin de puertos (teclado y lcd).
2. Lectura de teclado
3. Conversin a ASCII
4. Envo al LCD
5. Regresar a 2
Teclado matricial (diagramas de flujo)
-
8/12/2019 practicas con pic 16f877a
156/160
teclado
Inicializa puertos
(LCD y teclado)
Lee teclado
Convierte a ASCII
Enva a LCD
Teclado matricial (esquemtico)
-
8/12/2019 practicas con pic 16f877a
157/160
Teclado matricial (programa)unsigned short kp cnt;
-
8/12/2019 practicas con pic 16f877a
158/160
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 CLcd8_Cmd(LCD_CLEAR); // Limpia displayLcd8_Cmd(LCD_CURSOR_OFF); // Cursor apagadoLcd8_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 salidaswitch (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 LCDWordToStr(cnt, txt);Lcd8_Out(2, 10, txt);
} while (1);}
Ejercicio propuesto 9
-
8/12/2019 practicas con pic 16f877a
159/160
1. El alumno realizara un programa que tome 3
nmeros 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 divisin entre 2 resultantes.Visualizando los resultados en un LCD.
Ejercicio propuesto 9
-
8/12/2019 practicas con pic 16f877a
160/160
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: 050La divisin entre 2 es: 012