Programa de comprobación
Éste programa se usará durante la evaluación de la práctica 2 para ver si la librería de pantalla cumple las especificaciones. Puede usarlo para testear su código durante la fase de desarrollo. Si todo va bien, muestra un mensaje en pantalla "Test OK". En caso de error, hace parpadear el led1. Instrucciones: en su proyecto P2.1 sustituya su programa principal por éste. Compílelo y ejecútelo. El programa irá llamando a todos los servicios de la librería lcd.asm de la forma que se muestra en el vídeo. Vaya descomentando trozos de código conforme vaya consiguiendo que funcionen bien sus subrutinas en ensamblador.
main.c
—
C source code,
6Kb
Contenido del Archivo
/**
* @author Sebasti�Garc�Caro (sgarcia15@us.es)
*
* - Este programa ejecuta un test de verificaci�ara los m�os a desarrollar en la pr�ica 2.
* - Vaya descomentando a medida que va desarrollando los distintos m�os para probarlos.
* - Muchos de los tests de verificaci�equierie de haber superado los tests previos. No continue al siguiente test hasta que no supere el previo.
* - En algunos tests se solicita la pulsaci�el SW2 para continuar. Cuando se solicite la pulsaci�se activar�l LED verde del launchpad.
*
*/
#include <msp430.h>
#include <stdint.h>
#include "lcd.h"
void printLCD(uint8_t *str);
void printLCDer(uint8_t *str);
void configuraPeriferia(void);
void delay(void);
void error(void);
void check(uint8_t cond);
void waitSW2(void);
void testFuncIcn(uint8_t (*func)(uint8_t));
/**
* main.c
*/
int main(void)
{
WDTCTL = WDTPW | WDTHOLD; // stop watchdog timer
PM5CTL0 &= ~LOCKLPM5; //Desbloquea los puertos de E/S
configuraPeriferia();
lcdIni();
/*
* TEST lcda2seg
*
* Si los tests son correctos, no debe quedarse el LED rojo parpadeando
*/
/*
check(lcda2seg(31)!=0xFFFF);
check(lcda2seg(128)!=0xFFFF);
check(lcda2seg(32)!=0);
check(lcda2seg(127)!=0);
check(lcda2seg('0')!=0b0010100011111100);
*/
/*
* TEST lcdPintaIzq
*
* Va imprimiendo la secuencia 123456. Se espera la pulsaci�e SW para imprimir un nuevo caracter.
*/
/*
lcdPintaIzq('1'); waitSW2();
lcdPintaIzq('2'); waitSW2();
lcdPintaIzq('3'); waitSW2();
lcdPintaIzq('4'); waitSW2();
lcdPintaIzq('5'); waitSW2();
lcdPintaIzq('6'); waitSW2();
*/
/*
* TEST lcdPintaDer
*
* Va imprimiendo la secuencia 654321. Se espera la pulsaci�e SW para imprimir un nuevo caracter.
*/
/*
lcdPintaDer('1'); waitSW2();
lcdPintaDer('2'); waitSW2();
lcdPintaDer('3'); waitSW2();
lcdPintaDer('4'); waitSW2();
lcdPintaDer('5'); waitSW2();
lcdPintaDer('6'); waitSW2();
*/
/*
* TEST lcdBateria
*
* Va encendiendo progresivamente el icono de la bater� Tras encenderlo al completo, realiza el apagado en sentido inverso.
* Se comprueba que la funci�evuelve el estado anterior de la bater� Si no lo devolviese, el LED rojo parpadear�
*/
//testFuncIcn(lcdBateria);
/*
* TEST lcdIconos
*
* Va encendiendo progresivamente los iconos. Tras encenderlos todos, realiza el apagado en sentido inverso.
* Se comprueba que la funci�evuelve el estado anterior de los iconos. Si no lo devolviese, el LED rojo parpadear�
*/
//testFuncIcn(lcdIconos);
/*
* TEST lcdInterDigito
*
* Va encendiendo progresivamente los puntos decimales, separador de hora y signo negativo. Tras encenderlos todos, realiza el apagado en sentido inverso.
* Se comprueba que la funci�evuelve el estado anterior de los iconos. Si no lo devolviese, el LED rojo parpadear�
*/
//testFuncIcn(lcdInterDigito);
/*
* TEST lcdBorra
*
* Enciende todos la la pantalla. Espera una pulsaci�el SW para realizar borrado.
* Si la funci�cdBorra est�ien implementada, debe borrar solo los correspondintes a los digitos y no el resto.
*/
/*
printLCD("888888");
lcdBateria(0xFF);
lcdIconos(0xFF);
lcdInterDigito(0xFF);
waitSW2();
lcdBorra();
delay();
/*
* TEST lcdBorra
*
* Enciende todos la la pantalla. Espera una pulsaci�el SW para realizar borrado.
* Si la funci�cdBorraTodo est�ien implementada, debe limpiar toda la pantalla.
*/
/*
printLCD("888888");
lcdBateria(0xFF);
lcdIconos(0xFF);
lcdInterDigito(0xFF);
waitSW2();
lcdBorraTodo();
delay();
*/
/*
* TEST lcdPintaIzq (integral)
*
* Enciende varios segmentos auxiliares y va pintando la secuencia 123456 al pulsar SW2
* Si la funci�cdPintaIzq est�ien implementada, no deben modificarse ninguno de los segmentos auxiliares.
*/
/*
lcdBorraTodo();
lcdInterDigito(0b01010101);
lcdIconos(0b01010101);
waitSW2();
lcdPintaIzq('1'); waitSW2();
lcdPintaIzq('2'); waitSW2();
lcdPintaIzq('3'); waitSW2();
lcdPintaIzq('4'); waitSW2();
lcdPintaIzq('5'); waitSW2();
lcdPintaIzq('6'); waitSW2();
*/
/*
* TEST lcdPintaDer (integral)
*
* Enciende varios segmentos auxiliares y va pintando la secuencia 123456 al pulsar SW2
* Si la funci�cdPintaIzq est�ien implementada, no deben modificarse ninguno de los segmentos auxiliares.
*/
/*
lcdBorraTodo();
lcdInterDigito(0b01010101);
lcdIconos(0b01010101);
waitSW2();
lcdPintaDer('1'); waitSW2();
lcdPintaDer('2'); waitSW2();
lcdPintaDer('3'); waitSW2();
lcdPintaDer('4'); waitSW2();
lcdPintaDer('5'); waitSW2();
lcdPintaDer('6'); waitSW2();
lcdBorraTodo();
*/
uint32_t i=0;
while(1){
P9DIR^=BIT7;
//printLCD("TestOK");
//for(i=0;i<10000;i++);
//lcdBorra();
for(i=0;i<10000;i++);
}
}
void configuraPeriferia(void){
//configura LED rojo
P1DIR|=BIT0; //LED rojo como salida
P1OUT&=~BIT0; //y apagado por defecto
//configura LED verde
P9DIR|=BIT7; //LED verde como salida
P9OUT&=~BIT7; //y apagado por defecto
//configura SW1
P1DIR&=~BIT2; //SW2 como entrada
P1OUT|=BIT2; //con pull-up
P1REN|=BIT2; //y resistencia activa
return;
}
void printLCD(uint8_t *str){
while(*str!=0){
lcdPintaIzq(*str);
str++;
}
return;
}
void printLCDer(uint8_t *str){
while(*str!=0){
lcdPintaDer(*str);
str++;
}
return;
}
//delay rudimentario
void delay(void){
uint32_t i;
for(i=40000;i>0;i--);
return;
}
void error(void){
while(1){
delay();
P1OUT^=BIT0;
}
}
inline void check(uint8_t cond){
if(cond) error();
}
//funci�udimentaria (y bloqueante...) para esperar pulsaci�void waitSW2(void){
uint16_t i=0;
P9OUT|=BIT7; //encende led para indicar que hay que pulsar....
while(P1IN&BIT2); //Espera pulsaci�.
for(i=10000;i>0;i--); //debouncing por si acaso...
while(!(P1IN&BIT2)); //Espera liberaci�.
P9OUT&=~BIT7; //apaga led
return;
}
void testFuncIcn(uint8_t (*func)(uint8_t)){
uint8_t foo=0, i;
for(i=8;i>0;i--){
foo=(foo<<1)|1;
check(func(foo)!=(foo>>1));
delay();
}
for(i=8;i>0;i--){
foo>>=1;
check(func(foo)!=((foo<<1)|1));
delay();
}
return;
}

