Помогите пожалуйста разобраться с работой встроенного в ЖКИ контроллера
ST7920, попыталась написать программу в паскале, моя задача зажечь хотя бы пиксель на дисплее, но в моей программе есть где-то ошибка, и я не могу разобраться где.
type
GDRAM=record
refrescar:boolean;
Dotsdots : array[0..31,0..11] of word;
var
Dots:array[1..2] of byte;
DotsI[@Dots]:word;
DisplayPort[@PortF]:byte;
DB7[@DisplayPort, 3] : bit;
DB4[@DisplayPort, 0] : bit;
DB6[@DisplayPort, 2] : bit;
DB5[@DisplayPort, 1] : bit;
RS [@DisplayPort, 5] : bit; //Display Data / Control Data
RW [@DisplayPort, 6] : bit; //Read / Write
E [@DisplayPort, 4] : bit; //Enable Signal
gdram1:GDRAM;
function ReadData (address: byte):byte;
var
data: byte;
begin
DB4:=1;
DB5:=1;
DB6:=1;
DB7:=1; // Set PORTF to input
RS := address;
mdelay(1);
RW := 1;
mdelay(1);
E := 1;
mdelay(1);
DDRF:= data;
DB4:= data;
DB5:= data;
DB6:= data;
DB7:= data;
E := 0;
return(data);
end;
procedure WriteData(address: byte; data: byte);
begin
RS := 0;
while (DisplayPort and $10) › 0 do endwhile;
DB4:=0;
DB5:=0;
DB6:=0;
DB7:=0; // Set PORTF to output
RS := address;
mdelay(1);
RW := 0;
mdelay(1);
E := 0;
// DDRF:= data;
DB4:= data;
DB5:= data;
DB6:= data;
DB7:= data;
mdelay(1);
E:= 1;
mdelay(5);
E:= 0;
end;
Procedure FillScreen (color: byte);
var
// gdram1:GDRAM;
v,h: int8;
d: integer;
begin
if color=1 then d:= $FFFF; //color ON (ON=1, OFF=0)
else d:=0;
for v:=0 to 31 do
for h:=0 to 11 do
// gdram1.refrescar:=true;
gdram1.Dotsdots[v,h]:= word(d);
endfor;
endfor;
endif;
gdram1.refrescar:=true;
end;
procedure UpdateLCD;
var
v,h: int8;
// RS_DATA: byte;
begin
if gdram1.refrescar then
for v:=0 to 31 do
WriteData(0,$80 or byte(v)); //Set Vertical Address
WriteData (0,$80 or 0); //Set Horizontal Address
for h:=0 to 11 do
WriteData (1, byte(gdram1.Dotsdots[v,h] shr

); //Write High Byte
WriteData (1, byte(gdram1.Dotsdots[v,h])); //Write Low Byte
endfor;
endfor;
gdram1.refrescar:=false;
endif;
end;
procedure InitPorts;
begin
PortF:= %00000000;
DDRF:= %11111111;
end;
procedure InitLCD;
begin
DB4:=0;
DB5:=0;
DB6:=0;
DB7:=0;
RS := 0;
RW := 0;
E := 0;
mdelay(40);
WriteData (0, $20);
udelay(100);
WriteData (0, $20);
NOP;
WriteData (0, $00);
udelay(100);
WriteData (0, $00);
NOP;
WriteData (0, $E0);
udelay(100);
WriteData (0, $00);
NOP;
WriteData (0, $10);
mdelay(10);
WriteData (0, $00);
NOP;
WriteData (0, $60);
udelay(72);
WriteData (0, $24);
udelay(72);
WriteData (0, $26);
FillScreen (0);
UpdateLCD();
end;
procedure LCDpixel (x: int8; y: int8; color: integer);
var v:int8;
h:int8;
b:byte;
begin
v:= y;
h:= x div 16;
b:= 15 - (x mod 16);
if color=1 then gdram1.Dotsdots[v,h]:= gdram1.Dotsdots[v,h] or (1 shl b);
else gdram1.Dotsdots[v,h]:= gdram1.Dotsdots[v,h] and not (1 shl b);
endif;
gdram1.refrescar:=true;
end;
{ Main Program }
{$IDATA}
begin
InitPorts;
EnableInts;
InitLCD;
LCDpixel(64,31,0);
LCDpixel(64,31,0);
// LCDpixel(16,16,1);
UpdateLCD;
end.