unit N3510i_LCD;

implementation

Uses BMPs,ASCIIset;
Var text : array[1..16] of char;
    data:byte;

Procedure SendData(dta:byte);
 Begin
 data:=dta;
 Asm
  BCF PortC,5
  BCF PortD,6
  BSF PortD,7
  BSF PortD,6

  BCF PortD,6
  BCF PortD,7
  BTFSC data,7
  BSF PortD,7
  BSF PortD,6

  BCF PortD,6
  BCF PortD,7
  BTFSC data,6
  BSF PortD,7
  BSF PortD,6

  BCF PortD,6
  BCF PortD,7
  BTFSC data,5
  BSF PortD,7
  BSF PortD,6

  BCF PortD,6
  BCF PortD,7
  BTFSC data,4
  BSF PortD,7
  BSF PortD,6

  BCF PortD,6
  BCF PortD,7
  BTFSC data,3
  BSF PortD,7
  BSF PortD,6

  BCF PortD,6
  BCF PortD,7
  BTFSC data,2
  BSF PortD,7
  BSF PortD,6

  BCF PortD,6
  BCF PortD,7
  BTFSC data,1
  BSF PortD,7
  BSF PortD,6

  BCF PortD,6
  BCF PortD,7
  BTFSC data,0
  BSF PortD,7
  BSF PortD,6
  BSF PortC,5
 end;
 end;
Procedure SendCMD(CMD:byte);
 Begin
 data:=cmd;
 Asm
  BCF PortC,5
  BCF PortD,6
  BCF PortD,7
  BSF PortD,6

  BCF PortD,6
  BCF PortD,7
  BTFSC data,7
  BSF PortD,7
  BSF PortD,6

  BCF PortD,6
  BCF PortD,7
  BTFSC data,6
  BSF PortD,7
  BSF PortD,6

  BCF PortD,6
  BCF PortD,7
  BTFSC data,5
  BSF PortD,7
  BSF PortD,6

  BCF PortD,6
  BCF PortD,7
  BTFSC data,4
  BSF PortD,7
  BSF PortD,6

  BCF PortD,6
  BCF PortD,7
  BTFSC data,3
  BSF PortD,7
  BSF PortD,6

  BCF PortD,6
  BCF PortD,7
  BTFSC data,2
  BSF PortD,7
  BSF PortD,6

  BCF PortD,6
  BCF PortD,7
  BTFSC data,1
  BSF PortD,7
  BSF PortD,6

  BCF PortD,6
  BCF PortD,7
  BTFSC data,0
  BSF PortD,7
  BSF PortD,6
  BSF PortC,5
 end;
 end;

Procedure UpDateMemo(color:byte);
Var jj : integer;
 Begin
	sendcmd($2C);		    
	for jj:=0 to 6595 do
   senddata(color);		       
 end;

Procedure GammaSet(gamma:byte);
 Begin
  SendCMD($B5);
  SendData(gamma);
 end;
Procedure ContrastSet(Contrast:byte);
 Begin
  SendCMD($25);
  SendData(Contrast);
 end;

Procedure N3510i_LCD_Init;
Var jj : byte;
 Begin
  ASM
   BCF PortB,4
  end;
	delay_ms(3);
  ASM
   BSF PortB,4
 	 BSF PortC,5
	 BCF PortD,6
	 BCF PortD,7
  end;
	sendcmd($01);		
	delay_ms(1);

	sendcmd($C6);		

	sendcmd($B9);		
	senddata($00);

	sendcmd($B6);		
	senddata(128);
	sendDATA(128);
	sendDATA(129);
	sendDATA(84);
	sendDATA(69);
	sendDATA(82);
	sendDATA(67);

	sendCMD($B3);		
	sendDATA(1);
	sendDATA(2);
	sendDATA(4);
	sendDATA(8);
	sendDATA(16);
	sendDATA(30);
	sendDATA(40);
	sendDATA(50);
	sendDATA(60);
	sendDATA(70);
	sendDATA(80);
	sendDATA(90);
	sendDATA(100);
	sendDATA(110);
	sendDATA(127);


	sendCMD($2D);		

	sendDATA(0);
	sendDATA(3);
	sendDATA(5);
	sendDATA(7);
	sendDATA(9);
	sendDATA(11);
	sendDATA(13);
	sendDATA(15);

	sendDATA(0);
	sendDATA(3);
	sendDATA(5);
	sendDATA(7);
	sendDATA(9);
	sendDATA(11);
	sendDATA(13);
	sendDATA(15);

	sendDATA(0);
	sendDATA(3);          //3
	sendDATA(9);         //9
	sendDATA(15);

	sendCMD($B5);		    
	sendDATA(1);

	sendCMD($BE);		     
	sendDATA(4);

	sendCMD($11);		    

	sendCMD($B7);		     
	for jj:=0 to 13 do	sendDATA(0);

	sendCMD($03);		     
	delay_ms(10);


	sendCMD($20);		// vagy 21 (szín invertálás)   

	sendCMD($25);		     
	sendDATA(63);           

	sendCMD($36);		    
	sendDATA(%00100000);  

	sendCMD($3A);		
	sendDATA(%00000010); 

	sendCMD($2A);		    
	sendDATA(0);
	sendDATA(97);			 

	sendCMD($2B);		    
	sendDATA(0);
	sendDATA(66);           

  UpDateMemo(0);

	sendCMD($29);		    

 end;


Procedure WriteLn(Xpos, Ypos, color,backcolor:byte);
Var j1,j2,j3, XP, lgt, YP:byte;
    ASCIIval,ss : integer;
    ekezet : boolean;
Label stop;
 Begin
   XP:=Xpos; YP:=Ypos;
     lgt:=length(text);
	   For j1:=1 to lgt do
      Begin
       If text[j1]<164 then
        Begin
         ekezet:=0;
         ASCIIval:=(text[j1]-32)*5;
        end else
         Begin
          ekezet:=1;
          Case text[j1] of
           193 : ASCIIval:=0;
           201 : ASCIIval:=5;
           205 : ASCIIval:=10;
           211 : ASCIIval:=15;
           213 : ASCIIval:=20;
           214 : ASCIIval:=25;
           218 : ASCIIval:=30;
           225 : ASCIIval:=35;
           233 : ASCIIval:=65;
           237 : ASCIIval:=40;
           243 : ASCIIval:=45;
           245 : ASCIIval:=50;
           246 : ASCIIval:=55;
           251 : ASCIIval:=60;
          end;
         end;
       For j2:=0 to 4 do
        Begin
         If ekezet=0 then
          ss:=ASCII_TABLE[ASCIIval+j2] else
          ss:=ASCII_TABLE_ekezet[ASCIIval+j2];
         sendcmd($2A);		// column address set
	       senddata(XP);
	       senddata(XP+96);
         If XP=96 then goto stop else inc(XP);
         For j3:=0 to 7 do
          Begin
           If ss.j3=1 then
            Begin
             sendcmd($2B);		
             YP:=YPos+j3;
             senddata(YP);
	           senddata(YP+7);
             SendCMD($2C);
             SendData(color);
            end else
            Begin
             sendcmd($2B);		
             YP:=YPos+j3;
             senddata(YP);
	           senddata(YP+7);
             SendCMD($2C);
             SendData(backcolor);
            end;
          end;

        end;
   	   sendcmd($2A);		
       senddata(XP);
       senddata(XP+96);
       If XP=96 then goto stop else inc(XP);

       For j3:=0 to 7 do
            Begin
             sendcmd($2B);		
             YP:=YPos+j3;
             senddata(YP);
	           senddata(YP+7);
             SendCMD($2C);
             SendData(backcolor);
            end;

      end;
      stop:
 end;
end.
