
#include "stdio.h"

#define sclk PIN_B3 
#define sdin PIN_B2
#define sce PIN_B0 //~
#define dc PIN_B4 //-/~
#define res PIN_B1 //~
#define vdd PIN_B6 

#define LcdRealX   101                 // Speicheraufloesung x-Achse 102 Pixel
#define LcdRealY   64                  // Speicheraufloesung y-Achse 72 Pixel
#define LcdSichtX  96                  // Aufloesung sichtbarer Bereich X-Achse 96 Pixel
#define LcdSichtY  65                  // dto. Y-Achse 65 Pixel


void wr(CHAR command, int cd);              // sende ein Kommando

void init_n3410();                     // initialisiere das Display
void clscr();                          // loesche das Display
void gotoxy(CHAR x,char y);            // positioniere Ausgabeposition
char wherex= 0;
char wherey= 0;

const UNSIGNED char fnttab [][5] =
{
   { 0x00, 0x00, 0x00, 0x00, 0x00 }, // space
   { 0x00, 0x00, 0x2f, 0x00, 0x00 }, // !
   { 0x00, 0x07, 0x00, 0x07, 0x00 }, // "
   { 0x14, 0x7f, 0x14, 0x7f, 0x14 }, // #
   { 0x24, 0x2a, 0x7f, 0x2a, 0x12 }, // $
   { 0xc4, 0xc8, 0x10, 0x26, 0x46 }, // %
   { 0x36, 0x49, 0x55, 0x22, 0x50 }, //&
   { 0x00, 0x05, 0x03, 0x00, 0x00 }, // '
   { 0x00, 0x1c, 0x22, 0x41, 0x00 }, // (
   { 0x00, 0x41, 0x22, 0x1c, 0x00 }, //)
   { 0x14, 0x08, 0x3E, 0x08, 0x14 }, // *
   { 0x08, 0x08, 0x3E, 0x08, 0x08 }, // +
   { 0x00, 0x00, 0x50, 0x30, 0x00 }, //,
   { 0x10, 0x10, 0x10, 0x10, 0x10 }, // -
   { 0x00, 0x60, 0x60, 0x00, 0x00 }, // .
   { 0x20, 0x10, 0x08, 0x04, 0x02 }, // /
   { 0x3E, 0x51, 0x49, 0x45, 0x3E }, // 0
   { 0x00, 0x42, 0x7F, 0x40, 0x00 }, // 1
   { 0x42, 0x61, 0x51, 0x49, 0x46 }, // 2
   { 0x21, 0x41, 0x45, 0x4B, 0x31 }, // 3
   { 0x18, 0x14, 0x12, 0x7F, 0x10 }, // 4
   { 0x27, 0x45, 0x45, 0x45, 0x39 }, // 5
   { 0x3C, 0x4A, 0x49, 0x49, 0x30 }, // 6
   { 0x01, 0x71, 0x09, 0x05, 0x03 }, // 7
   { 0x36, 0x49, 0x49, 0x49, 0x36 }, // 8
   { 0x06, 0x49, 0x49, 0x29, 0x1E }, // 9
   { 0x00, 0x36, 0x36, 0x00, 0x00 }, // :
   { 0x00, 0x56, 0x36, 0x00, 0x00 }, //;
   { 0x08, 0x14, 0x22, 0x41, 0x00 }, // <
   { 0x14, 0x14, 0x14, 0x14, 0x14 }, // =
   { 0x00, 0x41, 0x22, 0x14, 0x08 }, // >
   { 0x02, 0x01, 0x51, 0x09, 0x06 }, // ?
   { 0x32, 0x49, 0x59, 0x51, 0x3E }, // @
   { 0x7E, 0x11, 0x11, 0x11, 0x7E }, // A
   { 0x7F, 0x49, 0x49, 0x49, 0x36 }, // B
   { 0x3E, 0x41, 0x41, 0x41, 0x22 }, // C
   { 0x7F, 0x41, 0x41, 0x22, 0x1C }, // D
   { 0x7F, 0x49, 0x49, 0x49, 0x41 }, // E
   { 0x7F, 0x09, 0x09, 0x09, 0x01 }, // F
   { 0x3E, 0x41, 0x49, 0x49, 0x7A }, // G
   { 0x7F, 0x08, 0x08, 0x08, 0x7F }, // H
   { 0x00, 0x41, 0x7F, 0x41, 0x00 }, // I
   { 0x20, 0x40, 0x41, 0x3F, 0x01 }, // J
   { 0x7F, 0x08, 0x14, 0x22, 0x41 }, // K
   { 0x7F, 0x40, 0x40, 0x40, 0x40 }, // L
   { 0x7F, 0x02, 0x0C, 0x02, 0x7F }, // M
   { 0x7F, 0x04, 0x08, 0x10, 0x7F }, // N
   { 0x3E, 0x41, 0x41, 0x41, 0x3E }, // O
   { 0x7F, 0x09, 0x09, 0x09, 0x06 }, // P
   { 0x3E, 0x41, 0x51, 0x21, 0x5E }, // Q
   { 0x7F, 0x09, 0x19, 0x29, 0x46 }, // R
   { 0x46, 0x49, 0x49, 0x49, 0x31 }, // S
   { 0x01, 0x01, 0x7F, 0x01, 0x01 }, // T
   { 0x3F, 0x40, 0x40, 0x40, 0x3F }, // U
   { 0x1F, 0x20, 0x40, 0x20, 0x1F }, // V
   { 0x3F, 0x40, 0x38, 0x40, 0x3F }, // W
   { 0x63, 0x14, 0x08, 0x14, 0x63 }, // X
   { 0x07, 0x08, 0x70, 0x08, 0x07 }, // Y
   { 0x61, 0x51, 0x49, 0x45, 0x43 }, // Z
   { 0x00, 0x7F, 0x41, 0x41, 0x00 }, // [
   { 0x55, 0x2A, 0x55, 0x2A, 0x55 }, // "Yen"
   { 0x00, 0x41, 0x41, 0x7F, 0x00 }, // ]
   { 0x04, 0x02, 0x01, 0x02, 0x04 }, // ^
   { 0x40, 0x40, 0x40, 0x40, 0x40 }, // _
   { 0x00, 0x01, 0x02, 0x04, 0x00 }, // '
   { 0x20, 0x54, 0x54, 0x54, 0x78 }, // a
   { 0x7F, 0x48, 0x44, 0x44, 0x38 }, // b
   { 0x38, 0x44, 0x44, 0x44, 0x20 }, // c
   { 0x38, 0x44, 0x44, 0x48, 0x7F }, // d
   { 0x38, 0x54, 0x54, 0x54, 0x18 }, // e
   { 0x08, 0x7E, 0x09, 0x01, 0x02 }, // f
   { 0x0C, 0x52, 0x52, 0x52, 0x3E }, // g
   { 0x7F, 0x08, 0x04, 0x04, 0x78 }, // h
   { 0x00, 0x44, 0x7D, 0x40, 0x00 }, // i
   { 0x20, 0x40, 0x44, 0x3D, 0x00 }, // j
   { 0x7F, 0x10, 0x28, 0x44, 0x00 }, // k
   { 0x00, 0x41, 0x7F, 0x40, 0x00 }, // l
   { 0x7C, 0x04, 0x18, 0x04, 0x78 }, // m
   { 0x7C, 0x08, 0x04, 0x04, 0x78 }, // n
   { 0x38, 0x44, 0x44, 0x44, 0x38 }, // o
   { 0x7C, 0x14, 0x14, 0x14, 0x08 }, // p
   { 0x08, 0x14, 0x14, 0x18, 0x7C }, // q
   { 0x7C, 0x08, 0x04, 0x04, 0x08 }, // r
   { 0x48, 0x54, 0x54, 0x54, 0x20 }, // s
   { 0x04, 0x3F, 0x44, 0x40, 0x20 }, // t
   { 0x3C, 0x40, 0x40, 0x20, 0x7C }, // u
   { 0x1C, 0x20, 0x40, 0x20, 0x1C }, // v
   { 0x3C, 0x40, 0x30, 0x40, 0x3C }, // w
   { 0x44, 0x28, 0x10, 0x28, 0x44 }, // x
   { 0x0C, 0x50, 0x50, 0x50, 0x3C }, // y
   { 0x44, 0x64, 0x54, 0x4C, 0x44 } // z
};

void wr(char command, byte cd)
{
  char a;
   BYTE s;
  s=0x80;
  
  low(sdin);
  low(sclk);
  low(sce);
  delay_us(1);
  if (cd==1) hi(dc); else low(dc);
  for (a=0;a<8;a++)
  {
    if (command & s) 
      {
         hi(sdin);   
      } else { 
         low(sdin);
      }
       s = s>>1;
       delay_us(1);
    hi(sclk);       
    delay_us(1);
    low(sclk);   
    delay_us(1);
  }
  hi(sce); 
}


VOID clrscr()
{
   INT i = 0;
   wr (0x80,0); 
   wr (0x40,0);
   FOR (i = 1; i < (LcdRealX * (LcdRealY / 8)); i++){ wr (0x00,1); }
   gotoxy (0, 0) ;
}

void init_n3410()
{

  low(sdin);
  low(sclk);
  hi(dc);
  low(sdin);
  hi(res);
  hi(sce);
  
  low(res);
  delay_ms (1);
  hi(res);
  delay_ms (1);

   wr (0x21,0);
   wr (0xc8,0);
   wr (0x06,0);
   wr (0x15,0);
   wr (0x20,0); 
   wr (0x0c,0);
   
   delay_ms (500);

   clrscr ();
}

void gotoxy(CHAR x,char y)
{
   wr(0x80 + (x * 6),0);
   wr(0x40 + y,0);
   wherex = x; wherey = y;
}


void put_CHAR(char ch)
{
   INT b, rb;

   IF (ch == 13)
   {
      gotoxy (0, wherey) ;
      RETURN;
   }

   IF (ch == 10)
   {
      wherey++;
      gotoxy (wherex, wherey) ;
      RETURN;
   }
   FOR (b = 0; b < 5; b++)
   {
      rb = fnttab[ch - 32][b];
      wr (rb,1);
   }

}

