#include <avr/io.h>
#include <inttypes.h>
#include <avr/pgmspace.h>
#include <stdlib.h>
#include "makra.h"
#include "delay.c"
#include "sed1330.h"
// ------- Font libray inclusion ----------------
#ifdef SED_FUNCTS_STRINGS
#include "font.h"
#endif
#include "sed1330text-font.h"
// ----------------------------------------------
#define sed_en_pulse() {\
nop; \
sed_set_en(); \
nop; nop; nop; \
nop; nop; nop; \
sed_clr_en(); }
// This define witch mode sed is entered: graphic mode use 8bit char width,
// but text-mode use 6bit char-width and 5bit of right side are not used in this mode.
uint8_t sed_mode=SED_MODE_NONE;
uint8_t sed_disp=SED_DISP1;
// ---- SEL1 = 0 => 8080 interface
void sed_data(uint8_t data) {
while(sed_readBusy()==1){}
DDR(SED_PORT_DATA) = 0xff;
PORT(SED_PORT_DATA) = data;
sed_clr_cs();
sed_clr_A0();
sed_clr_wr();
// writting data to SED1330...
asm("nop");
sed_set_wr();
sed_set_A0();
sed_set_cs();
}
void sed_command(uint8_t cmd) {
DDR(SED_PORT_DATA) = 0xff;
PORT(SED_PORT_DATA) = cmd;
sed_clr_cs();
sed_set_A0();
sed_clr_wr();
// writting command....
sed_set_wr();
sed_set_cs();
}
uint8_t sed_read_memory(void) {
// to wymaga poprawienia - nie poprawiam bo nie używam :)
uint8_t t;
// write command
DDR(SED_PORT_DATA) = 0xff;
PORT(SED_PORT_DATA) = SED_MEM_MREAD;
sed_clr_cs();
sed_set_A0();
sed_set_rd();
sed_clr_wr();
sed_set_wr();
DDR(SED_PORT_DATA) = 0x00;
PORT(SED_PORT_DATA) = 0xff;
sed_clr_rd();
asm("nop");asm("nop");
t = PIN(SED_PORT_DATA);
t = PIN(SED_PORT_DATA);
t = PIN(SED_PORT_DATA);
t = PIN(SED_PORT_DATA);
sed_set_rd();
sed_set_cs();
DDR(SED_PORT_DATA) = 0xff;
PORT(SED_PORT_DATA) = 0xff;
return t;
}
uint8_t sed_readBusy(void) {
uint8_t t;
DDR(SED_PORT_DATA) = 0x00;
PORT(SED_PORT_DATA) = 0xff;
sed_clr_cs();
sed_clr_A0();
sed_clr_rd();
asm("nop");asm("nop");
if(bit_is_clear(PINC,6)){t=0;}else{t=1;}
sed_set_rd();
sed_set_cs();
DDR(SED_PORT_DATA) = 0xff;
PORT(SED_PORT_DATA) = 0xff;
return t;
} // */
void sed_initText(void) {
PORT(SED_PORT_DATA) = 0xff;
DDR(SED_PORT_DATA) = 0xff;
DDR(SED_PORT_CTRL) |= (1<<SED_PIN_RST | 1<<SED_PIN_CS | 1<<SED_PIN_RW | 1<<SED_PIN_EN | 1<<SED_PIN_A0);
PORT(SED_PORT_CTRL) |= (1<<SED_PIN_RST | 1<<SED_PIN_CS | 1<<SED_PIN_RW | 1<<SED_PIN_EN | 1<<SED_PIN_A0);
// Reset :)
delay1ms(20);
//sed_cs_control = SED_CS_CTRL_AUTO;
sed_set_cs();
sed_set_rd();
sed_set_wr();
sed_clr_rst();
delay1ms(5); // min. 200us
sed_set_rst();
delay1ms(15);
// SYSTEM SET
sed_command(0x40); // system set
// P1:
// *[0] M0 (0x01) - 0=Internal CG ROM, 1=External
// *[1] M1 (0x02) - 0=CG RAM1 32char, 1=64char CG RAM + CG RAM2
// *[2] M2 (0x04) - 0=8px char height , 1=16px char height <- External CG ROM
// *[3] W/S (0x08) - 0=Single panel LCD , 1=Dual panel LCD
// *[4] 1 (0x10) - 1= Always 1...
// *[5] IV (0x20) - 0=Screen top-line correction , 1=No correction
// *[6] TL (0x40) - 0=LCD Mode , 1=TV Mode (Only SED1336 ?)
// *[7] DR (0x80) - 0=Normal , 1=Additional Shift clock cycles
sed_data(0x08|0x10|0x20); // M2:M0=000, WS=1, IV=1, TL=0, DR=0
// P2:
// *[2:0] FX (0x00...0x07) - Character field width + 1 (1...8)
// *[7] WF (0x80) - 0=16line AC Drive, 1=Two-frame AC Drive
// CharsPerLine = 42 (6px char width when disp. width 256px)
sed_data(0x80|5); // FX=7 (8px) or FX=5 (6px), WF=0 ::: FX >= DisplayWidth / CharsPerLine
// P3:
// *[3:0] FY (0x00...0x0F) - Height in pixels of character + 1 (1...16)
sed_data(7); // FY=7 (8px)
// P4:
// *[7:0] CR (0x00...0xEF - 0...239) - "Section 3.2.1.12" ::: CR=RND(FX / 8) * CharsPerLine
#define SED_TEXT_CR 42
sed_data(SED_TEXT_CR-1); // CR=32=0x20 for FX=7 ;
// P5:
// *[7:0] TCR (0x00...0xFF - 1...256) - must be: >= CR+4
sed_data(SED_TEXT_CR+4); // P5: TCR=36
// P6:
// *[7:0] LF (0x00...0xFF) - Height in lines of frame, height=LF+1
sed_data(127); // LF=63+1=64
// P7 & P8 - AP - horizontal address range = 256 = 0x0100 => [15:8-7:0] 0x01-0x00
// *[15:0] AP - horiontal address range of the virtual screen (same as CR??)
sed_data(SED_TEXT_CR); // P7 - AP Low
sed_data(0); // P8 - AP High
// Memory map:
// Hint: Display 1 - upper panel; Display 2 - lower panel
// SAD1 :> dispaly 1, Layer 1 ( TEXT )
// SAD3 :> display 2, Layer 1 ( TEXT )
// SAD2 :> display 1, Layer 2 ( Graphic ) ; 64 rows, 256cols = 16384 / 8bits = 2048bytes per panel
// SAD4 :> display 2, Layer 2 ( Graphic )
sed_command(0x44); // Scroll
// P1:P2 = SAD1 L:H
sed_data(SED_SAD1L); // P1
sed_data(SED_SAD1H); // P2
// P3 - SL1 - Screen block start address - numbers of lines per display
sed_data(SED_SL); // P3
// P4:P5 = SAD2 L:H
sed_data(SED_SAD2L); // P4
sed_data(SED_SAD2H); // P5
// P6 - SL2 - same as SL1
sed_data(SED_SL); // P6
// P7:P8 = SAD3 L:H
sed_data(SED_SAD3L); // P7
sed_data(SED_SAD3H); // P8
// P9:P10 = SAD4 L:H
sed_data(SED_SAD4L); // P9
sed_data(SED_SAD4H); // P10
sed_command(0x5D); // CSR FORM
sed_data(5); // CRX <= FX - cursor width (8px - same as char width)
//sed_data(0x87); // CRY = FY-1 - cursor height (8px - same as char height) ; CM=1 - block cursor
sed_data(0x80|7); // CRY = FY-1 - cursor height (8px - same as char height) ; CM=0 - line cursor
sed_command(0x4C); // CSRDIR - Cursor move in right dir.
sed_command(0x5A); // HDOT SCR
sed_data(0x00); // 0=no horizontal scroll of display
sed_command(0x5B); // OVLAY
// MX0,MX1 = [0:1] 0,0=OR (0x01,0x02)
// DM1,DM2 = [2:3] 0,0=Text mode for Layer 1 and 3 (Layer 1 Upper panel, Layer 1 lower panel) (0x04,0x08)
// OV = [4] 0 - Mixed mode (text+graph), two layer (0x10)
sed_data(0x01);
/*
sed_command(0x58); // disp ON/OFF => disable screen
// FC0,1 = [0:1] (0x01,0x02) - cursor flash rate
// FP0,1 = [2:3] (0x04,0x08) - SAD1 ON/OFF + flashing
// FP2,3 = [4:5] (0x10,0x20) - SAD2,4 ON/OFF + flashing
// FP4,5 = [6:7] (0x40,0x80) - SAD3 ON/OFF + flashing
sed_data(0x04|0x10|0x40); // SAD1, SAD2&4, SAD3 = ON
*/
sed_command(0x59); // disp ON/OFF => DISP_ON
// FC0,1 = [0:1] (0x01,0x02) - cursor flash rate
// FP0,1 = [2:3] (0x04,0x08) - SAD1 ON/OFF + flashing
// FP2,3 = [4:5] (0x10,0x20) - SAD2,4 ON/OFF + flashing
// FP4,5 = [6:7] (0x40,0x80) - SAD3 ON/OFF + flashing
sed_data(0x04|0x10|0x40); // SAD1, SAD2&4, SAD3 = ON
// zero memory
sed_command(SED_DRAW_CSRW);
sed_data(0); sed_data(0);
sed_command(SED_MEM_MWRITE);
for (uint16_t t=0;t<0x8000;t++) sed_data(0);
sed_mode = SED_MODE_TEXT;
sed_disp = SED_DISP1;
}
void sed_load_CGRAM(void) {
// **********************************************************************
// **********************************************************************
// **********************************************************************
// load "pl" chars to in video ram after SAD4 (2nd text layer - lower panel)
#define SED_SAG_START ((uint16_t)(0))
#define SED_SAG_START2 ((uint16_t)(0x0400))
// setup CG-RAM...
sed_command(SED_DISPLAY_CGRAM_ADR);
sed_data(SED_SAG_START & 0xff); // SAG Low
sed_data((SED_SAG_START>>8) & 0xff); // SAG high
sed_command(SED_DRAW_CSRW);
sed_data(SED_SAG_START2 & 0xff); // Low address
sed_data((SED_SAG_START2>>8) & 0xff); // high address
sed_command(SED_MEM_MWRITE);
for (uint8_t t=0;t<pl_text_font_SIZE;t++) sed_data(pgm_read_byte(&pl_text_font[t]));
}
void sed_initGraph(void) {
PORT(SED_PORT_DATA) = 0xff;
DDR(SED_PORT_DATA) = 0xff;
DDR(SED_PORT_CTRL) |= (1<<SED_PIN_RST | 1<<SED_PIN_CS | 1<<SED_PIN_RW | 1<<SED_PIN_EN | 1<<SED_PIN_A0);
PORT(SED_PORT_CTRL) |= (1<<SED_PIN_RST | 1<<SED_PIN_CS | 1<<SED_PIN_RW | 1<<SED_PIN_EN | 1<<SED_PIN_A0);
// Reset :)
delay1ms(20);
//sed_cs_control = SED_CS_CTRL_AUTO;
sed_set_cs();
sed_set_rd();
sed_set_wr();
sed_clr_rst();
delay1ms(5); // min. 200us
sed_set_rst();
delay1ms(10);
// SYSTEM SET
sed_command(0x40); // system set
// P1:
// *[0] M0 (0x01) - 0=Internal CG ROM, 1=External
// *[1] M1 (0x02) - 0=CG RAM1 32char, 1=64char CG RAM + CG RAM2
// *[2] M2 (0x04) - 0=8px char height , 1=16px char height <- External CG ROM
// *[3] W/S (0x08) - 0=Single panel LCD , 1=Dual panel LCD
// *[4] 1 (0x10) - 1= Always 1...
// *[5] IV (0x20) - 0=Screen top-line correction , 1=No correction
// *[6] TL (0x40) - 0=LCD Mode , 1=TV Mode (Only SED1336 ?)
// *[7] DR (0x80) - 0=Normal , 1=Additional Shift clock cycles
sed_data(0x08|0x10|0x20); // M2:M0=000, WS=1, IV=1, TL=0, DR=0
// P2:
// *[2:0] FX (0x00...0x07) - Character field width + 1 (1...8)
// *[7] WF (0x80) - 0=16line AC Drive, 1=Two-frame AC Drive
sed_data(7); // FX=7 (8px) or FX=5 (6px), WF=0 ::: FX >= DisplayWidth / CharsPerLine
// P3:
// *[3:0] FY (0x00...0x0F) - Height in pixels of character + 1 (1...16)
sed_data(7); // FY=7 (8px)
// P4:
// *[7:0] CR (0x00...0xEF - 0...239) - "Section 3.2.1.12" ::: CR=RND(FX / 8) * CharsPerLine
sed_data(32); // CR=32=0x20 for FX=7 ;
// P5:
// *[7:0] TCR (0x00...0xFF - 1...256) - must be: >= CR+4
sed_data(38); // P5: TCR=36
// P6:
// *[7:0] LF (0x00...0xFF) - Height in lines of frame, height=LF+1
sed_data(127); // LF=63+1=64
// P7 & P8 - AP - horizontal address range = 256 = 0x0100 => [15:8-7:0] 0x01-0x00
// *[15:0] AP - horiontal address range of the virtual screen (same as CR??)
#define SED_AP_GRAPH (uint16_t)32
#define SED_APL_GRAPH (SED_AP_GRAPH&0xff)
#define SED_APH_GRAPH (SED_AP_GRAPH>>8)
sed_data(SED_APL_GRAPH); // P7 - AP Low
sed_data(SED_APH_GRAPH); // P8 - AP High
// Memory map:
// Hint: Display 1 - upper panel; Display 2 - lower panel
// TEXT: Chars per display: 32*8=256chars (bytes) per display - we have 2 displays...
// GRAPH: ((256*64)/8) = 2048bytes - 0x0800
// SAD1 :> dispaly 1, Layer 1 ( TEXT ) - 8rows, 32char = 256chars per panel
// SAD3 :> display 2, Layer 1 ( TEXT )
// SAD2 :> display 1, Layer 2 ( Graphic ) ; 64 rows, 256cols = 16384 / 8bits = 2048bytes per panel
// SAD4 :> display 2, Layer 2 ( Graphic )
sed_command(0x44); // Scroll
// P1:P2 = SAD1 L:H
sed_data(SED_SAD1L); // P1
sed_data(SED_SAD1H); // P2
// P3 - SL1 - Screen block start address - numbers of lines per display
sed_data(SED_SL); // P3
// P4:P5 = SAD2 L:H
sed_data(SED_SAD2L); // P4
sed_data(SED_SAD2H); // P5
// P6 - SL2 - same as SL1
sed_data(SED_SL); // P6
// P7:P8 = SAD3 L:H
sed_data(SED_SAD3L); // P7
sed_data(SED_SAD3H); // P8
// P9:P10 = SAD4 L:H
sed_data(SED_SAD4L); // P9
sed_data(SED_SAD4H); // P10
sed_command(0x5A); // HDOT SCR
sed_data(0x00); // 0=no horizontal scroll of display
sed_command(0x5B); // OVLAY
// MX0,MX1 = [0:1] 0,0=OR (0x00) [ L1 | L2 | L3 ]
// MX0,MX1 = [0:1] 0,1=EX-OR (0x01) [ (L1 ^ L2) | (L3 ^ L4) ] // L2 and L4 equal?
// MX0,MX1 = [0:1] 1,0=AND (0x02) [ (L1 & L2) | (L3 & L4) ]
// MX0,MX1 = [0:1] 1,1=PriorityOR (0x03) [ L1 > L2(L4??) > L3)
// DM1,DM2 = [2:3] 0,0=Text mode for Layer 1 and 3 (Layer 1 Upper panel, Layer 1 lower panel) (0x00)
// DM1,DM2 = [2:3] 1,1=Graphic mode for Layer 1 and 3 (Layer 1 Upper panel, Layer 1 lower panel) (0x0C)
// OV = [4] 0 - Mixed mode (text+graph), two layer (0x10)
sed_data(0x01);
sed_command(0x58); // disp ON/OFF => disable screen
// "zero" whole memory
sed_command(SED_DRAW_CSRW);
sed_data(0); sed_data(0);
sed_command(SED_MEM_MWRITE);
for (uint16_t t=0;t<0x8000;t++){ sed_data(0x00);}
sed_command(0x5D); // CSR FORM
sed_data(8); // CRX <= FX - cursor width (8px - same as char width)
//sed_data(0x87); // CRY = FY-1 - cursor height (8px - same as char height) ; CM=1 - block cursor
sed_data(0x80|8); // CRY = FY-1 - cursor height (8px - same as char height) ; CM=0 - line cursor
sed_command(0x59); // disp ON/OFF => DISP_ON
// FC0,1 = [0:1] (0x01,0x02) - cursor flash rate
// FP0,1 = [2:3] (0x04,0x08) - SAD1 ON/OFF + flashing
// FP2,3 = [4:5] (0x10,0x20) - SAD2,4 ON/OFF + flashing
// FP4,5 = [6:7] (0x40,0x80) - SAD3 ON/OFF + flashing
sed_data(0x04|0x10|0x40); // SAD1, SAD2&4, SAD3 = ON
sed_command(0x4C); // CSRDIR - Cursor move in right dir.
sed_mode = SED_MODE_GRAPH;
sed_disp = SED_DISP1;
}
void sed_onoff(uint8_t on) {
if (on == 1) {
sed_command(0x59); // disp ON
sed_data(0x04|0x10|0x40); // SAD1, SAD2&4, SAD3 = ON
} else {
sed_command(0x58); // disp OFF
sed_data(0x00); // SAD1, SAD2&4, SAD3 = ON
}
}
void sed_clear(uint8_t sec, uint8_t fill) {
uint16_t t,t2;
if (sec == SED_TEXT1) {
t = SED_SAD1_SIZE;
t2 = SED_SAD1;
} else if (sec == SED_TEXT2) {
t = SED_SAD3_SIZE;
t2 = SED_SAD3;
} else if (sec == SED_GRAPH1) {
t = SED_SAD2_SIZE;
if (sed_disp == SED_DISP2) {
t2 = SED_SAD2_DISP2;
} else if (sed_disp == SED_DISP3) {
t2 = SED_SAD2_DISP3;
} else {
t2 = SED_SAD2_DISP1;
}
} else if (sec == SED_GRAPH2) {
t = SED_SAD4_SIZE;
if (sed_disp == SED_DISP2) {
t2 = SED_SAD4_DISP2;
} else if (sed_disp == SED_DISP3) {
t2 = SED_SAD4_DISP3;
} else {
t2 = SED_SAD4_DISP1;
}
} else {
return;
}
sed_command(SED_DRAW_CSRW);
sed_data(t2 & 0xff); // Low address
sed_data((t2>>8) & 0xff); // high address
sed_command(SED_MEM_MWRITE);
while (t--) {
while(sed_readBusy()==1){}
sed_data(fill);
}
}
void sed_txt_char(char c) {
sed_command(SED_MEM_MWRITE);
sed_data(c);
}
void sed_txt_str(char* str) {
char znak;
sed_command(SED_MEM_MWRITE);
while(0 != (znak = *(str++))){sed_data(znak);}
}
void sed_txt_str_P(prog_char* str) {
char znak;
sed_command(SED_MEM_MWRITE);
while (0 != (znak = pgm_read_byte(str++))){sed_data(znak);}
}
void sed_txt_dec(int val) {
char bufor[7];
sed_txt_str(itoa(val, bufor, 10));
}
void sed_txt_setPos(uint8_t y, uint8_t x) {
// 42 chars per line...
uint16_t t;
t = (y < 8) ? SED_SAD1 : SED_SAD3;
y = (y < 8) ? y : (y-8);
t += x;
if (sed_mode == SED_MODE_TEXT) {
t += y*42;
} else {
t += y*32;
}
sed_command(SED_DRAW_CSRW);
sed_data(t);// Low address
sed_data(t>>8); // high address
}
void sed_txt_hex_byte(uint8_t val) {
if (((val >> 4) & 0x0f) > 0x09) {
sed_txt_char('7'+((val >> 4) & 0x0f));
} else {
sed_txt_char('0'+((val >> 4) & 0x0f));
}
if ((val & 0x0f) > 0x09) {
sed_txt_char('7'+(val & 0x0f));
} else {
sed_txt_char('0'+(val & 0x0f));
}
}
void sed_setDisp(uint8_t dsp) {
uint16_t sad[2];
if (dsp == SED_DISP2) {
sad[0] = SED_SAD2_DISP2;
sad[1] = SED_SAD4_DISP2;
sed_disp = SED_DISP2;
} else if (dsp == SED_DISP3) {
sad[0] = SED_SAD2_DISP3;
sad[1] = SED_SAD4_DISP3;
sed_disp = SED_DISP3;
} else {
sad[0] = SED_SAD2_DISP1;
sad[1] = SED_SAD4_DISP1;
sed_disp = SED_DISP1;
}
// Memory map:
// Hint: Display 1 - upper panel; Display 2 - lower panel
// TEXT: Chars per display: 32*8=256chars (bytes) per display - we have 2 displays...
// GRAPH: ((256*64)/8) = 2048bytes - 0x0800
// SAD1 :> dispaly 1, Layer 1 ( TEXT ) - 8rows, 32char = 256chars per panel
// SAD3 :> display 2, Layer 1 ( TEXT )
// SAD2 :> display 1, Layer 2 ( Graphic ) ; 64 rows, 256cols = 16384 / 8bits = 2048bytes per panel
// SAD4 :> display 2, Layer 2 ( Graphic )
sed_command(0x44); // Scroll
// P1:P2 = SAD1 L:H
sed_data(SED_SAD1L); // P1
sed_data(SED_SAD1H); // P2
// P3 - SL1 - Screen block start address - numbers of lines per display
sed_data(SED_SL); // P3
// P4:P5 = SAD2 L:H
sed_data(sad[0]); // P4
sed_data(sad[0]>>8); // P5
// P6 - SL2 - same as SL1
sed_data(SED_SL); // P6
// P7:P8 = SAD3 L:H
sed_data(SED_SAD3L); // P7
sed_data(SED_SAD3H); // P8
// P9:P10 = SAD4 L:H
sed_data(sad[1]); // P9
sed_data(sad[1]>>8); // P10
}
void sed_cursor(uint16_t addr) {
sed_command(SED_DRAW_CSRW);
sed_data(addr & 0xff); // Low address
sed_data((addr>>8) & 0xff); // high address
sed_data((addr>>8) & 0xff); // high address
}
/* ****************************************************************************************************************** */
/* ****************************************************************************************************************** */
/* ****************************************************************************************************************** */
/* ****************************************************************************************************************** */
/* ****************************************************************************************************************** */
/* ****************************************************************************************************************** */
/* ****************************************************************************************************************** */
/* ****************************************************************************************************************** */
#if SED_GRAPHIC_FUNCTIONS_ENABLED == 1
void sed_init(uint8_t mode) {
if (mode == SED_MODE_TEXT) {
sed_initText();
sed_mode = SED_MODE_TEXT;
} else {
sed_initGraph();
sed_mode = SED_MODE_GRAPH;
}
}
uint16_t GetSAD24(uint8_t y) {
if (y > 63) {
if (sed_disp == SED_DISP2) {
return SED_SAD4_DISP2;
} else if (sed_disp == SED_DISP3) {
return SED_SAD4_DISP3;
} else {
return SED_SAD4_DISP1;
}
} else {
if (sed_disp == SED_DISP2) {
return SED_SAD2_DISP2;
} else if (sed_disp == SED_DISP3) {
return SED_SAD2_DISP3;
} else {
return SED_SAD2_DISP1;
}
}
}
void sed_setPixel(uint16_t x, uint16_t y, uint8_t mode) {
uint16_t t;
uint8_t tmp,xp;
// position :)
t = GetSAD24(y);
if (y > 63) y = y-64;
if (y>127) y=0;
// based on sed-mode calculate pixel position...
if (sed_mode == SED_MODE_TEXT) {
t += (y*42)+(x/6);
xp=x%6;
} else {
t += (y*32)+(x/8);
xp=x%8;
}
sed_command(SED_DRAW_CSRW);
sed_data(t);
sed_data(t>>8);
tmp=sed_read_memory();
if (mode == SED_PX_ON) {
tmp |= 0x80>>xp;
} else if (mode == SED_PX_OFF) {
tmp &= ~(0x80>>xp);
} else if (mode == SED_PX_XOR) {
if (tmp & (0x80>>xp)) {
tmp &= ~(0x80>>xp);
} else {
tmp |= 0x80>>xp;
}
}
sed_command(SED_DRAW_CSRW);
sed_data(t);
sed_data(t>>8);
sed_command(SED_MEM_MWRITE);
sed_data(tmp);
}
#ifdef SED_FUNCT_LINE
void sed_lineH(uint16_t x, uint8_t y, uint16_t w, uint8_t px_mode) {
//if ((x1 >= SED_WIDTH) || (x2 >= SED_WIDTH) || (y1 >= SED_HEIGHT) || (y2 >= SED_HEIGHT) || (x1 > x2) || (y1 > y2)) return;
if (x >= SED_WIDTH) x = SED_WIDTH-1;
if (y >= SED_HEIGHT) y = SED_HEIGHT-1;
w = w+x;
if (w>= SED_WIDTH) w = SED_WIDTH-1;
for (;x<=w;x++) sed_setPixel(x,y,px_mode);
}
void sed_lineV(uint16_t x, uint8_t y, uint8_t h, uint8_t px_mode) {
//if ((x1 >= SED_WIDTH) || (x2 >= SED_WIDTH) || (y1 >= SED_HEIGHT) || (y2 >= SED_HEIGHT) || (x1 > x2) || (y1 > y2)) return;
if (x >= SED_WIDTH) x = SED_WIDTH-1;
if (y >= SED_HEIGHT) y = SED_HEIGHT-1;
h = h+y;
if (h>= SED_HEIGHT) h = SED_HEIGHT-1;
for (;y<=h;y++) sed_setPixel(x,y,px_mode);
}
void sed_line(uint16_t x1, uint8_t y1, uint16_t x2, uint8_t y2, uint8_t px_mode) {
int16_t dx,dy,sx,sy,f;
uint16_t i;
if (x1 > x2) {
XCHG(x1,x2,uint8_t);
XCHG(y1,y2,uint8_t);
}
if (y1 > y2) {
XCHG(x1,x2,uint8_t);
XCHG(y1,y2,uint8_t);
}
if (x1 == x2) {
sed_lineV(x1,y1,(y2-y1),px_mode);
return;
}
if (y1 == y2) {
sed_lineH(x1,x1,(x2-x1),px_mode);
return;
}
dx = x2 - x1;
dy = y2 - y1;
if (dx < 0) {
dx = -dx;
sx = -1;
} else {
sx = 1;
}
if (dy < 0) {
dy = -dy;
sy = -1;
} else {
sy = 1;
}
dx <<= 1; // Shift Dx , Left , 1 '-2
dy <<= 1; // Shift Dy , Left , 1 '-2
sed_setPixel(x1,y1,px_mode); // Call Lcdpixel(x1 , Y1 , Pixelmode)
if (dx > dy) {
i = dx;
i >>= 1;
f = dy-i;
while (x1!=x2) {
if (f >= 0) {
y1 += sy; //Y1 = Y1 + Stepy
f -= dx; //Fraction = Fraction - Dx
}
x1 += sx;
f += dy;
sed_setPixel(x1,y1,px_mode);
}
} else {
i = dy;
i >>= 1;
f = dx-i;
while (y1!=y2) {
if (f >= 0) {
x1 += sx;
f -= dy; //Fraction = Fraction - Dy
}
y1 += sy;
f += dx;
sed_setPixel(x1,y1,px_mode);
}
}
}
#endif
#ifdef SED_FUNCT_RECT
void sed_rect(uint16_t x1, uint8_t y1, uint16_t x2, uint8_t y2, uint8_t px_mode) {
uint16_t w,h;
if (x1 >= SED_WIDTH) x1 = SED_WIDTH-1;
if (y1 >= SED_HEIGHT) y1 = SED_HEIGHT-1;
if (x2 >= SED_WIDTH) x2 = SED_WIDTH-1;
if (y2 >= SED_HEIGHT) y2 = SED_HEIGHT-1;
if (x1 > x2) { w = x1; x1 = x2; x2 = w; }
if (y1 > y2) { h = y1; y1 = y2; y2 = h; }
w = x2-x1;
h = y2-y1;
if (w>= SED_WIDTH) w = SED_WIDTH-1;
if (h>= SED_HEIGHT) h = SED_HEIGHT-1;
sed_lineH(x1,y1,w,px_mode);
sed_lineH(x1,y2,w,px_mode);
sed_lineV(x1,y1+1,h-2,px_mode);
sed_lineV(x2,y1+1,h-2,px_mode);
}
#endif
#ifdef SED_FUNCT_RECT_FILL
void sed_rectFill(uint16_t x1, uint8_t y1, uint16_t x2, uint8_t y2, uint8_t px_mode) {
uint8_t y;
if (x1 >= SED_WIDTH) x1 = SED_WIDTH-1;
if (y1 >= SED_HEIGHT) y1 = SED_HEIGHT-1;
if (x2 >= SED_WIDTH) x2 = SED_WIDTH-1;
if (y2 >= SED_HEIGHT) y2 = SED_HEIGHT-1;
if (x1 > x2) { y = x1; x1 = x2; x2 = y; }
if (y1 > y2) { y = y1; y1 = y2; y2 = y; }
for (;x1<=x2;x1++) {
for (y=y1;y<=y2;y++) {
sed_setPixel(x1,y,px_mode);
}
}
}
#endif
#ifdef SED_FUNCTS_STRINGS
uint8_t sed_char(uint16_t x, uint8_t y, char znak, uint8_t chr_mode) {
if ((znak > (GPH_CHAR_COUNT+GPH_CHAR_START)) || (znak < GPH_CHAR_START)) znak = GPH_CHAR_START;
// calculate char location in array
uint16_t t=(znak-GPH_CHAR_START)*GPH_CHAR_WIDTH;
uint8_t b;
for (uint8_t i=x;i<(GPH_CHAR_WIDTH+x);i++) {
// draw x bytes of char - char byte data orientation vertically
// get column byte of char
//b = pgm_read_byte(&g_font5x8[t++]);
b = pgm_read_byte(&GPH_FONT_NAME[t++]);
// vertical draw byte...
for (uint8_t j=y;j<(y+GPH_CHAR_HEIGHT);j++) {
#if (GPH_FONT_COLUMN_UP_DOWN == 1)
if (b & 0x80) {
#else
if (b & 0x01) {
#endif
if ((chr_mode == SED_TEXT_PIX_ON) || (chr_mode == SED_TEXT_PIX_ON_BG_OFF)) {
sed_setPixel(i,j,SED_PX_ON);
} else if ((chr_mode == SED_TEXT_PIX_OFF) || (chr_mode == SED_TEXT_PIX_OFF_BG_ON)) {
sed_setPixel(i,j,SED_PX_OFF);
} else if (chr_mode == SED_TEXT_PIX_XOR) {
sed_setPixel(i,j,SED_PX_XOR);
}
} else { // draw background (if needed...)??
if (chr_mode == SED_TEXT_PIX_ON_BG_OFF) { // black char on white bg
sed_setPixel(i,j,SED_PX_OFF);
} else if (chr_mode == SED_TEXT_PIX_OFF_BG_ON) { // white char on black bg
sed_setPixel(i,j,SED_PX_ON);
//} else if (chr_mode == TEXT_PIX_XOR) { // xor
// sed_setPixel(i,j,PX_XOR);
}
}
#if (GPH_FONT_COLUMN_UP_DOWN == 1)
b <<= 1;
#else
b >>= 1;
#endif
}
}
return GPH_CHAR_WIDTH;
}
uint8_t sed_str(uint8_t x, uint8_t y, char* str, uint8_t txt_mode) {
while(*str != 0) {
sed_char(x, y, *str++, txt_mode);
x += GPH_CHAR_WIDTH;
}
return x;
}
uint8_t sed_str_P(uint8_t x, uint8_t y, char* str, uint8_t txt_mode) {
char znak;
while (0 != (znak = pgm_read_byte(str++))) {
sed_char(x, y, znak, txt_mode);
x += GPH_CHAR_WIDTH;
}
return x;
}
uint8_t sed_dec(uint8_t x, uint8_t y, int val, uint8_t txt_mode) {
char bufor[5];
return sed_str(x,y,itoa(val, bufor, 10),txt_mode);
}
#endif
#ifdef SED_FUNCT_HEX_BYTE
uint8_t sed_hex_byte(uint8_t x, uint8_t y, uint8_t val, uint8_t txt_mode) {
if (((val >> 4) & 0x0f) > 0x09) {
sed_char(x,y,'7'+((val >> 4) & 0x0f), txt_mode);
} else {
sed_char(x,y,'0'+((val >> 4) & 0x0f), txt_mode);
}
x += GPH_CHAR_WIDTH;
if ((val & 0x0f) > 0x09) {
sed_char(x,y,'7'+(val & 0x0f), txt_mode);
} else {
sed_char(x,y,'0'+(val & 0x0f), txt_mode);
}
return x+=GPH_CHAR_WIDTH;
}
#endif
#ifdef SED_FUNCT_LOAD
void sed_load(prog_uint8_t* pData, uint16_t x, uint8_t y, uint16_t w, uint8_t h, uint8_t px_mode) {
uint16_t b,y2,x2,t=0;
//h--;
w+= x;// = (w-1) + x;
h+= y;// = (h-1) + y;
if ((w > SED_WIDTH) || (h > SED_HEIGHT)) return;
for (y2=y;y2<h;y2++) {
x2=x;
while (x2<w) {
b = pgm_read_byte(pData++);
for (t=0;t<8;t++) {
if (b & 0x80) {
sed_setPixel((x2+t),y2,px_mode);
}
b <<= 1;
}
x2+=8;
}
}
}
#endif
#endif