LAB 1 + LAB 2 PROGRAMACIÓN EN C, ASSEMBLER MIPS, Y ELO312: LAB. DE EST. DE COMPUTADORES SEPTIEMBRE DE 2012 DISPLAY ALFANUMÉRICO 2X16
L A B 1 + L A B 2
P R O G R A M A C I Ó N E N C , A S S E M B L E R M I P S , Y
E L O 3 1 2 : L A B . D E E S T . D E C O M P U T A D O R E S
S E P T I E M B R E D E 2 0 1 2
DISPLAY ALFANUMÉRICO
2X16
OBJETIVOS
• Experimentar con la conexión de dispositivos
externos al microcontrolador.
• Manejar puertos del microcontrolador en forma
bidireccional.
• Aprender a utilizar un display LCD alfanumérico
inteligente y conocer sus ventajas como
herramienta para depurar programas.
DISPLAY ANDXX1GST/GST-LED
DIAGRAMA DE CONECCIONES
GND1
+5V2
Vo3
RS4
R/W5
E6
DB07
DB18
DB29
DB310
DB411
DB512
DB613
DB714
BL+15
BL-16
LCD
LCD_DISPLAY
10k 1k
+5
+5
+5
RS
EN
DATA[0..7]
10k
10k
10k
10k
10k
10k
10k
10k
RW
DIAGRAMA TEMPORAL DE SEÑALES (1)
DIAGRAMA TEMPORAL DE SEÑALES (2)
DIAGRAMA TEMPORAL DE SEÑALES (3)
DIAGRAMA TEMPORAL DE SEÑALES (3)
CÓDIGO DE CARACTERES
TRABAJO PREVIO
• Completar / Diseñar las siguientes funciones: • void udelay(unsigned int x);
• Retardos vía asm(“nop”) -> 125 [ns] a 8 [MHz].
• void init_display(void);
• 8 bit, corrimientos a la derecha, mostrar cursor pestañeando.
• unsigned char get_pos(void);
• Esta función es similar (idéntica) al diseño de wait_BF();
• char get_data(void);
• wait_BF(); luego setear bits: RS + R/nW
• LCD_READ(value);
• Diseño de un circuito eliminador de rebotes. • Uso del Timer A, alimentado por ACLK (32,768 [KHz])
• Contador de pulsador
EN EL LABORATORIO
• Implementar
• udelay(x);
• Implementar
• int putchar(unsinged int c);
• Incorporar: ´\n´, ´\t´ • Ayuda: ver lcd_scroll_up() para ‘\n’
• Probar usando void new_line()
• Diseñar
• show_time(unsigned char p, unsinged int s)
• Diseñar
• unsigned char wait_BF(void)
• OPCIONAL: (+20pts.) Estimador de frecuencia de pulsador
• Barra horizontal proporcional a la frecuencia del pulsador btn2
• Al presionar pulsador btn1 mostrar hora
TIPS & TRICKS (1)
• Para eliminar rebotes de largo X [ms] solo basta con
– encuestar – el pin (pulsador/interruptor) cada Y
[ms] con Y > X.
• Configure el timer para interrumpir cada Y [ms].
• En la rutina de servicio de interrupción (RSI) del
timer encuestar pin (pulsador/interruptor) y
eventualmente subir flag F.
• En programa main verificar si flag F está en alto,
actuar y resetear flag F.
TIPS & TRICKS (2)
// invocada en RSI timer
void scanPS()
{
static int ps = 0;
int cps = P?IN & BIT?;
if (cps && ps == 0)
flag = 1;
ps = cps;
}
// invocada en main
// retorna > 0 ssi
// se presiono un boton
int checkPS()
{
int cFlag = flag;
flag = 0;
return cFlag;
}
NOTA: - hay que definir – flag – global - definir P?DIR bit ? como entrada
TIPS & TRICKS (3)
• Display shift
• send_cmd(0x18) 1 posición hacia la derecha (.. o izquierda?)
• send_cmd(0x02); volver a la posición 0 (origen)
• Los comandos no alteran el contenido de la memoria del display
• use get_pos(); para – actualizar – la imagen
TIPS & TRICKS (4): USE AUTO-INDENT
void tic (void)
{
if (++TIC_CLK == TIC_1SEG)
{
TIC_CLK = 0;
SWclk();
}
if (P5IN & BIT7)
scs_setup();
else
scs_reset();
if (++BUT_CLK == TIC_1SEG / 100)
{
BUT_CLK = 0;
Tec_Matrix();
}
}
void tic (void)
{
if (++TIC_CLK == TIC_1SEG)
{
TIC_CLK = 0;
SWclk();
}
if (P5IN & BIT7)
scs_setup();
else
scs_reset();
if (++BUT_CLK == TIC_1SEG / 100)
{
BUT_CLK = 0;
Tec_Matrix();
}
}