Story Transcript
DOCUMENTACIÓN PARA EL TRABAJO CON LA PLATAFORMA GUADALBOT
I.E.S VIRGEN DE LAS NIEVES
Programación C para microcontroladores
La función printf Índice de contenidos Introducción..........................................................................................................................................2 La función printf...................................................................................................................................2 Texto ordinario.................................................................................................................................2 Especificadores de formato..............................................................................................................2 Secuencias de escape.......................................................................................................................4 Función lcd_putc con características de printf.....................................................................................4 La función sprintf (specified print format)...........................................................................................4
1
Introducción En lenguaje C no existen palabras reservadas para obtener datos en la salida estándar o pantalla. Para poder realizar esto debemos usar una función de salida proporcionada por la biblioteca estándar de C, y esta no es otra que printf (print formated), que puede usarse para mostrar datos en pantalla vía RS232 con el hyperterminal, o bien en una LCD. Por el momento las explicaciones sobre esta función son aplicadas a un ordenador personal trabajando en modo consola. El motivo es que la explicación es más mucho fácil así. La función printf Esta función permite mostrar por pantalla (salida estándar) los valores o datos obtenidos de la evaluación de una lista de argumentos. Para llamar a esta función utilizaremos la siguiente sintaxis: printf(cadena de control [, argumento, argumento, --- ]); Los argumentos o parámetros se emplean para transferir datos de un programa a otro, por lo que cuando invocamos a la función printf, a ésta se le pasa una lista de argumentos (pueden ser expresiones). Los valores o datos obtenidos de la evaluación de esa lista de expresiones son los que se van a mostrar por la pantalla. En la cadena de control (una cadena de caracteres que debemos escribir entre comillas dobles) es donde debemos indicar el formato de salida de los datos que se van a mostrar por la pantalla. Para ello tenemos las siguientes posibilidades: • Texto ordinario. • Especificadores de formato. • Secuencias de escape. Texto ordinario Se trata de texto normal y corriente como el siguiente: printf("Hola mundo"); donde vemos el uso de la función printf sin ningún argumento, excepto la cadena de control. Especificadores de formato Cuando a la función printf se le pasa una lista de argumentos, debemos escribir un especificador de formato para cada argumento. Estos especificadores de formato establecen el formato de salida por pantalla de los argumentos. Una especificación de formato se compone de: %[flags] [ancho] [.precisión] tipo. Para indicar un formato comenzamos con % y algunos de los elementos siguientes: flags Significado -
Justifica el resultado a la izquierda que por defecto se hace a la derecha.
+
Antepone + o - al valor de salida. Por defecto solo se pone el signo - a los valores negativos.
0
Rellena con ceros no significativos hasta el ancho especificado.
Blanco Antepone un espacio en blanco al valor positivo de salida. Usado junto con + se ignora.
#
Si se usa con los especificadores de formato o, x o X antepone al valor de salida 0, 0x o 0X respectivamente. Si se usa con los especificadores de formato e, E o f fuerza que el valor de salida tenga en todos los casos el punto decimal. Si se usa con los especificadores de formato g o G fuerza que el valor de salida tenga en todos los casos el punto decimal no truncando los ceros arrastrados. Con los especificadores de formato c, d, i, u o s se ignora.
2
Elemento
Significado
Ancho
Minimo número de posiciones para la salida. Si el valor a escribir usa más posiciones el ancho es autoincrementado.
Precisión
Su significado depende del tipo de salida. Explicaremos seguidamente el significado de la precisión en función del tipo.
*
El ancho y la precisión pueden ser sustituidos por un * tomando estos campos el valor correspondiente al siguiente argumento entero.
tipo
Significado
d
(int) enteros con signo en base 10
i
(int) enteros con signo en base 10
u
(int) enteros sin signo en base 10
o
(int) enteros sin signo en base 8
x
(int) enteros sin signo en base 16 (0123456789abcdef )
X
(int) enteros sin signo en base 16 (0123456789ABCDEF)
f
(real) valor con signo de la forma -nnn.ddd. El número de digitos antes del punto depende del número y el de decimales de la precisión, que si no se especifica se establece por defecto en 6.
e
(real) valor con signo de la forma -n.dddde±eee
E
(real) valor con signo de la forma -n.ddddE±eee
g
(real) valor con signo en formato f o e según convenga para el valor y la precisión dados.
G
Es identico a g con la salvedad de que si tiene que introducir el exponente lo hace con E en lugar de con e.
c
(int) caracter correspondiente al byte menos significativo.
s
Escribir una cadena de caracteres hasta encontrar el primer carácter nulo (‘\0').
A continuación describimos el significado de precisión en función del tipo. Tipo
Significado de precisión
diuoxX
Especifica el número mínimo de digitos que se tienen que escribir rellenando con ceros a la izquierda si es necesario.
eEf
Especifica el número de dígitos a escribir después del punto decimal.
gG
Especifica el número máximo de dígitos significativos que se tienen que escribir, que por defecto es de 6.
c
La precisión no tiene efecto.
s
Especifica el número máximo de caracteres que se escribirán ignorando los sobrantes.
h
Prefijo para los tipos d, i, o, x y X que especifica el argumento como short int o con una u para especificar short unsigned int.
l
Prefijo para los tipos d, i, o, x y X que especifica el argumento como long int o con una u para especificar long unsigned int. Prefijo para los tipos e, E, f, g y G para especificar tipo double antes que float.
L
Prefijo para los tipos e, E, f, g y G para especificar tipo long double.
3
Por ejemplo:
nos originará la siguiente salida: Color: Rojo, Numero: 123, Numero real: 3.141592 La parte que aparece entre comillas indica los caracteres que queremos visualizar en pantalla con el formato que especifica el modificador % para ser sustituido por el valor correspondiente de la lista de valores. Secuencias de escape Una secuencia de escape siempre representa a un carácter del código ASCII. Dichos caracteres se pueden dividir en imprimibles (símbolos usados para escribir) y no imprimibles (representan acciones o secuencias de escape). La forma más sencilla de escribir una secuencia de escape es con el carácter barra invertida (\), seguido de un carácter especial. Por tanto, cuando en la cadena de control de la función printf se escribe una secuencia de escape, o bien se mostrará un carácter por pantalla, o bien se realizará una acción. Las secuencias de escape más usadas en C son: Lenguaje C ASCII Significado '\n'
10
Salto de línea
'\f'
12
Salto de página
'\t'
9
Tabulación horizontal
'\''
39
Comilla simple
'\”'
34
Comilla doble
'\\'
92
Barra invertida o Contrabarra
'\0'
0
No operación o carácter nulo
Función lcd_putc con características de printf En principio lcd_putc() sirve para enviar un sólo caracter a la LCD y printf(lcdputc,"") para enviar una cadena de caracteres entrecomillada. Otra diferencia importante es que el uso de lcd_putc() dentro del printf permite disponer de todos los especificadores de formato de printf(). Por ejemplo si queremos mostrar un numero real o un decimal con coma fija los formatos vistos no sirven para lcd_putc(). La función sprintf (specified print format) Existen muchas variantes de la función printf que por ahora no vamos explicar con la excepción de la función sprintf. Como ya hemos considerado, la función printf es como una rutina que genera un texto a partir de variables numéricas y de cadenas de caracteres, y ese texto se muestra en pantalla. La función sprintf genera ese mismo texto, pero en lugar de mostrarlo en pantalla, lo almacena en una cadena de caracteres, o sea lo guarda en un vector de tipo char.
4
Una sentencia como: char cadena[15]; cadena = “hola mundo”; es un código claramente incorrecto desde el punto de vista de los microcontroladores. En cambio con sprintf podemos implementarlo con sencillez: char cadena[15]; sprintf(cadena, “hola mundo”); Si lo que pretendemos es mostrar información en un formato complejo, como hemo visto con printf: float numero; numero = 3.1416; printf(“Resultado = %f”, numero * 2); Lo haremos con sprintf y depositamos el resultado en un vecto tipo cadena de caracteres: char cadena[20]; float numero = 3.1416; sprintf(cadena, “Resultado = %f”, numero * 2); Algo muy similar es lo que implementa el driver de la LCD mediante la función lcd_putc, como hemos dejado patente anteriormente.
5