Sunteți pe pagina 1din 11

I.E.

S PRADO DE SANTO DOMINGO

C.F.G.S. DESARROLLO DE PRODUCTOS ELECTRNICOS

PROGRAMACIN DE MICROCONTROLADORES PIC EN LENGUAJE C. COMPILADOR CCS.


Para escribir un programa en C con el CCS, se deben tener en cuenta una serie de elementos bsicos de su estructura: DIRECTIVAS DE PREPROCESADO. Controlan la conversin del programa a cdigo mquina por parte del compilador. Llevan el smbolo # al comienzo. PROGRAMAS o FUNCIONES: conjunto de instrucciones. Puede haber uno o varios. En cualquier caso siempre debe haber uno definido como principal mediante la inclusin de la llamada main(). INSTRUCCIONES: indican como se debe comportar el PIC en todo momento. COMENTARIOS: permiten describir lo que significa cada lnea del programa. DIRECTIVAS DE PREPROCESADO: # include <por ejemplo 16F877A.h> Especifica el fichero de encabezamiento del PIC a utilizar. # fuses Es una directiva que especifica la configuracin del PIC. Las opciones son: Reloj: LP (low power: baja potencia y baja frecuencia), XT (cristal hasta 4 MHz), HS (>4MHz), RC. Perro guardian: WDT, NOWDT. Power Up Timer: PUT, NO PUT. Cdigo protegido: PROTECT, NO PROTECT. Hay otras posibilidades, dependiendo del PIC. Se especifican las opciones que se deseen, separadas por comas. # use delay (clock = frecuencia del cristal en Hz) # otros include..., con los nombre de ficheros.c que hayan sido creados y deban ser incluidos, como por ejemplo si modificamos el driver para el LCD, pondramos, por ejemplo #include lcd_nuevo.C El compilador suministra los controladores (drivers) para diversos dispositivos como LCD, teclado, EEPROM serie, conversin A/D. Si se va a utilizar por ej. el LCD hay que mirar el fichero que incluye por si est preparado para un puerto especfico. En caso de utilizar en nuestra aplicacin otro puerto, crearemos el nuevo fichero o modificaremos el ya existente, por ej con el nombre lcd_nuevo.C #use standard_io(X) Con esta directiva se pueden utilizar las funciones output_x() e input_x() para escribir o leer en el puerto. El compilador se asegura de configurar el puerto mediante los TRIS, por lo que no tendremos que hacerlo nosotros. Entre parntesis hay que poner la letra del puerto A, B, C, #use fast_io(X)

DESARROLLO DE PROYECTOS DE PRODUCTOS ELECTRNICOS

Profesor: Jos Manuel Ortega

I.E.S PRADO DE SANTO DOMINGO

C.F.G.S. DESARROLLO DE PRODUCTOS ELECTRNICOS

Con esta directiva se pueden utilizar las mismas funciones anteriores, pero tendremos que encargarnos nosotros de los TRIS. Esta directiva mejora la eficiencia del programa, respecto a la anterior que incluir ms cdigo. Si no se especifica ninguna de las dos directivas anteriores, se pueden utilizar las funciones citadas de entrada y salida, pero configurando los TRIS, es decir, es como si se utilizara la estndar_io. #byte Esta directiva sirve para asignar un nombre a una posicin de memoria RAM. Por ejemplo: # byte puerto_a = 0x05 #bit Esta directiva sirve para asignar un nombre a un bit de una posicin de memoria RAM. Por ejemplo: # bit pulsador = puerto_a.0 OJO! El compilador de C no conoce nombres como PORTA, puerto_a, tris_B, etc., pero s reconoce las posiciones de memoria de la RAM reservadas a los registros de propsito especfico, por lo que si se desea utilizar los nombres, deber realizarse la asignacin correspondiente. No se debe confundir esto con algunas funciones propias del compilador de C, como set_tris_A(0xFF) que slo se pueden utilizar si se ha incluido la directiva correspondiente para que se incluyan estas funciones. Existen otras directivas como las que hacen relacin a las interrupciones, como por ejemplo #INT_EXT (interrupcin por RB0), #INT_RTCC (desbordamiento del timer0), #INT_AD (interrupcin por fin de conversin A/D),

LA GESTIN DE LOS PUERTOS Cada pin de un puerto puede programarse para actuar como entrada o como salida. La configuracin del puerto se realiza a travs del registro TRISx. En un microcontrolador los puertos y los TRIS ocupan posiciones fijas de la memoria RAM, En los PIC16, estas posiciones son: PORTA: posicin de memoria 0x05 PORTB: posicin de memoria 0x06 PORTC: posicin de memoria 0x07 Si hay ms puertos, stos ocupan posiciones de memoria sucesivas. Todas ellas estn en el banco 0. TRISA: TRISB: TRISC: posicin de memoria 0x85 posicin de memoria 0x86 posicin de memoria 0x87

Un cero en un bit del TRIS configura a ese bit del puerto como salida y un uno, como entrada. En los PIC18, tanto los puertos como los TRIS ocupan posiciones altas de memoria RAM. PORTA: TRISA: posicin de memoria 0xF80 posicin de memoria 0xF92

En el puerto A el pin RA4 tiene salida en drenador abierto en los PIC16 (pero no en los PIC18) lo que obliga a utilizar una resistencia de pull-up en caso de utilizarse como salida. Este terminal tiene
DESARROLLO DE PROYECTOS DE PRODUCTOS ELECTRNICOS Profesor: Jos Manuel Ortega

I.E.S PRADO DE SANTO DOMINGO

C.F.G.S. DESARROLLO DE PRODUCTOS ELECTRNICOS

entrada trigger-schmitt lo que permite su utilizacin como contador de eventos en conjuncin con el timer0. El puerto B tiene resistencias de pull-up internas que se pueden habilitar a travs del bit RBPU del OPTION_REG. Para habilitarlas se pone un cero en ese bit o bien con la instruccin de C: port_b_pullups(TRUE). Esto se hace cuando se va a utilizar el puerto como entrada y se desea poner resistencias de pull-up por si no queremos que haya estados indefinidos cuando los pines estn al aire, es decir no estn ni a cero ni a uno. No se puede hacer caso de utilizarlo como salida. Gestin de los puertos a travs de la RAM Se definen TRIS y PUERTOS como bytes, utilizando la directiva #byte y situndolos en las posiciones de memoria correspondiente. De esta forma se puede utilizar el nombre que le demos a la posicin de memoria y utilizarla para escribir datos en el puerto. Se puede declarar un bit de un registro con una variable mediante la directiva #BIT, lo que permite trabajar directamente con el terminal: #BIT nombre = posicin de memoria.bit Ejemplo: # BIT puls = 0x06.0

Gestin de los puertos a travs de Funciones en C en el Compilador CCS: Se pueden utilizar los nombres de las posiciones de memoria o tambin se pueden utilizar las siguientes funciones: Funciones que modifican un bit. bit_clear (variable, bit), por ej. bit_clear(puerto_b,7) bit_set(variable, bit) bit_test(variable, bit) swap(variable) esta funcin intercambia los nibbles. Funciones asociadas a un pin. Se pone, por ejemplo PIN_B7 . Este nombre lo reconoce porque lo tiene definido as en el fichero de encabezamiento .h del PIC. Las funciones son las siguientes (donde X es la letra del puerto y n es el nmero del pin). output_low(PIN_Xn); output_high(PIN_Xn); output_bit(PIN_Xn,valor); Pin a 0 o 1 (esto se especifica en lugar de valor). output_toggle(PIN_Xn); Cambia el nivel del pin input(PIN_Xn); Lee el pin

Funciones asociadas a puertos. El compilador ofrece funciones predefinidas para trabajar con los puertos siempre que se especifique la directiva primero. output_x(valor); unos) Lo que pongamos en valor lo saca por el puerto x, por ej. 0XFF (todos
Profesor: Jos Manuel Ortega

DESARROLLO DE PROYECTOS DE PRODUCTOS ELECTRNICOS

I.E.S PRADO DE SANTO DOMINGO

C.F.G.S. DESARROLLO DE PRODUCTOS ELECTRNICOS

input_x();

Lee el puerto. Esta funcin devuelve el valor del puerto entero. No se especifica nada entre los parntesis. set_tris_x(valor); Carga el TRIS get_tris_x(); Devuelve el valor del TRIS Donde pone valor, ir un nmero, si no hay nada ms es que est expresado en decimal. Si empieza por 0x, es que est en hexadecimal, si empieza por 0b, en binario y si va entre comillas simples, ser un carcter. Todas las funciones output() e input() se utilizan con las directivas:

#use fast_io(x) Con output_x() saca el valor al puerto y con input_x(), lee. Hay que configurar primero los TRIS, por ej. con set_tris_x(); #use standard_io(x) Las mismas funciones anteriores pueden utilizarse sin tener que configurar los TRIS, pues se encarga de ello el cdigo asociado a la directiva. Si no se especifica la directiva, entonces para utilizar las funciones de entrada y salida, hay que configurar primero los puertos a travs de los TRIS. Las funciones anteriores trabajan con todo el puerto. Si se desea trabajar slo con un pin de un puerto, es preferible utilizar las funciones asociadas a un pin, comentadas anteriormente.

TIPOS DE DATOS EN C. Int1 o Short. Entero de un bit. Tamao: 1 bit Int o Int8: Entero. Tamao 8 bits (0 a 255) Int16 o Long: Entero de 16 bits. (0 a 65535) Int32: Entero de 32 bits (0 a 4.294.967.295) Float: Coma flotante. Tamao 32 bits Char: Carcter. Tamao 8 bits (0 a 255) Void: sin valor Signed Int8: Entero con signo. Tamao 8 bits (-128 a 127) Signed Int16: Entero largo con signo. Tamao 16 bits (-32768 a 32767) El Compilador CCS tambin contempla el tipo byte, con un tamao de 8 bits. A veces el valor de una variable no cambia nunca. Esto sucede cuando se utiliza la variable para contener un nmero fijo, til por ejemplo en clculos. Por tanto realmente no se trata de una variable sino de una constante, pero se desea utilizar una palabra para manejar dicha constante. Por ejemplo: giro = 360, para recordar que un ngulo completo corresponde a 360 grados. En este caso es til avisar al compilador de que se trata de una constante. Por tanto en lugar de declarar int giro = 360;, es mejor declarar const int giro = 360; cualquier intento de modificar el valor de giro mediante, por ejemplo una asignacin giro = 330, ser indicado como error por el compilador.

Operadores de asignacin. += Ej. x+=y, es lo mismo que x = x + y


Profesor: Jos Manuel Ortega

DESARROLLO DE PROYECTOS DE PRODUCTOS ELECTRNICOS

I.E.S PRADO DE SANTO DOMINGO

C.F.G.S. DESARROLLO DE PRODUCTOS ELECTRNICOS

-= *= /= %= <<= >>= &= |= ^=

Asignacin del resto de la divisin Desplazamiento a izquierda Desplazamiento a derecha AND de bits OR de bits OR exclusiva de bits

Operadores relacionales. < > >= <= == != ?:

Ej. min = (a < b) ? a : b

Operadores lgicos ! && || NOT AND OR

Operadores de bits & ^ | AND OR EXCLUSIVA OR

Ejercicios de programacin: 1. Contador de dcadas con visualizacin en display. (se recomienda utilizar un array) 2. Contador 0 a 99 con visualizacin en display doble (multiplexacin).

LAS INTERRUPCIONES Y LOS TEMPORIZADORES Las interrupciones permiten a cualquier suceso interior o exterior interrumpir la ejecucin del programa principal en cualquier momento. En el momento de producirse la interrupcin, el PIC ejecuta un salto a la rutina de atencin a la interrupcin previamente definida por el programador, donde se atender a la demanda de la interrupcin. Cuando se termina de ejecutar dicha rutina, el PIC retorna a la ejecucin del programa principal en la misma posicin de memoria de programa donde se produjo la interrupcin. El manejo de interrupciones permite realizar programas que no tienen que estar consultando sucesos mediante polling, las cuales provocan retardos en la ejecucin del programa principal.

DESARROLLO DE PROYECTOS DE PRODUCTOS ELECTRNICOS

Profesor: Jos Manuel Ortega

I.E.S PRADO DE SANTO DOMINGO

C.F.G.S. DESARROLLO DE PRODUCTOS ELECTRNICOS

Los timer o temporizadores son mdulos integrados en el micro que permiten contar eventos tanto internos como externos. Cuanto la cuenta es interna se habla de temporizacin y cuando es externa de contador. Los timers estn ligados al uso de interrupciones, pero no por ello se utilizan siempre de forma conjunta. Al producirse una interrupcin el PIC salta a la direccin del vector de interrupcin de la memoria de programa y ejecuta la porcin de programa correspondiente a la atencin de la interrupcin, hasta encontrar la instruccin RETFIE, entonces abandona la interrupcin y retorna a la posicin de memoria del programa principal desde la que salt al producirse la interrupcin. El 16F84 tiene cuatro fuentes de interrupcin, mientras que la familia 16F87X tiene 14. Las cuatro posibilidades de interrupcin del 16F84 son: Interrupcin INT por activacin del pin RB0/INT Interrupcin RBI. Por cambio de estado en una o varias de las 4 lneas de mayor peso del puerto B. Interrupcin T01. Por desbordamiento del timer 0. Interrupcin EEI. Por la finalizacin de escritura en EEPROM. El vector de interrupcin est en la direccin de memoria de programa 04h. El micro posee unos registros de control donde, mediante flags el usuario puede determinar que es lo que ha producido la interrupcin y adems habilitar o no las distintas fuentes (mscaras de interrupcin). El registro INTCON permite la habilitacin de interrupciones y el manejo de los flags. El bit 7 de este registro (llamado GIE) permite la habilitacin global de interrupciones. Existen otros cuatro registros para la gestin de interrupciones: PIR1, PIR2, PIE1 y PIE2. Para cualquiera de las interrupciones hay que utilizar una funcin de C que tiene que ir en el programa principal: enable_interrupts (nivel); nivel es una contante definida en el fichero de cabecera del pic. Por ejemplo en el caso de utilizar la interrupcin por el pin RB0, se pondr: enable_interrupts (int_ext) Otras posibilidades de nivel son: GLOBAL, para habilitar todo tipo de interrupciones. INT_RTCC o INT_TIMER0, para el timer0. INT_EXT para haabilitar interrupcin por RB0; INT_RB interrupcin por cambio en alguno de los pines RB4 a RB7; INT_AD por conversin A/D; INT_RDA (dato recibido, rs232); INT_TBE (buffer de transmisin vaco para rs232); INT_SSP (actividad en SPI o I2C); INT_CCP1: INT_CCP2; INT_TIMER1; INT_TIMER2; INT_EEPROM. Hay que utilizar la directiva correspondiente. Por ejemplo, en el caso de interrupcin por RB0, ser: #INT_EXT En la lnea siguiente a esta directiva y por lo tanto antes de la funcin main es obligatorio dar un nombre a la funcin de interrupcin y escribir el programa que corresponde a la misma (rutina de atencin a la interrupcin).

DESARROLLO DE PROYECTOS DE PRODUCTOS ELECTRNICOS

Profesor: Jos Manuel Ortega

I.E.S PRADO DE SANTO DOMINGO

C.F.G.S. DESARROLLO DE PRODUCTOS ELECTRNICOS

Adems, en este caso, para RB0, es preciso utilizar alguna de las dos funciones siguientes, con el fin de elegir el flanco activo de la seal que provoca la interrupcin exterior por dicho pin: ext_int_edge(H_TO_L); ext_int_edge(L_TO_H); Una u otra, la elegida ir en el programa principal inmediatamente despus de la funcin enable_interrupts(ext_int) y despus ir la funcin: enable_interrupts(global);

TIMER 0
El bloque funcional TIMER0/WATCHDOG es un registro de 8 bits incrementado por hardware y programable. La cuenta mxima, por tanto, al ser de 8 bits, es de 255. Se puede utilizar como: Contador: cuenta los eventos externos (a travs del pin RA4/T0CK1). Temporizador: cuenta los pulsos internos de reloj. Se puede insertar un prescaler (predivisor), es decir, un divisor de frecuencia programable, que permite la divisin por 2, 4, 8, 16, 32, 64, 128 o 256. La frecuencia con la que se incrementa el temporizador es una cuarta parte de la frecuencia de reloj (fosc/4). Posteriormente, con el uso del prescaler se puede dividir la frecuencia. Este bloque puede funcionar como WATCHDOG, lo que permite que durante el funcionamiento normal del microcontrolador, un desbordamiento (o timerout) del watchdog provoque un reset (Watchdog Timer Reset). Para evitar el desbordamiento se debe, cada cierto tiempo y antes de que llegue al lmite, ejecutar la instruccin CLRWDT que borra el watchdog y que hace comenzar la cuenta de nuevo desde cero. Se basa en un oscilador RC interno independiente del oscilador del microcontrolador y que no requiere ningn componente externo. El watchdog cuenta incluso si el reloj conectado a OSC/CLK1 est parado, por ejemplo por la instruccin SLEEP o por un defecto del cristal. Los registros implicados en la configuracin del TIMER0 son: OPTION_REG: configura el hardware del TIMER0 INTCON: permite trabajar con la interrupcin del TIMER0 TRISA: habilita la patilla RA4. El TIMER 0 se incrementa con cada ciclo de mquina, es decir, cada cuatro ciclos de reloj. Si el reloj es de 4 MHz, el ciclo de reloj tiene un periodo de 0,25us, por lo que el TIMER0 se incrementa justamente cada microsegundo. Si se desea que se incremente cada 2us habr que habilitar un prescaler de 2, si se desea cada 4 us, de 4 y as sucesivamente. El tiempo de desbordamiento del TIMER0 se calcula segn la siguiente ecuacin: T = Tcm * Prescaler * ( 256 Carga TMR0). Siendo Tcm el tiempo del ciclo de mquina, o sea 4 ciclos de reloj (4/fosc). La funcin para configurar el TIMER0, en lenguaje C es: setup_timer_0 (modo) Donde modo est definido en el fichero de cabecera (afecta a los bits 5:0 del OPTION_REG): RTCC_INTERNAL: para reloj interno RTCC_EXT_L_TO_H : para contar eventos por RA4 por cada flanco ascendente.
DESARROLLO DE PROYECTOS DE PRODUCTOS ELECTRNICOS Profesor: Jos Manuel Ortega

I.E.S PRADO DE SANTO DOMINGO

C.F.G.S. DESARROLLO DE PRODUCTOS ELECTRNICOS

RTCC_EXT_H_TO_L : para contar eventos por RA4 por cada flanco descendente. RTCC_DIV_1: slo puede asignarse al watchdog. RTCC_DIV_2: para reloj interno, dividiendo por 2 la frecuencia (aumenta el tiempo). RTCC_DIV_4: para reloj interno, dividiendo por 4 la frecuencia (aumenta el tiempo). RTCC_DIV_8: para reloj interno, dividiendo por 8 la frecuencia (aumenta el tiempo). RTCC_DIV_16: para reloj interno, dividiendo por 16 la frecuencia (aumenta el tiempo). RTCC_DIV_32: para reloj interno, dividiendo por 32 la frecuencia (aumenta el tiempo). RTCC_DIV_64: para reloj interno, dividiendo por 64 la frecuencia (aumenta el tiempo). RTCC_DIV_128: para reloj interno, dividiendo por 128 la frecuencia (aumenta el tiempo). RTCC_DIV_256: para reloj interno, dividiendo por 256 la frecuencia (aumenta el tiempo). Los distintos modos se pueden agrupar: setup_timer_0 (RTCC_div2 | RTCC_EXT_L_TO_H) El prescaler mnimo para el TIMER0 es de 2. setup_wdt (modo) Donde modo est definido en el fichero de cabecera (afecta a los bits 3:0 del OPTION_REG): WDT_18MS: duracin de 18 ms WDT_36MS: duracin de 36 ms WDT_72MS: duracin de 72 ms WDT_144MS: duracin de 144 ms WDT_288MS: duracin de 288 ms .. hasta 2304 ms. Para activar el Watchdog, recordemos que se realiza a travs de la directiva #fuses El compilador de C suministra una serie de funciones para leer o escribir en el TIMER0/WDT: Para escribir un valor en el TIMER0: set_timer0 (valor); siendo valor un entero de 8 bits. En este momento, se carga con el valor y comienza la temporizacin o cuenta a partir de dicho valor, hasta desbordarse. Para leer el valor actual del registro: valor = get_timer0(); Para realizar la puesta a cero del wdt: restart_wdt(); Hay que tener en cuenta que el TIMER0 puede utilizarse con o sin interrupcin. Si se desea generar interrupcin cuando se desborde, entonces habr que poner la directiva #INT_RTCC e inmediatamente despus de sta, la funcin de atencin a la interrupcin. Ejemplo de utilizacin del timer0: Generar una seal cuadrada de 1 KHz utilizando la interrupcin del TIMER0. Para generar dicha seal se necesita un semiperiodo de 500us. Segn la ecuacin de desbordamiento del TIMER0, utilizando un cristal de 4MHz y un prescaler de 2: 500us = (4/400000) * 2 * (256 x) Despejando x, sale un valor de 6. Es decir, se debe cargar el TIMER0 con este valor. Pero esta relacin slo se cumple si se trabaja en ensamblador. Al trabajar en C, el compilador genera lneas de cdigo que aumentan el tiempo de ejecucin del programa, por lo que es necesario ajustar el valor final. El programa quedara as:
DESARROLLO DE PROYECTOS DE PRODUCTOS ELECTRNICOS Profesor: Jos Manuel Ortega

I.E.S PRADO DE SANTO DOMINGO

C.F.G.S. DESARROLLO DE PRODUCTOS ELECTRNICOS

#include <16F877.h> #use delay(clock = 4000000) #fuses XT, NOWDT #use standard_io(B) #int_timer0 void temporizacion(void) // funcin de interrupcin del timer0 { output_toggle(PIN_B0); set_timer0(6); // se recarga el timer0 con el valor adecuado. Obsrvese que es necesario // ajustar el valor si se desea precisin } void main() { setup_timer_0 (RTCC_INTERNAL | RTCC_DIV_BY_2); set_timer0(0x1D); enable_interrpts (INT_TIMER0); enable_interrpts (GLOBAL); while(1); } Simular el programa en ISIS observando la seal con el osciloscopio digital y activando los cursores en el men de Trigger. Ejercicio: Led intermitente aproximadamente a 2Hz utilizando el TIMER0.

LCD
Son dispositivos de visualizacin de caracteres. El nmero de caracteres es variable por lnea y stas tambin lo son dependiendo del modelo de LCD. Utilizaremos uno de 2 lneas y 16 caracteres por lnea. El LCD dispone de 16 pines: 1:VSS; 2: VCC; 3: contraste; 4: RS seleccin de registro; 5 R/W; 6: enable; 7 al 14: D0 a D7. Los Pines 15 y 16: estarn destinados para suministrar la corriente al Back Light. Son el + (A) y el (K) respectivamente. No todos los mdulos LCD disponen del Back Light aunque tenga los pines de conexin en el circuito impreso. Se pueden utilizar los 8 pines del bus de datos o, para ahorrar pines, tan slo 4, pero en este caso, realmente el procesador interno del LCD est multiplexando. A la hora de programar, hay que tenerlo en cuenta pues si la frecuencia del reloj del PIC que lo controla es alta, puede haber errores. Esto suele ocurrir con los PIC18 cuando la frecuencia es de 20MHz., por tanto habr que poner retardos antes de la siguiente instruccin. En CCS se dispone de un fichero (driver) que permite trabajar con este tipo de LCD (LCD.C). Debe llamarse con una directiva #include. Este archivo dispone de varias funciones ya definidas: lcd_init();

DESARROLLO DE PROYECTOS DE PRODUCTOS ELECTRNICOS

Profesor: Jos Manuel Ortega

I.E.S PRADO DE SANTO DOMINGO

C.F.G.S. DESARROLLO DE PRODUCTOS ELECTRNICOS

Esta es la primera funcin que debe ser llamada. Borra el LCD y lo configura en el formato de 4 bits, con dos lneas y con caracteres de 5x8 puntos. lcd_gotoxy (byte x, byte y); Indica la posicin de acceso al LCD. Siendo x la posicin del carcter empezando por la izquierda (por lo tanto x no podr ser mayor de 16) e y el nmero de la lnea (por lo tanto no podr ser y mayor de 2). Por ejemplo, (1,2) indica la primera posicin de la sgunda lnea lcd_getc (byte x, byte y); Lee el carcter de la posicin (x,y). lcd_putc (char s); Esta funcin escribe la variable en la posicin correspondiente. s es una variable de tipo char. Si adems se indica: \f se limpia el LCD \n el cursor se va a la posicin (1,2) \b el cursor retrocede una posicin El compilador ofrece una funcin ms verstil para trabajar con el LCD: printf(string) printf(fname, cstring, values) string es una cadena o un array de caracteres, values es una lista de variables separadas por comas y fname es una funcin. El formato es %nt donde n es opcional y puede ser: 1-9 para especificar cuantos caracteres se deben imprimir. 01 a 09 para indicar ceros a la izquierda. 1.1-9.9 para coma flotante. t puede indicar: c carcter s cadena u entero sin signo d entero consigno lu entero largo sin signo ld entero largo con signo x entero hexadecimal en minsculas X entero hexadecimal en maysculas f flotante e flotante exponencial Ej. printf(hola); printf(lcd_putc, n=%u, n); El driver lcd.c que contiene el compilador CCS, est pensado para trabajar con el puerto D o el puerto B. Por defecto utiliza el D, a menos que se le indique lo contrario abriendo el driver lcd.c y quitando el comentario a la directiva #define use_portb_lcd TRUE. Tambin se puede modificar el propio fichero con el fin de utilizarlo para otro puerto no previsto, o para otros pines de control, en cuyo caso conviene guardar el driver con otro nombre incluyendo este nuevo nombre en el programa que hagamos, por medio de una directiva #include. Ejercicios: 1. Mostrar diferentes mensajes en la pantalla del LCD. 2. Mostrar varios mensajes en posiciones y lneas diferentes. 3. Mostrar el contenido de variables numricas y de caracteres.
DESARROLLO DE PROYECTOS DE PRODUCTOS ELECTRNICOS Profesor: Jos Manuel Ortega

I.E.S PRADO DE SANTO DOMINGO

C.F.G.S. DESARROLLO DE PRODUCTOS ELECTRNICOS

4. Mensaje mvil que comience en la primera fila y pase a la siguiente desapareciendo por la derecha. 5. Mensaje mvil que se desplace de derecha a izquierda. 6. Mensaje mvil que se desplace de derecha a izquierda y viceversa (efecto rebote).

TECLADO
Para trabajar con informacin alfanumrica se utilizan los teclados matriciales, de 3x4, 4x4, El compilador ofrece un driver, el kbd.C para manejar teclado de 3x4. Las funciones que incorpora son: kbd_init() Inicializa el sistema. kbd_getc() Devuelve el valor de la tecla pulsada en funcin de la tabla que tiene programada. char const KEYS[4][3] = {{1,2,3}, {4,5,6}, {7,8,9}, {*,0,#}}; A travs de la modificacin de esta tabla podemos adecuar el resultado del programa a las distintas cartulas del teclado. Dicho driver est pensado para trabajar con el puerto B o el D. Si deseamos visualizar el valor de la tecla pulsada, tendremos que tener en cuenta que se est leyendo su valor en ASCII por lo que si se desea ver el nmero habr que convertirlo a su valor numrico correspondiente restando 48 (30 en hexadecimal). Esto se debe a que en ASCII el cero es 30h (48 en decimal).

DESARROLLO DE PROYECTOS DE PRODUCTOS ELECTRNICOS

Profesor: Jos Manuel Ortega

S-ar putea să vă placă și