Introducción al Lenguaje C - Parte V Universidad de Los Andes
Librería de Funciones Las funciones que se usan comúnmente en varios programas se deben agrupar en librerías, Las librerías de funciones usan dos archivos: Archivo con las declaraciones y prototipos de las funciones (archivo.h) y Archivo con el desarrollo de las funciones archivo.c cuando es publico el desarrollo de las funciones y archivo.lib cuando no es público el desarrollo de las funciones
Archivo.h Sintaxis: # ifndef NOMBRE_LIBRERIA # define NOMBRE_LIBRERIA // declaraciones // Prototipos # endif
Archivo.c Sintaxis: # include <xc.h> # include " archivo.h" // Desarrollo de las Funciones
Ejercicio 14 (E14)
lcd 4bit.h # ifndef LCD_4BIT_H # define LCD_4BIT_H # define _XTAL_FREQ 4000000 # define LCD_ RS LD2 # define LCD_ EN LD3 # define LCD_DATA LATD # define LCD_RS_TRIS TRISD2 # define LCD_EN_TRIS TRISD3 # define LCD_DATA_TRIS TRISD
lcd 4bit.h void LCD_init ( void ); void LCD_write_4bits ( char, char ); void LCD_write (char, char ); void LCD_clear ( void ); void LCD_putc ( char ); void LCD_puts ( const char *); void LCD_gotoxy ( char, char ); # endif
lcd 4bit.c # include <xc.h> # include " lcd_4bit.h" void LCD_init ( void ) { LCD_RS_TRIS = 0; LCD_EN_TRIS = 0; LCD_DATA_TRIS &= 0 x0f ; LCD_ RS = 0; LCD_ EN = 0;
E14.c # include <xc.h> # include " lcd_4bit.h" // Palabras de CONFIGURACION void main ( void ) { LCD_init (); LCD_clear (); LCD_gotoxy (4,0); LCD_puts ("* LCD *"); LCD_gotoxy (0,1); LCD_puts (" Microcontrolador "); } while (1) continue ;
Cadenas de caracteres No existe un tipo predefinido para manipular cadenas, Se declaran como vectores tipo char Sintaxis: char cadena [ num_elementos ]; Toda cadena ha de terminar con el carácter especial 0 (cero).
Inicializar Cadenas de caracteres En la declaración: char cad [4] = " abc "; NO se puede hacer una asignación de ese tipo en una sentencia: cad = " xyz "; /* ERROR */
Inicializar Cadenas de caracteres Formas equivalentes de inicializar una cadena: char cad [4] = " abc "; char cad [4] = { a, b, c, \0 }; void main ( void ) { char cad [4]; cad [0] = a ; cad [1] = b ; cad [2] = c ; cad [3] = \0 ; }
Manejo de cadenas con librería string.h Sintaxis: (algunas funciones) # include <string.h> strcpy ( c1, c2 ); // Copia c2 en c1 strcat ( c1, c2 ); // A~nade c2 al final // de c1 int strlen ( cadena ); // Devuelve la longitud int strcmp ( c1, c2 ); // Devuelve cero si c1 // es igual a c2; // no - cero en caso // contrario
Manejo de cadenas con librería string.h Ejemplo: # include <string.h> char comp [42], nom [20] = " Luis ", ape [20] = " Araujo ", tam ; void main ( void ) { strcpy (comp, nom ); // comp = " Luis " strcat (comp, " "); // comp = " Luis " strcat ( comp, ape ); // comp = " Luis Araujo " tam = strlen ( comp ); // tam = 11 }
Manejo de cadenas con librería stdio.h la función sprintf se utiliza para manipular cadenas, Sintaxis: sprintf ( cadena, " CadenaFormato ", arg1, arg2,... argn ); CadenaFormato: %d Entero %c Carácter %f Punto flotante %s Cadena
Manejo de cadenas con librería stdio.h Ejemplos: %5d Entero decimal alineado a la izquierda, ocupando cinco espacios %02u Entero decimal ocupando dos espacios, y rellenando de ceros a la izquierda si hace falta %3.2f Punto Flotante con tres dígitos, dos en la parte fraccionaria %4s Cadena de caracteres ocupando cuatro espacios
Manejo de cadenas con librería stdio.h Ejemplo: # include <stdio.h> char T [20]; sprintf (T, " Hora : %d: %d: %d", h, m, s); sprintf (T, "a= %f a*a= %.2f", 2.3, 2.3*2.3); sprintf (T, " nom %s edad %d", cad2, edad ); sprintf (T, "d= %d c= %c", 50, 50); // d =50 c=2
Ejercicio 15 (E15)
Ejercicio 15 (E15)
Ejercicio 15 (E15) # include <xc.h> # include <stdio.h> # include <string.h> # include " lcd_4bit.h" // Palabra de CONFIGURACION void Delay_Seg ( char ); void main ( void ) { }
Ejercicio 15 (E15) char hor = 0, min = 0, seg = 0, n = 0; char texto1 [17] = "** Cronometro **"; char texto2 [17]; texto2 [0] = \0 ; OSCCON = 0 x68 ; LCD_init (); LCD_clear (); LCD_puts ( texto1 ); sprintf ( texto2, " %02d: %02d: %02d", hor, min, seg ); LCD_gotoxy (4,1); LCD_puts ( texto2 );
Ejercicio 15 (E15) while (1) { while ( PORTCbits. RC0 == 1) continue ; Delay_Seg (1); if(seg == 59) { seg = 0; if(min == 59) { min = 0; if( hor == 23) hor = 0; else hor ++; } else min ++; } else seg ++; //... }
Ejercicio 15 (E15) LCD_gotoxy (0,0); if( strlen ( texto1 ) == 16) { LCD_puts (" "); texto1 [0] = \0 ; } else { strcat ( texto1, "*"); LCD_puts ( texto1 ); } sprintf ( texto2, " %02d: %02d: %02d", hor, min, seg ); LCD_gotoxy (4,1); LCD_puts ( texto2 );
Ejercicio 15 (E15) void Delay_Seg ( char s) { char i; while (s > 0) { for ( i = 0; i < 10; i ++) delay_ms (100); s - -; } }