DISPLAY ALFANUMÉRICO LAB 1 + LAB 2...

Post on 15-Aug-2019

219 views 0 download

Transcript of DISPLAY ALFANUMÉRICO LAB 1 + LAB 2...

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();

}

}