-- Título: GLCD_figuras -- Autor: Stef Mientki, Serkan Ayyýldýz Copyright (c) 2006..2009, all rights reserved. -- Adapted-by: Joep Suijs, Matthew Schinkel, Rob Hamerling -- Librería original: glcd_common -- Adaptación a la librería glcd_ks0108_opt: David Persi Copyright (c) 2012..2012, Todos los derecho reservados. -- WEB: www.meteorologiafacil.com.ar -- -- Versión: 1.1 -- -- Descripción: Librería para trabajar con la librería glcd_ks0108_opt -- que a su vez trabaja con el GLCD KS0108 128x64 -- Se dispone de 5 procedimientos para dibujar: -- 1) Un elipse. -- 2) Un círculo. -- 3) Una línea. -- 4) Una caja vacía. -- 5) Una caja llena. -- Se decidió así, para ahorrar memoria en el PIC. -- -- INSTRUCCIONES DE USO: -- --------------------- -- 1. Incluir primero, la librería glcd_ks0108_opt.jal y realizar una correcta instalación -- de la misma. -- 2. Incluir la presente librería. -- 3. Realizar los pasos necesarios requeridos en glcd_ks0108_opr.jal (Abra y lea las instrucciones). -- 4. Trabajar a gusto. -- -- INTRUCCIONES PARA EL USO DE PROCEDIMIENTOS: -- ------------------------------------------- -- glcd_elipse(cx,cy,xradio,yradio,enc_apa) Dibuja una elipse con centro en cx y cy. -- glcd_circulo(cx,cy,radio,enc_apa) Dibuja un círculo con centro en cx y cy. -- glcd_linea(x0,y0,x1,y1,enc_apa) Dibuja una línea. -- glcd_caja(x0,y0,x1,y1,enc_apa) Dibuja una caja vacía. -- glcd_caja_llena(x0,y0,x1,y1_enc_apa) Dibuja una caja llena. -- -- CÓMUN DE TODOS LOS PROCEDIMIENTOS: -- ---------------------------------- -- cx Especifica el centro de un círculo o elipse en el eje x (byte). -- cy Especifica el centro de un círculo o elipse en el eje y (byte). -- x0 Inicio del primer punto en el eje x (byte). -- y0 Inicio del primer punto en el eje y (byte). -- x1 Fin del último punto en el eje x (byte). -- y1 Fin del último punto en el eje y (byte). -- enc_apa Enciende (1) o apaga (0) el pixel (bit). -- **************************************************************************** const GLCD_XY_TAMAQO = 1 procedure _glcd_escribir_4_pixeles_elipse(byte*GLCD_XY_TAMAQO in cx, sbyte*(GLCD_XY_TAMAQO+1) in dx, byte*GLCD_XY_TAMAQO in cy, sbyte*(GLCD_XY_TAMAQO+1) in dy, bit in enc_apa) is var sbyte*(GLCD_XY_TAMAQO+1) cx14 = cx + dx, cx23 = cx - dx var sbyte*(GLCD_XY_TAMAQO+1) cy12 = cy + dy, cy34 = cy - dy escribir_pixel(byte*GLCD_XY_TAMAQO(cx14), byte*GLCD_XY_TAMAQO(cy12), enc_apa) escribir_pixel(byte*GLCD_XY_TAMAQO(cx14), byte*GLCD_XY_TAMAQO(cy34), enc_apa) escribir_pixel(byte*GLCD_XY_TAMAQO(cx23), byte*GLCD_XY_TAMAQO(cy12), enc_apa) escribir_pixel(byte*GLCD_XY_TAMAQO(cx23), byte*GLCD_XY_TAMAQO(cy34), enc_apa) end procedure -- **************************************************************************** procedure glcd_elipse(byte*GLCD_XY_TAMAQO in cx, byte*GLCD_XY_TAMAQO in cy, byte*GLCD_XY_TAMAQO in xradio, byte*GLCD_XY_TAMAQO in yradio, bit in enc_apa) is var sbyte*3 xr = sbyte*3(xradio) var sbyte*3 yr = sbyte*3(yradio) var sbyte*3 x = xr var sbyte*3 y = 0 var sbyte*3 dos_cuadrado_a = 2 * xr * xr var sbyte*3 dos_cuadrado_b = 2 * yr * yr var sbyte*3 x_cambio = yr * yr * (1 - 2 * xr) var sbyte*3 y_cambio = xr * xr var sbyte*3 error_elipse = 0 var sbyte*3 x_parada = dos_cuadrado_b * xr var sbyte*3 y_parada = 0 while x_parada >= y_parada loop _glcd_escribir_4_pixeles_elipse(cx,sbyte*(GLCD_XY_TAMAQO+1)(x),cy,sbyte*(GLCD_XY_TAMAQO+1)(y),enc_apa) y = y + 1 y_parada = y_parada + dos_cuadrado_a error_elipse = error_elipse + y_cambio y_cambio = y_cambio + dos_cuadrado_a if (error_elipse + error_elipse + x_cambio) > 0 then x = x - 1 x_parada = x_parada - dos_cuadrado_b error_elipse = error_elipse + x_cambio x_cambio = x_cambio + dos_cuadrado_b end if end loop x = 0 y = yr x_cambio = yr * yr y_cambio = xr * xr *(1 - 2 * yr) error_elipse = 0 x_parada = 0 y_parada = dos_cuadrado_a * yr while x_parada <= y_parada loop _glcd_escribir_4_pixeles_elipse(cx,sbyte*(GLCD_XY_TAMAQO+1)(x),cy,sbyte*(GLCD_XY_TAMAQO+1)(y),enc_apa) x = x + 1 x_parada = x_parada + dos_cuadrado_b error_elipse = error_elipse + x_cambio x_cambio = x_cambio + dos_cuadrado_b if (error_elipse + error_elipse + y_cambio) > 0 then y = y - 1 y_parada = y_parada - dos_cuadrado_b error_elipse = error_elipse + y_cambio y_cambio = y_cambio + dos_cuadrado_a end if end loop end procedure -- **************************************************************************** -- DIBUJA UN CÍRCULO. -- ------------------ procedure glcd_circulo(byte*GLCD_XY_TAMAQO in cx, byte*GLCD_XY_TAMAQO in cy, byte in radio, bit in enc_apa) is glcd_elipse(cx,cy,radio,radio,enc_apa) end procedure -- **************************************************************************** -- DIBUJA UNA LÍNEA. -- ----------------- procedure glcd_linea(byte*GLCD_XY_TAMAQO in x0, byte*GLCD_XY_TAMAQO in y0, byte*GLCD_XY_TAMAQO in x1, byte*GLCD_XY_TAMAQO in y1, bit in enc_apa) is var sword dx = sword(x1) - sword(x0) var sword dy = sword(y1) - sword(y0) var sword dos_ds = dx + dx var sword dos_dy = dy + dy var sword x_actual = sword(x0), y_actual = sword(y0) var sword xinc = 1, yinc = 1 var sword error_acumulado_dos_ds, error_acumulado_dos_dy if dx < 0 then xinc = -1 dx = -dx dos_ds = -dos_ds end if if dy < 0 then yinc = -1 dy = -dy dos_dy = -dos_dy end if escribir_pixel(x0,y0,enc_apa) -- Primer punto es caso especial. if (dx != 0) | (dy != 0) then if dy <= dx then error_acumulado_dos_ds = 0 while x_actual != x1 loop x_actual = x_actual + xinc error_acumulado_dos_ds = error_acumulado_dos_ds + dos_dy if error_acumulado_dos_ds > dx then y_actual = y_actual + yinc error_acumulado_dos_ds = error_acumulado_dos_ds - dos_ds end if escribir_pixel(byte(x_actual), byte(y_actual), enc_apa) end loop else error_acumulado_dos_dy = 0 while y_actual != y1 loop y_actual = y_actual + yinc error_acumulado_dos_dy = error_acumulado_dos_dy + dos_ds if error_acumulado_dos_dy > dy then x_actual = x_actual + xinc error_acumulado_dos_dy = error_acumulado_dos_dy - dos_dy end if escribir_pixel(byte(x_actual), byte(y_actual), enc_apa) end loop end if end if end procedure -- **************************************************************************** -- DIBUJA UNA CAJA VACÍA. -- ---------------------- procedure glcd_caja(byte*GLCD_XY_TAMAQO in x0, byte*GLCD_XY_TAMAQO in y0, byte*GLCD_XY_TAMAQO in x1, byte*GLCD_XY_TAMAQO in y1, bit in enc_apa) is glcd_linea(x0,y0,x1,y0,enc_apa) glcd_linea(x1,y0,x1,y1,enc_apa) glcd_linea(x1,y1,x0,y1,enc_apa) glcd_linea(x0,y1,x0,y0,enc_apa) end procedure -- **************************************************************************** -- DIBUJA UNA CAJA LLENA. -- ---------------------- procedure glcd_caja_llena(byte*GLCD_XY_TAMAQO in x0, byte*GLCD_XY_TAMAQO in y0, byte*GLCD_XY_TAMAQO in x1, byte*GLCD_XY_TAMAQO in y1, bit in enc_apa) is if (y1 < y0) then var byte*GLCD_XY_TAMAQO t = y1 y1 = y0 y0 = t end if while (y0 <= y1) loop glcd_linea(x0,y0,x1,y0,enc_apa) y0 = y0 + 1 end loop end procedure -- ****************************************************************************