[an error occurred while processing this directive] [an error occurred while processing this directive]
пример for Delphi
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)
[an error occurred while processing this directive] [an error occurred while processing this directive]

Отправлено AK 22 марта 2002 г. 05:08
В ответ на: Ответ: отправлено ILIA2001 21 марта 2002 г. 20:12


{*******************************************************}
// Access to SED1335
{*******************************************************}
procedure write_cmd(d:byte); // to SED
begin
set_A0; // address for CMD
write_X_byte(d);
end;

{*******************************************************}
procedure write_dat(d:byte); // to SED
begin
clr_A0; // address for dat
write_X_byte(d);
end;

{*******************************************************}
function SED_status:boolean; // from SED
begin
clr_A0; // address for status
if (read_X_byte and $40)=0 then SED_status:=false else SED_status:=true;
end;

{*******************************************************}
function read_dat:byte; // from SED
begin
set_A0; // address for dat
data:=read_X_byte; // to global variable
read_dat:=data;
end;

{*******************************************************}
// SED1335 commands
{*******************************************************}
procedure SED_system_set;
begin
write_cmd($40); // control byte
write_dat($30); // DR=0 normal mode
// T/L=0 LCD mode
// IV=1 no screen top line correction
// =1 as required
// W/S=0 single panel drive
// M2=0 8-pixel char height
// M1=1 64 char CG RAM + CG RAM2
// M0=0 internal CG R0M
write_dat($87); // WF=1 two-frame AC drive
// 000 as required
// FX=0111 char width 8 pixels
write_dat($01); // 0000 as required
// FY=8 as recommended by Ampire
write_dat(39); // 27h=39d, C/R: 40 bytes per line (8*40=320 pixels)
write_dat(43); // TC/R >= C/R+4
write_dat(239); // L/F: 240 lines
write_dat(40); // address pitch AP=39+1
write_dat($00); //
end;

{*******************************************************}
procedure SED_sleep_in;
begin
write_cmd($53); // Sleep In control byte only, no param
end;

{*******************************************************}
procedure SED_sleep_out;
begin
write_cmd($40); // control byte for System Set cancels sleep mode
end;

{*******************************************************}
procedure SED_displ_on;
begin
write_cmd($59); // ON
write_dat(SED_disp_onoff);
end;
{*******************************************************}
procedure SED_displ_off;
begin
write_cmd($58); // OFF
write_dat(SED_disp_onoff);
end;

{*******************************************************}
procedure SED_char_RAM_addr;
begin
write_cmd($5C);
write_dat($0); // lo RAM addr
write_dat($74); // hi RAM addr
end;

{*******************************************************}
procedure SED_scroll;
begin
write_cmd($44);
write_dat(0); // first block start addr 3000h, 9600 bytes
write_dat($30);
write_dat(240); // SL1=240d, ie 240 lines per scrolling screen
write_dat($00); // second block start addr 0000h, 9600 bytes
write_dat($0);
write_dat(240); // SL1=240d, ie 240 lines per scrolling screen
write_dat(0);
write_dat($60);
end;

{*******************************************************}
procedure SED_horiz_scroll;
begin
write_cmd($5A);
write_dat($0); // 0 pixels to scroll
end;

{*******************************************************}
procedure SED_cursor_format;
begin
write_cmd($5D);
write_dat(7); // CRX= 8ixels
write_dat($87); // cursor height 8 lines, block cursor
end;

{*******************************************************}
procedure SED_cursor_dir(c:char);
var uc:char;
begin
uc:=UpCase(c);
case uc of
'R': CursorDirection:=$4C; // right
'L': CursorDirection:=$4D; // left
'U': CursorDirection:=$4E; // up
'D': CursorDirection:=$4F; // down
end;
write_cmd(CursorDirection);
end;

{*******************************************************}
procedure SED_overlay;
begin
write_cmd($5B);
write_dat($04); //
end;

{*******************************************************}
procedure SED_set_cursor_pos(x,y:integer;layer:byte);
var w:word;
begin
// layer 1 : adr $3000+
// layer 2 : adr $0+
w:=(y*40+x);
if layer=1 then w:=w+$3000;
write_cmd($46);
write_dat(lo(w)); // lo addr
write_dat(hi(w)); // hi addr
end;
{*******************************************************}
procedure SED_draw_dot(x,y:integer;layer:byte);
var w:word;
d,xr:byte;
s:string;
begin
w:=(y*40+(x div 8)); s:=intToStr(w);
if layer=1 then w:=w+$3000;
write_cmd($46); // cursor pos
write_dat(lo(w)); // lo addr
write_dat(hi(w)); // hi addr
write_cmd($43); // read RAM
d:=read_dat; // from this addr
write_cmd($46); // cursor pos
write_dat(lo(w)); // lo addr
write_dat(hi(w)); // hi addr

xr:=x mod 8; // reminder
case xr of
0: d:=d or $80;
1: d:=d or $40;
2: d:=d or $20;
3: d:=d or $10;
4: d:=d or $8;
5: d:=d or $4;
6: d:=d or $2;
7: d:=d or $1;
end;
write_cmd($42); // write to RAM
write_dat(d); // one dot
end;
{*******************************************************}
procedure draw_dot_3x3(x,y:integer;layer:byte);
begin
SED_draw_dot(x-1,y-1,layer);
SED_draw_dot(x,y-1,layer);
SED_draw_dot(x+1,y-1,layer);
SED_draw_dot(x-1,y,layer);
SED_draw_dot(x,y,layer);
SED_draw_dot(x+1,y,layer);
SED_draw_dot(x-1,y+1,layer);
SED_draw_dot(x,y+1,layer);
SED_draw_dot(x+1,y+1,layer);
end;


{*******************************************************}
procedure SED_write_adr_ptr;
begin
write_cmd($46);
write_dat(lo(AdrPtr)); // lo addr
write_dat(hi(AdrPtr)); // hi addr
end;

{*******************************************************}
procedure SED_read_adr_ptr;
var b:byte;
begin
write_cmd($47);
b:=read_dat; // lo addr
AdrPtr:=b+$100*read_dat;// hi addr
end;

{*******************************************************}
procedure SED_start_RAM_read;
begin
write_cmd($43);
end;

{*******************************************************}
procedure SED_start_RAM_write;
begin
write_cmd($42);
end;

{*******************************************************}
procedure init_LCM;
begin
SED_system_set;
SED_scroll;
SED_horiz_scroll;
SED_overlay;
SED_cursor_dir('U'); //up
SED_displ_on;
SED_char_RAM_addr;
end;

{*******************************************************}
procedure load_buf_to_RAM;
// var w:word;
// b:byte;
begin
AdrPtr:=0;
SED_write_adr_ptr;
SED_start_RAM_write;
while AdrPtr<$2580 do begin
write_dat(buf[AdrPtr]);
inc(AdrPtr);
end;
AdrPtr:=0;
end;
{*******************************************************}
procedure load_buf_to_layer1;
// var w:word;
// b:byte;
begin
AdrPtr:=$3000;
SED_write_adr_ptr;
SED_start_RAM_write;
while AdrPtr<$5580 do begin
write_dat(buf[AdrPtr-$3000]);
inc(AdrPtr);
end;
AdrPtr:=0;
end;

{*******************************************************}
procedure set_layers_logic;
begin
if LayersLogic='OR' then begin
write_cmd($5B); // OVLAY
write_dat($04); //
end;
if LayersLogic='XOR' then begin
write_cmd($5B); // OVLAY
write_dat($05); //
end;
if LayersLogic='AND' then begin
write_cmd($5B); // OVLAY
write_dat($06); //
end;
if LayersLogic='POR' then begin
write_cmd($5B); // OVLAY
write_dat($07); // priority-OR
end;
end;

{*******************************************************}
procedure SED_enable_layer(n:byte);
begin
// FP5-FP4, FP3-FP2, FP1-FP0, FC1-FC0
case n of
0: begin // enable 0, ie disable all
SED_disp_onoff:=SED_disp_onoff and 3;
SED_displ_on;
end;
1: begin // enable layer 1
SED_disp_onoff:=SED_disp_onoff or 4;
SED_displ_on;
end;
2: begin // enable layer 2
SED_disp_onoff:=SED_disp_onoff or $10;
SED_displ_on;
end;
3: begin // enable layer 3
SED_disp_onoff:=SED_disp_onoff or $40;
SED_displ_on;
end;
$FF: begin // enable all
SED_disp_onoff:=SED_disp_onoff or $54;
SED_displ_on;
end;
end;
end;
{*******************************************************}
procedure SED_disable_layer(n:byte);
begin
// FP5-FP4, FP3-FP2, FP1-FP0, FC1-FC0
case n of
0: begin // disable 0, ie enable all
SED_disp_onoff:=SED_disp_onoff or $54;
SED_displ_on;
end;
1: begin // disable layer 1
SED_disp_onoff:=SED_disp_onoff and $F3;
SED_displ_on;
end;
2: begin // disable layer 2
SED_disp_onoff:=SED_disp_onoff and $CF;
SED_displ_on;
end;
3: begin // disable layer 3
SED_disp_onoff:=SED_disp_onoff and $3F;
SED_displ_on;
end;
$FF: begin // disable all
SED_disp_onoff:=SED_disp_onoff and 3;
SED_displ_on;
end;
end;
end;



Составить ответ  |||  Конференция  |||  Архив

Ответы



Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru