Портал для радиолюбителей и разработчиков электроники · с 2003 годаРеклама на сайте
Найти компонент, схему или даташит

Даташиты, справочник отечественных приборов, схемы с разбором и живой форум

Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей...

 
Опции темы

ST7920

Непрочитано 04.03.2010, 15:06  
Elmasha
Прохожий
 
Регистрация: 04.03.2010
Сообщений: 1
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
Elmasha на пути к лучшему
По умолчанию ST7920

Помогите пожалуйста разобраться с работой встроенного в ЖКИ контроллера 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.
Реклама:
Elmasha вне форума  
 
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход


Часовой пояс GMT +4, время: 18:17.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.