top of page

Модули обслуживания памяти

AT25

unit at25;
{$O-}
{$xdata}
{$idata}
interface

procedure AtWrite;
procedure ATREAD;
procedure Read640;
procedure Write640;
PROCEDURE READ640P(numr:byte);
PROCEDURE WRITE640P(numw:byte);

//var adrbyte:boolean;     //флаг выставляется, если адрес не будет превышать 255

implementation
uses declare,ports;

PROCEDURE ATWRCOM;forward;
PROCEDURE ATRDB;forward;
PROCEDURE WREN;forward;
PROCEDURE RDSR;forward;

var countbyte:byte;
//================================================
procedure delayat;assembler;
asm
nop
nop
nop
nop
nop
nop
nop
nop
end;
//------------------------------------------------
PROCEDURE ATWREN;ASSEMBLER;
ASM

          //ПОДПРОГРАММА ПЕРЕДАЧИ СИГНАЛА РАЗРЕШЕНИЯ ЗАПИСИ
MOV A,#00000110B    //КОМАНДА РАЗРЕШЕНИЯ ЗАПИСИ
          //ПОДПРОГРАММА ПЕРЕДАЧИ КОМАНДЫ
          //(КОД КОМАНДЫ НАХОДИТСЯ В АККУМУЛЯТОРЕ)
LCALL ATWRCOM
END;
//===============================================
PROCEDURE ATWRCOM;ASSEMBLER;
LABEL ATWREN0;
ASM
          CLR FLASHCLK
          CLR FLASHCS
          lcall delayat
          MOV R2,#8            //НАДО ПЕРЕДАТЬ 8 БИТ
ATWREN0:  RLC A                //ВЫДВИЖЕНИЕ СТАРШЕГО БИТА В БИТ ПЕРЕНОСА
          MOV FLASHOUT,C       //ПЕРЕДАЧА БИТА В ЛИНИЮ
          lcall delayat
          SETB FLASHCLK        //ФИКСАЦИЯ БИТА
          lcall delayat
          CLR FLASHCLK         //ДЛЯ СЛЕДУЮЩЕГО
          lcall delayat
          DJNZ R2,ATWREN0      //ЦИКЛ
END;
//-----------------------------------------------
PROCEDURE ATWRDI;ASSEMBLER;
ASM
          //ПОДПРОГРАММА ПЕРЕДАЧИ СИГНАЛА ЗАПРЕЩЕНИЯ ЗАПИСИ
          MOV A,#00000100B     //КОМАНДА ЗАПРЕЩЕНИЯ ЗАПИСИ
          LCALL ATWRCOM
END;
//-----------------------------------------------
PROCEDURE ATRSR;ASSEMBLER;
ASM
          //ПОДПРОГРАММА ЧТЕНИЯ БАЙТА СТАТУСА
          //ПОСЛЕ ПРИЕМА БАЙТ СТАТУСА НАХОДИТСЯ В АККУМУЛЯТОРЕ
          MOV A,#00000101B     //КОМАНДА ЧТЕНИЯ СТАТУСА
          LCALL ATWRCOM        //ПЕРЕДАЧА КОМАНДЫ
          LCALL ATRDB
END;
//===============================================
PROCEDURE ATRDB;ASSEMBLER;
LABEL ATRSR0;
ASM
          //ПОДПРОГРАММА ЧТЕНИЯ БАЙТА
          MOV R2,#8            //НАДО ПРИНЯТЬ 8 БИТ
ATRSR0:   SETB FLASHCLK        //УСТАНОВКА 1 В ЛИНИИ CLK
          lcall delayat
          MOV C,FLASHIN        //ПРИЕМ БИТА ДАННЫХ
          RLC A                //ВДВИЖЕНИЕ БИТА В МЛАДШИЙ БИТ АККУМУЛЯТОРА
          lcall delayat
          CLR FLASHCLK
          lcall delayat
          DJNZ R2,ATRSR0       //ЦИКЛ
END;
//-----------------------------------------------
          //ПОДПРОГРАММА ПЕРЕДАЧИ АДРЕСА
          //В R3 ДОЛЖЕН СОДЕРЖАТЬСЯ КОД КОМАНДЫ,
          //АДРЕС В R0:R1
PROCEDURE ATWRITA;ASSEMBLER;
LABEL ATWRITA0;
ASM
          MOV A,R3
          LCALL ATWRCOM        //ПЕРЕДАЧА КОМАНДЫ
          mov r2,#8
          //jb adrbyte,ATWRITA0
          MOV R2,#16           //АДРЕС СОСТОИТ ИЗ 16 БИТ
ATWRITA0:
          MOV A,R1             //НАЧАЛО ЦИКЛА ПЕРЕДАЧИ АДРЕСА
          RLC A
          MOV R1,A
          MOV A,R0
          RLC A                //ВЫДВИЖЕНИЕ СТАРШЕГО БИТА АККУМУЛЯТОРА
          MOV R0,A
          MOV FLASHOUT,C
          lcall delayat
          SETB FLASHCLK        //ФИКСАЦИЯ ДАННЫХ НА ЛИНИИ
          lcall delayat
          CLR FLASHCLK
          lcall delayat
          DJNZ R2,ATWRITA0     //ЦИКЛ
END;
//------------------------------------------------
          //ПОДПРОГРАММА ЗАПИСИ БАЙТА.
          //В РЕГИСТРЕ В СОДЕРЖИТСЯ КОД
          //В РЕГИСТРАХ R0:R1 - АДРЕС
PROCEDURE ATWRITE;ASSEMBLER;
LABEL ATWRITE0;
ASM
          LCALL WREN
          MOV R3,#00000010B    //КОД КОМАНДЫ ЗАПИСИ
          LCALL ATWRITA        //ПЕРЕДАЧА АДРЕСА
          MOV A,B
          LCALL ATWRCOM        //ПЕРЕДАЧА БАЙТА
          SETB FLASHCS
ATWRITE0: LCALL RDSR
          JB ACC.0,ATWRITE0
END;
//------------------------------------------------
          //ПОДПРОГРАММА ЧТЕНИЯ БАЙТА.
          //В РЕГИСТРАХ R0:R1 СОДЕРЖИТСЯ АДРЕС
          //СЧИТАННЫЙ БАЙТ РАСПОЛАГАЕТСЯ В АККУМУЛЯТОРЕ
PROCEDURE ATREAD;ASSEMBLER;
ASM
          MOV R3,#00000011B    //КОД КОМАНДЫ ЧТЕНИЯ
          LCALL ATWRITA        //ПЕРЕДАЧА АДРЕСА
          LCALL ATRDB          //ПРИЕМ БАЙТА
          SETB FLASHCS
END;
//------------------------------------------------
PROCEDURE WREN;ASSEMBLER;
ASM
          LCALL ATWREN
          SETB FLASHCS
END;
//------------------------------------------------
PROCEDURE RDSR;ASSEMBLER;
ASM
          LCALL ATRSR
          SETB FLASHCS
END;
//===============================================
PROCEDURE READ640;ASSEMBLER;
label read640_0;
ASM
          MOV R0,ADR640+1
          jnb adrbyte,read640_0
          mov r0,#0
read640_0:
          MOV R1,ADR640
          LCALL ATREAD
          MOV DATA640,A
END;
//===============================================
PROCEDURE WRITE640;ASSEMBLER;
label write640_0;
ASM
          MOV R0,ADR640+1
          jnb adrbyte,write640_0
          mov r0,#0
write640_0:
          MOV R1,ADR640
          MOV B,DATA640
          LCALL ATWRITE;
END;
//================================================
//------------------------------------------------
          //ПОДПРОГРАММА ЗАПИСИ БАЙТА.
          //ЗАПИСЫВАЕМЫЕ БАЙТЫ РАЗМЕЩАЮТСЯ В БУФЕРЕ.
          //В РЕГИСТРАХ R5:R6 - АДРЕС
PROCEDURE ATWRITEP(nw:byte);
begin
WREN;
ar3:=%00000010;              //КОД КОМАНДЫ ЗАПИСИ
ATWRITA;
for countbyte:=0 to nw-1 do
  begin
   ar0:=sn[countbyte];
   acc:=ar0;
   ATWRCOM;
  end;
flashcs:=true;
end;
//------------------------------------------------
          //ПОДПРОГРАММА ЧТЕНИЯ БАЙТА.
          //В РЕГИСТРАХ R5:R6 СОДЕРЖИТСЯ АДРЕС
          //СЧИТАННЫЕ БАЙТЫ РАЗМЕЩАЮТСЯ В БУФЕРЕ
PROCEDURE ATREADP(nr:byte);
begin
ar3:=%00000011;         //КОД КОМАНДЫ ЧТЕНИЯ
ATWRITA;               //ПЕРЕДАЧА АДРЕСА
for countbyte:=0 to nr-1 do
  begin
   atrdb;
   sn[countbyte]:=ar0;
  end;
flashcs:=true;
end;
//================================================
PROCEDURE READ640P(numr:byte);
begin
if adrbyte then
  ar0:=0
   else
    ar0:=hi(adr640);
ar1:=lo(adr640);
ATREADP(numr);
end;
//================================================
PROCEDURE WRITE640P(numw:byte);
begin
if adrbyte then
  ar0:=0
   else
    ar0:=hi(adr640);
ar1:=lo(adr640);
ATWRITEP(numw);
end;
//================================================

end.

AT24

unit at24;
{$O-}
{$xdata}
{$idata}
interface

procedure ReadByteAt24;
procedure WriteByteAt24;
procedure WritePageAt24(numwr:byte);
procedure ReadPageAt24(numrd:byte);

const adrat24=%10100000;

var
      adrpage24:byte;
      adr24:word;
      flagdelay24:boolean;
      //constdelay24:word;      //для LP - 1000
      constdel24h:byte;            //константы задержки для записи в ПЗУ
      constdel24m:byte;            //для 24МГц обычного исполнения 5 мс
      constdel24l:byte;            //соответствует l=100 m=100 h=1
      countbyte:byte;
     
     

implementation

uses declare,i2c;
//===============================================
procedure delay24;
label d24_0,d24_1,d24_2;
begin
asm
          mov r4,constdel24h
d24_2:    mov r2,constdel24m
d24_0:    mov r3,constdel24l
d24_1:    djnz r3,d24_1
          djnz r2,d24_0
          djnz r4,d24_2
end;
end;
//===============================================
//процедура старта записи - передача адреса AT24 и
//адреса ячейки памяти
procedure StartWriteAt24;
begin
acc:=adrpage24 shl 1;
acc:=acc+adrat24;
cy:=false;
i2cadr;
//if i2cfans then exit;
acc:=hi(adr24);
i2cwb;
i2cans;
acc:=lo(adr24);
i2cwb;
i2cans;
end;
//===============================================
//процедура старта чтения - передача адреса  AT24
//и получение ответа
procedure StartReadAt24;
begin
acc:=adrpage24 shl 1;
acc:=acc+adrat24;
cy:=true;
i2cadr;
end;
//===============================================
procedure OutAdr24;assembler;
label oa24,oa240;
asm
               clr ferr
               mov a,adrpage24
               clr c
               rlc a
               orl A,#10100000B
               clr C
               LCALL I2CADR
               JC oa24
               //jb FlagI2C_2,oa240
              
               jb adrbyte,oa240
               MOV A,ADR24+1
               LCALL I2CWB
               LCALL I2CANS
               JC oa24
oa240:
               MOV A,ADR24
               LCALL I2CWB
               LCALL I2CANS
               JC oa24
               ret
oa24:          setb ferr
               ret
end;
//===============================================
//процедура записи байта в AT24 через адрес AT24
procedure WriteByteAt24;
begin
outadr24;
if ferr then exit;
acc:=data640;
I2CWB;
I2CANS;
I2CSTOP;
if flagdelay24 then delay24;
end;
//===============================================
//процедура чтения байта из AT24 через адрес AT24
procedure ReadByteAt24;
begin
outadr24;
if ferr then exit;
asm
  mov a,adrpage24
  clr c
  rlc a
  orl A,#10100000B
  setb c
end;
I2CADR;
I2CRB;
data640:=acc;
I2CSTOP;
end;
//===============================================
procedure WritePageAt24(numwr:byte);
begin
outadr24;
if ferr then exit;
for countbyte:=0 to numwr-1 do
  begin
   ar0:=bufferpage[countbyte];
   acc:=ar0;
   I2CWB;
   I2CANS;
  end;
I2CSTOP;
if flagdelay24 then delay24;
end;
//===============================================
procedure ReadPageAt24(numrd:byte);
begin
outadr24;
if ferr then exit;
asm
  mov a,adrpage24
  clr c
  rlc a
  orl A,#10100000B
  SETB C
  LCALL I2CADR
end;
for countbyte:=0 to numrd-1 do
  begin
   I2CRB;
   ar0:=acc;
   bufferpage[countbyte]:=ar0;
   if countbyte<>numrd-1 then I2CANSM;
  end;
i2cnoansm;
I2CSTOP;
end;
//===============================================
end.

AT25_01

unit at2501;
{$O-}
{$xdata}
{$idata}
interface

procedure AtWrite;
procedure ATREAD;
procedure Read6401;
procedure Write6401;
PROCEDURE READ6401P(numr:byte);
PROCEDURE WRITE6401P(numw:byte);

//var adrbyte:boolean;     //флаг выставляется, если адрес не будет превышать 255

implementation
uses declare,ports;

PROCEDURE ATWRCOM1;forward;
PROCEDURE ATRDB1;forward;
PROCEDURE WREN1;forward;
PROCEDURE RDSR1;forward;

var countbyte:byte;
//================================================
procedure delayat1;assembler;
asm
nop
nop
nop
nop
nop
nop
nop
nop
end;
//------------------------------------------------
PROCEDURE ATWREN1;ASSEMBLER;
ASM

          //ПОДПРОГРАММА ПЕРЕДАЧИ СИГНАЛА РАЗРЕШЕНИЯ ЗАПИСИ
MOV A,#00000110B    //КОМАНДА РАЗРЕШЕНИЯ ЗАПИСИ
          //ПОДПРОГРАММА ПЕРЕДАЧИ КОМАНДЫ
          //(КОД КОМАНДЫ НАХОДИТСЯ В АККУМУЛЯТОРЕ)
LCALL ATWRCOM1
END;
//===============================================
PROCEDURE ATWRCOM1;ASSEMBLER;
LABEL ATWREN0;
ASM
          CLR FLASHCLK6401
          CLR FLASHCS6401
          lcall delayat1
          MOV R2,#8            //НАДО ПЕРЕДАТЬ 8 БИТ
ATWREN0:  RLC A                //ВЫДВИЖЕНИЕ СТАРШЕГО БИТА В БИТ ПЕРЕНОСА
          MOV FLASHOUT6401,C       //ПЕРЕДАЧА БИТА В ЛИНИЮ
          lcall delayat1
          SETB FLASHCLK6401        //ФИКСАЦИЯ БИТА
          lcall delayat1
          CLR FLASHCLK6401         //ДЛЯ СЛЕДУЮЩЕГО
          lcall delayat1
          DJNZ R2,ATWREN01      //ЦИКЛ
END;
//-----------------------------------------------
PROCEDURE ATWRDI1;ASSEMBLER;
ASM
          //ПОДПРОГРАММА ПЕРЕДАЧИ СИГНАЛА ЗАПРЕЩЕНИЯ ЗАПИСИ
          MOV A,#00000100B     //КОМАНДА ЗАПРЕЩЕНИЯ ЗАПИСИ
          LCALL ATWRCOM1
END;
//-----------------------------------------------
PROCEDURE ATRSR1;ASSEMBLER;
ASM
          //ПОДПРОГРАММА ЧТЕНИЯ БАЙТА СТАТУСА
          //ПОСЛЕ ПРИЕМА БАЙТ СТАТУСА НАХОДИТСЯ В АККУМУЛЯТОРЕ
          MOV A,#00000101B     //КОМАНДА ЧТЕНИЯ СТАТУСА
          LCALL ATWRCOM1        //ПЕРЕДАЧА КОМАНДЫ
          LCALL ATRDB1
END;
//===============================================
PROCEDURE ATRDB1;ASSEMBLER;
LABEL ATRSR0;
ASM
          //ПОДПРОГРАММА ЧТЕНИЯ БАЙТА
          MOV R2,#8            //НАДО ПРИНЯТЬ 8 БИТ
ATRSR0:   SETB FLASHCLK6401        //УСТАНОВКА 1 В ЛИНИИ CLK
          lcall delayat1
          MOV C,FLASHIN6401        //ПРИЕМ БИТА ДАННЫХ
          RLC A                //ВДВИЖЕНИЕ БИТА В МЛАДШИЙ БИТ АККУМУЛЯТОРА
          lcall delayat1
          CLR FLASHCLK6401
          lcall delayat1
          DJNZ R2,ATRSR0       //ЦИКЛ
END;
//-----------------------------------------------
          //ПОДПРОГРАММА ПЕРЕДАЧИ АДРЕСА
          //В R3 ДОЛЖЕН СОДЕРЖАТЬСЯ КОД КОМАНДЫ,
          //АДРЕС В R0:R1
PROCEDURE ATWRITA1;ASSEMBLER;
LABEL ATWRITA0;
ASM
          MOV A,R3
          LCALL ATWRCOM1        //ПЕРЕДАЧА КОМАНДЫ
          mov r2,#8
ATWRITA0:
          MOV A,R1             //НАЧАЛО ЦИКЛА ПЕРЕДАЧИ АДРЕСА
          RLC A
          MOV R1,A
          {MOV A,R0
          RLC A                //ВЫДВИЖЕНИЕ СТАРШЕГО БИТА АККУМУЛЯТОРА
          MOV R0,A}
          MOV FLASHOUT6401,C
          lcall delayat1
          SETB FLASHCLK6401        //ФИКСАЦИЯ ДАННЫХ НА ЛИНИИ
          lcall delayat1
          CLR FLASHCLK6401
          lcall delayat1
          DJNZ R2,ATWRITA0     //ЦИКЛ
END;
//------------------------------------------------
          //ПОДПРОГРАММА ЗАПИСИ БАЙТА.
          //В РЕГИСТРЕ В СОДЕРЖИТСЯ КОД
          //В РЕГИСТРАХ R0:R1 - АДРЕС
PROCEDURE ATWRITE1;ASSEMBLER;
LABEL ATWRITE0;
ASM
          LCALL WREN1
          MOV R3,#00000010B    //КОД КОМАНДЫ ЗАПИСИ
          LCALL ATWRITA1        //ПЕРЕДАЧА АДРЕСА
          MOV A,B
          LCALL ATWRCOM1        //ПЕРЕДАЧА БАЙТА
          SETB FLASHCS6401
ATWRITE0: LCALL RDSR1
          JB ACC.0,ATWRITE0
END;
//------------------------------------------------
          //ПОДПРОГРАММА ЧТЕНИЯ БАЙТА.
          //В РЕГИСТРАХ R0:R1 СОДЕРЖИТСЯ АДРЕС
          //СЧИТАННЫЙ БАЙТ РАСПОЛАГАЕТСЯ В АККУМУЛЯТОРЕ
PROCEDURE ATREAD1;ASSEMBLER;
ASM
          MOV R3,#00000011B    //КОД КОМАНДЫ ЧТЕНИЯ
          LCALL ATWRITA1        //ПЕРЕДАЧА АДРЕСА
          LCALL ATRDB1          //ПРИЕМ БАЙТА
          SETB FLASHCS6401
END;
//------------------------------------------------
PROCEDURE WREN1;ASSEMBLER;
ASM
          LCALL ATWREN1
          SETB FLASHCS6401
END;
//------------------------------------------------
PROCEDURE RDSR1;ASSEMBLER;
ASM
          LCALL ATRSR1
          SETB FLASHCS6401
END;
//===============================================
PROCEDURE READ6401;ASSEMBLER;
label read640_0;
ASM
          //mov r0,#0
read640_0:
          MOV R1,ADR640
          LCALL ATREAD1
          MOV DATA640,A
END;
//===============================================
PROCEDURE WRITE6401;ASSEMBLER;
label write640_0;
ASM
          //mov r0,#0
write640_0:
          MOV R1,ADR640
          MOV B,DATA640
          LCALL ATWRITE1
END;
//================================================
//------------------------------------------------
          //ПОДПРОГРАММА ЗАПИСИ БАЙТА.
          //ЗАПИСЫВАЕМЫЕ БАЙТЫ РАЗМЕЩАЮТСЯ В БУФЕРЕ.
          //В РЕГИСТРАХ R5:R6 - АДРЕС
PROCEDURE ATWRITEP1(nw:byte);
begin
WREN1;
ar3:=%00000010;              //КОД КОМАНДЫ ЗАПИСИ
ATWRITA1;
for countbyte:=0 to nw-1 do
  begin
   ar0:=sn[countbyte];
   acc:=ar0;
   ATWRCOM1;
  end;
flashcs6401:=true;
end;
//------------------------------------------------
          //ПОДПРОГРАММА ЧТЕНИЯ БАЙТА.
          //В РЕГИСТРАХ R5:R6 СОДЕРЖИТСЯ АДРЕС
          //СЧИТАННЫЕ БАЙТЫ РАЗМЕЩАЮТСЯ В БУФЕРЕ
PROCEDURE ATREADP1(nr:byte);
begin
ar3:=%00000011;         //КОД КОМАНДЫ ЧТЕНИЯ
ATWRITA1;               //ПЕРЕДАЧА АДРЕСА
for countbyte:=0 to nr-1 do
  begin
   atrdb1;
   sn[countbyte]:=ar0;
  end;
flashcs6401:=true;
end;
//================================================
PROCEDURE READ6401P(numr:byte);
begin
//ar0:=0
ar1:=lo(adr640);
ATREADP1(numr);
end;
//================================================
PROCEDURE WRITE6401P(numw:byte);
begin
//AR0:=0;
ar1:=lo(adr640);
ATWRITEP1(numw);
end;
//================================================

end.

AT25_256

unit at25256;
{$O-}
{$xdata}
{$idata}
interface

procedure AtWrite256;
procedure ATREAD256;
procedure Read256;
procedure Write256;
PROCEDURE READ256P(numr:byte);
PROCEDURE WRITE256P(numw:byte);

//var adrbyte:boolean;     //флаг выставляется, если адрес не будет превышать 255

implementation
uses declare,ports;

PROCEDURE ATWRCOM256;forward;
PROCEDURE ATRDB256;forward;
PROCEDURE WREN256;forward;
PROCEDURE RDSR256;forward;

var countbyte:byte;
//================================================
procedure delayat256;assembler;
asm
nop
nop
nop
nop
nop
nop
nop
nop
end;
//------------------------------------------------
PROCEDURE ATWREN256;ASSEMBLER;
ASM

          //ПОДПРОГРАММА ПЕРЕДАЧИ СИГНАЛА РАЗРЕШЕНИЯ ЗАПИСИ
MOV A,#00000110B    //КОМАНДА РАЗРЕШЕНИЯ ЗАПИСИ
          //ПОДПРОГРАММА ПЕРЕДАЧИ КОМАНДЫ
          //(КОД КОМАНДЫ НАХОДИТСЯ В АККУМУЛЯТОРЕ)
LCALL ATWRCOM256
END;
//===============================================
PROCEDURE ATWRCOM256;ASSEMBLER;
LABEL ATWREN0;
ASM
          CLR FLASHCLKB
          CLR FLASHCSB
          lcall delayat256
          MOV R2,#8            //НАДО ПЕРЕДАТЬ 8 БИТ
ATWREN0:  RLC A                //ВЫДВИЖЕНИЕ СТАРШЕГО БИТА В БИТ ПЕРЕНОСА
          MOV FLASHOUTB,C       //ПЕРЕДАЧА БИТА В ЛИНИЮ
          lcall delayat256
          SETB FLASHCLKB        //ФИКСАЦИЯ БИТА
          lcall delayat256
          CLR FLASHCLKB         //ДЛЯ СЛЕДУЮЩЕГО
          lcall delayat256
          DJNZ R2,ATWREN0      //ЦИКЛ
END;
//-----------------------------------------------
PROCEDURE ATWRDI256;ASSEMBLER;
ASM
          //ПОДПРОГРАММА ПЕРЕДАЧИ СИГНАЛА ЗАПРЕЩЕНИЯ ЗАПИСИ
          MOV A,#00000100B     //КОМАНДА ЗАПРЕЩЕНИЯ ЗАПИСИ
          LCALL ATWRCOM256
END;
//-----------------------------------------------
PROCEDURE ATRSR256;ASSEMBLER;
ASM
          //ПОДПРОГРАММА ЧТЕНИЯ БАЙТА СТАТУСА
          //ПОСЛЕ ПРИЕМА БАЙТ СТАТУСА НАХОДИТСЯ В АККУМУЛЯТОРЕ
          MOV A,#00000101B     //КОМАНДА ЧТЕНИЯ СТАТУСА
          LCALL ATWRCOM256        //ПЕРЕДАЧА КОМАНДЫ
          LCALL ATRDB256
END;
//===============================================
PROCEDURE ATRDB256;ASSEMBLER;
LABEL ATRSR0;
ASM
          //ПОДПРОГРАММА ЧТЕНИЯ БАЙТА
          MOV R2,#8            //НАДО ПРИНЯТЬ 8 БИТ
ATRSR0:   SETB FLASHCLKB        //УСТАНОВКА 1 В ЛИНИИ CLK
          lcall delayat256
          MOV C,FLASHINB        //ПРИЕМ БИТА ДАННЫХ
          RLC A                //ВДВИЖЕНИЕ БИТА В МЛАДШИЙ БИТ АККУМУЛЯТОРА
          lcall delayat256
          CLR FLASHCLKB
          lcall delayat256
          DJNZ R2,ATRSR0       //ЦИКЛ
END;
//-----------------------------------------------
          //ПОДПРОГРАММА ПЕРЕДАЧИ АДРЕСА
          //В R3 ДОЛЖЕН СОДЕРЖАТЬСЯ КОД КОМАНДЫ,
          //АДРЕС В R0:R1
PROCEDURE ATWRITA256;ASSEMBLER;
LABEL ATWRITA0;
ASM
          MOV A,R3
          LCALL ATWRCOM256        //ПЕРЕДАЧА КОМАНДЫ
          mov r2,#8
          //jb adrbyte,ATWRITA0
          MOV R2,#16           //АДРЕС СОСТОИТ ИЗ 16 БИТ
ATWRITA0:
          MOV A,R1             //НАЧАЛО ЦИКЛА ПЕРЕДАЧИ АДРЕСА
          RLC A
          MOV R1,A
          MOV A,R0
          RLC A                //ВЫДВИЖЕНИЕ СТАРШЕГО БИТА АККУМУЛЯТОРА
          MOV R0,A
          MOV FLASHOUTB,C
          lcall delayat256
          SETB FLASHCLKB        //ФИКСАЦИЯ ДАННЫХ НА ЛИНИИ
          lcall delayat256
          CLR FLASHCLKB
          lcall delayat256
          DJNZ R2,ATWRITA0     //ЦИКЛ
END;
//------------------------------------------------
          //ПОДПРОГРАММА ЗАПИСИ БАЙТА.
          //В РЕГИСТРЕ В СОДЕРЖИТСЯ КОД
          //В РЕГИСТРАХ R0:R1 - АДРЕС
PROCEDURE ATWRITE256;ASSEMBLER;
LABEL ATWRITE0;
ASM
          LCALL WREN256
          MOV R3,#00000010B    //КОД КОМАНДЫ ЗАПИСИ
          LCALL ATWRITA256        //ПЕРЕДАЧА АДРЕСА
          MOV A,B
          LCALL ATWRCOM256        //ПЕРЕДАЧА БАЙТА
          SETB FLASHCSB
ATWRITE0: LCALL RDSR256
          JB ACC.0,ATWRITE0
END;
//------------------------------------------------
          //ПОДПРОГРАММА ЧТЕНИЯ БАЙТА.
          //В РЕГИСТРАХ R0:R1 СОДЕРЖИТСЯ АДРЕС
          //СЧИТАННЫЙ БАЙТ РАСПОЛАГАЕТСЯ В АККУМУЛЯТОРЕ
PROCEDURE ATREAD256;ASSEMBLER;
ASM
          MOV R3,#00000011B    //КОД КОМАНДЫ ЧТЕНИЯ
          LCALL ATWRITA256        //ПЕРЕДАЧА АДРЕСА
          LCALL ATRDB256          //ПРИЕМ БАЙТА
          SETB FLASHCSB
END;
//------------------------------------------------
PROCEDURE WREN256;ASSEMBLER;
ASM
          LCALL ATWREN256
          SETB FLASHCSB
END;
//------------------------------------------------
PROCEDURE RDSR256;ASSEMBLER;
ASM
          LCALL ATRSR256
          SETB FLASHCSB
END;
//===============================================
PROCEDURE READ256;ASSEMBLER;
label read256_0;
ASM
          MOV R0,ADR256+1
          jnb adrbyte,read256_0
          mov r0,#0
read256_0:
          MOV R1,ADR256
          LCALL ATREAD256
          MOV DATA640,A
END;
//===============================================
PROCEDURE WRITE256;ASSEMBLER;
label write256_0;
ASM
          MOV R0,ADR256+1
          jnb adrbyte,write256_0
          mov r0,#0
write256_0:
          MOV R1,ADR256
          MOV B,DATA640
          LCALL ATWRITE256
END;
//================================================
//------------------------------------------------
          //ПОДПРОГРАММА ЗАПИСИ БАЙТА.
          //ЗАПИСЫВАЕМЫЕ БАЙТЫ РАЗМЕЩАЮТСЯ В БУФЕРЕ.
          //В РЕГИСТРАХ R5:R6 - АДРЕС
PROCEDURE ATWRITEP256(nw:byte);
begin
WREN256;
ar3:=%00000010;              //КОД КОМАНДЫ ЗАПИСИ
ATWRITA256;
for countbyte:=0 to nw-1 do
  begin
   ar0:=sn[countbyte];
   acc:=ar0;
   ATWRCOM256;
  end;
flashcsB:=true;
end;
//------------------------------------------------
          //ПОДПРОГРАММА ЧТЕНИЯ БАЙТА.
          //В РЕГИСТРАХ R5:R6 СОДЕРЖИТСЯ АДРЕС
          //СЧИТАННЫЕ БАЙТЫ РАЗМЕЩАЮТСЯ В БУФЕРЕ
PROCEDURE ATREADP256(nr:byte);
begin
ar3:=%00000011;         //КОД КОМАНДЫ ЧТЕНИЯ
ATWRITA256;               //ПЕРЕДАЧА АДРЕСА
for countbyte:=0 to nr-1 do
  begin
   atrdb256;
   sn[countbyte]:=ar0;
  end;
flashcsB:=true;
end;
//================================================
PROCEDURE READ256P(numr:byte);
begin
if adrbyte then
  ar0:=0
   else
    ar0:=hi(ADR256);
ar1:=lo(ADR256);
ATREADP256(numr);
end;
//================================================
PROCEDURE WRITE256P(numw:byte);
begin
if adrbyte then
  ar0:=0
   else
    ar0:=hi(ADR256);
ar1:=lo(ADR256);
ATWRITEP256(numw);
end;
//================================================

end.

AT26

//Модуль для работы с FLASH-памятью данных
//AT26C081 объемом 1 Мбайт.
unit at26;
{$O-}
interface
var data26:byte;
    adr26:longint;
    //clk26:boolean absolute $80;
    //cs26 :boolean absolute $80;
    //in26 :boolean absolute $80;
    //out26:boolean absolute $80;
procedure Init26(command:byte;adr:longint);
procedure read26byte(cont,first:boolean);
procedure From26To522(num:longint);
procedure WrEn26;
procedure WrDis26;
procedure ReadStatus26;
procedure Erase26;
procedure Write26Byte;
procedure Unprotect26;
procedure InitWritePage;
procedure Transfer;
procedure EndWrite;

   
implementation
uses ports,declare;
//===============================================
//Процедура вывода команды и адреса
procedure Init26(command:byte;adr:longint);assembler;
label l0,l1,l2,l3;
asm
  clr cs26               //разрешение микросхемы
  mov r2,#8
  mov a,command
l0:

  rlc a
  mov out26,c            //вывод кода операции
  setb clk26
  nop
  nop
  clr clk26
  djnz r2,l0

  mov a,adr+2
  mov r2,#8
l1:

  rlc a
  mov out26,c            //вывод старшего байта адреса
  setb clk26
  nop
  nop
  clr clk26
  djnz r2,l1

  mov a,adr+1
  mov r2,#8
l2:

  rlc a
  mov out26,c            //вывод среднего байта адреса
  setb clk26
  nop
  nop
  clr clk26
  djnz r2,l2

  mov a,adr
  mov r2,#8
l3:

  rlc a
  mov out26,c            //вывод младшего байта адреса
  setb clk26
  nop
  nop
  clr clk26
  djnz r2,l3

end;
//===============================================
//процедура чтения байта или байтов из памяти
//если установлен бит CONT, вывод адреса и закрытие
//микросхемы не производится, то есть процедура
//работает в режиме поточного чтения
procedure read26byte(cont,first:boolean);
label l0;
begin
if (not cont) or (first) then init26(3,adr26); //вывод адреса, если первый или одиночный байт
asm
//---------------------------
  mov r2,#8
l0:
  mov c,in26
  rlc a
  setb clk26
  nop
  nop
  clr clk26
  djnz r2,l0
end;

//---------------------------
  if (not cont) and (not first) then  cs26:=true;    //закрытие микросхемы, если одиночный байт
  data26:=acc;
end;
//===============================================
procedure From26To522(num:longint);
label l0,l1,l2,l3,l4,l5;
begin
init26(3,adr26);
fchannel:=true;
vall:=0;

  asm

l2:cpl fchannel
   jb fchannel,l3
   mov a,#00100010b
   sjmp l4
l3:mov a,#00100001b
l4:
          CLR CS522
          MOV R2,#8
l0:       CLR CLK522
          RLC A
          MOV DI522,C
          SETB CLK522
          DJNZ R2,l0
         
   mov r2,#8
l1:

   clr clk522
   mov c,in26
   mov di522,c
   setb clk26;
   setb clk522
   clr clk26
   djnz r2,l1
   setb cs522


   inc vall
   mov a,vall
   jnz l5
   inc vall+1
   mov a,vall+1
   jnz l5
   inc vall+2
l5:cpl p3.2
{
          Nop
          Nop
          Nop
          Nop
          Nop
          Nop
          Nop
          Nop
          Nop
          Nop
          Nop
          Nop
          Nop
          Nop
          Nop
          Nop
          Nop
          Nop
          Nop
          Nop
          Nop
          Nop
          Nop
          Nop
          Nop
          Nop
          Nop
          //Nop
          //Nop
          //Nop
          //Nop
          //Nop
          //Nop

}
   mov a,vall+2
   cjne a,num+2,l2
   mov a,vall+1
   cjne a,num+1,l2
   mov a,vall
   cjne a,num,l2
  

  end;
//---------------------------
cs26:=true;
//clk26:=false;
end;
//===============================================
procedure WrEn26;assembler;
label l0;
asm
  clr cs26
  mov r2,#8
  mov a,#6
l0:
  rlc a
  mov out26,c
  setb clk26
  nop
  nop
  clr clk26
  djnz r2,l0
  setb cs26
end;
//===============================================
procedure WrDis26;assembler;
label l0;
asm
  clr cs26
  mov r2,#8
  mov a,#4
l0:
  rlc a
  mov out26,c
  setb clk26
  nop
  nop
  clr clk26
  djnz r2,l0
  setb cs26
end;
//===============================================
procedure Unprotect26;assembler;
label l1,l2;
asm
  lcall wren26
 
  clr cs26
  mov r2,#8
  mov a,#1
l1:
  rlc a
  mov out26,c
  setb clk26
  nop
  nop
  clr clk26
  djnz r2,l1

  mov r2,#8
  mov a,#0
l2:
  rlc a
  mov out26,c
  setb clk26
  nop
  nop
  clr clk26
  djnz r2,l2
 
  setb cs26
 
  lcall wren26
end;
//===============================================
procedure ReadStatus26;assembler;
label l0,l1;
asm
  clr cs26
  mov r2,#8
  mov a,#5
l0:
  rlc a
  mov out26,c
  setb clk26
  nop
  nop
  clr clk26
  djnz r2,l0

  mov r2,#8
l1:
  mov c,in26
  rlc a
  setb clk26
  nop
  nop
  clr clk26
  djnz r2,l1

  setb cs26
end;
//===============================================
procedure Erase26;
label l0;
begin
wren26;
asm
  clr cs26
  mov r2,#8
  mov a,#60H
l0:
  rlc a
  mov out26,c
  setb clk26
  nop
  nop
  clr clk26
  djnz r2,l0
end;
cs26:=true;
acc:=$ff;
while acc.0 do readstatus26;
//cs26:=true;
end;
//===============================================
procedure Write26Byte;
label l0;
begin
wren26;
readstatus26;
p1.6:=acc.1;
init26(2,adr26);
asm
  mov r2,#8
  mov a,data26
l0:
  rlc a
  mov out26,c
  setb clk26
  nop
  nop
  clr clk26
  djnz r2,l0
end;
cs26:=true;
//acc:=1;
//while acc.0 do readstatus26;
end;
//===============================================
//===============================================
procedure InitWritePage;
label l0,l1;
begin
wren26;
readstatus26;
p1.6:=acc.1;
init26(2,adr26);
asm
     mov r3,#32
     mov r0,#paket+4
l1:  mov a,@r0
     mov r2,#8
     //mov a,data26
l0:  rlc a
     mov out26,c
     setb clk26
     clr clk26
     djnz r2,l0
     inc r0
     djnz r3,l1
end;
end;
//===============================================
procedure Transfer;assembler;
label l0,l1;
asm
     mov r3,#32
     mov r0,#paket+4
l1:  mov a,@r0
     mov r2,#8
     //mov a,data26
l0:  rlc a
     mov out26,c
     setb clk26
     clr clk26
     djnz r2,l0
     inc r0
     djnz r3,l1
end;
//===============================================
procedure EndWrite;
begin
 cs26:=true;
end;
//===============================================
end.
{Обмен
Запись в память
1. исходное состояние CLK - 0
2. выставляется на линии бит
3. по фронту  CLK он фиксируется в памяти
4. по срезу  CLK бит сдвигается во внутреннем регистре памяти
5. далее все повторяется

Чтение
1. по срезу  CLK память выставляет бит на линию
2. после этого МС считывает данные с линии и помещает в аккумулятор
3. затем следует фронт  CLK
4. затем все повторяется}

bottom of page