top of page

Модули общего назначения

I2C

//блок подпрограмм для работы в протоколе I2C
unit i2c;
{$O-}
{$xdata}
{$idata}
interface
//================================================
var
          I2CError:boolean;
          flaglpi2c:boolean;
          //SCL      =P0.0
          //SDA      =P0.0
procedure I2CINIT;
procedure I2CSTART;
procedure I2CSTOP;         
procedure I2CANS;
procedure I2CANSM;
procedure I2CNOANSM;
procedure I2CADR;
procedure i2crb;
procedure I2CWB;
//================================================
implementation
uses declare,ports;
//================================================
procedure i2cp;assembler;
label i2cp0,i2cp1;
asm
          //nop
          //nop
          jnb flaglpi2c,i2cp0
          mov r7,#100
i2cp1:
          djnz r7,i2cp1
i2cp0:
end;
//================================================
          //подпрограмма инициализации I2C
procedure I2CINIT;assembler;

asm
          CLR SCL
          CLR SDA
          SETB SCL
          lcall i2cp
          SETB SDA
          lcall i2cp
          CLR SCL
          lcall i2cp
          setb scl
end;
//================================================
          //подпрограмма запуска обмена по I2C
procedure I2CSTART;assembler;
label i2cstart0,i2cstart1;
asm
          SETB SCL

i2cstart0:
          jnb scl,i2cstart0
          lcall i2cp
          CLR SDA
          lcall i2cp
          CLR SCL
          lcall i2cp
          mov err,#0
i2cstart1:
end;
//================================================
          //подпрограмма завершения обмена по I2C
procedure I2CSTOP;assembler;

asm
          CLR SCL
          lcall i2cp
          CLR SDA
          lcall i2cp
          SETB SCL
          lcall i2cp
          SETB SDA
          lcall i2cp
end;
//================================================
          //подпрограмма получения ответа от slave
          //ответ содержится флагом I2CError
          //0 - нормально
          //1 - нет ответа
procedure I2CANS;assembler;
label I2CANS0;
asm
          mov err,#0
          SETB SDA
          lcall i2cp
          SETB SCL
          lcall i2cp
          MOV C,SDA
          MOV I2CError,C
          lcall i2cp
          CLR SCL
          lcall i2cp
          jb i2cerror, I2CANS0
          ret
I2CANS0:  mov err,#1
end;
//================================================
procedure I2CANSM;assembler;

asm
          CLR SCL
          CLR SDA
          lcall i2cp
          SETB SCL
          lcall i2cp
          CLR SCL
          lcall i2cp
          SETB SDA
          lcall i2cp
end;
//================================================
procedure I2CNOANSM;assembler;

asm
          CLR SCL
          lcall i2cp
          SETB SDA
          lcall i2cp
          SETB SCL
          lcall i2cp
          CLR SCL
          lcall i2cp
end;
//================================================
          //подпрограмма передачи первого, адресного байта
          //по линии SDA и получение ответа от SLAVE.
          //при входе в подпрограмму:
          //с=0 - запись
          //с=1 - чтение
          //при выходе из подпрограммы:
          //если с установлен, устройство не приняло адрес,
          //если с сброшен, устройство готово к дальнейшей работе.
          //адрес содержится в аккумуляторе

procedure I2CADR;assembler;
label I2CADRWS,I2CADR0;
asm
          LCALL I2CSTART
I2CADRWS: MOV R2,#8
          MOV ACC.0,C
I2CADR0:  RLC A
          MOV SDA,C
          lcall i2cp
          SETB SCL
          lcall i2cp
          CLR SCL
          lcall i2cp
          DJNZ R2,I2CADR0
          LCALL I2CANS
end;
//================================================
          //подпрограмма чтения байта из устройства
procedure i2crb;assembler;
label I2CRB0;
asm
          SETB SDA
          MOV R2,#8
I2CRB0:   SETB SCL
          lcall i2cp
          MOV C,SDA
          RLC A
          lcall i2cp
          CLR SCL
          lcall i2cp
          DJNZ R2,I2CRB0
          SETB SDA
          lcall i2cp
end;
//================================================
          //подпрограмма записи байта в устройство
procedure I2CWB;assembler;
label I2CWB0;
asm
          MOV R2,#8
I2CWB0:   RLC A
          MOV SDA,C
          lcall i2cp
          SETB SCL
          lcall i2cp
          CLR SCL
          lcall i2cp
          DJNZ R2,I2CWB0
          lcall i2cp
end;
//================================================
end.

Macros

unit Macros;
//{$A-} {если +, то LCALL заменяется на ACALL}
//{$B+}
//{$P+}
{$O-}
{$Idata}
{$xdata}

interface

procedure MyStartTC2;    //пуск ТС2 с моими установками
procedure EniAllInt;     //отмена запрещения всех прерываний
procedure DisAllInt;     //запрещение всех прерываний
procedure EniTimer0;     //разрешение прерывания таймера 0
procedure DisiTimer0;    //запрещение прерывания таймера 0
procedure EniTimer1;     //разрешение прерывания таймера 1
procedure DisiTimer1;    //запрещение прерывания таймера 1
procedure EniUART;       //разрешение прерывания УАПП
procedure DisiUART;      //запрещение прерывания УАПП
procedure EniInt0;    //разрешение прерывания по INТ0
procedure DisiInt0;   //запрещение прерывания по INТ0
procedure EniInt1;    //разрешение прерывания по INТ1
procedure DisiInt1;   //запрещение прерывания по INТ1
procedure EniTimer2;     //разрешение прерывания таймера 2
procedure DisiTimer2;    //запрещение прерывания таймера 2
procedure StartTimer0;   //запуск таймера ТС0
procedure StartTimer1;   //запуск таймера ТС1
procedure StartTimer2;   //запуск таймера 2
procedure StopTimer0;    //останов таймера 0
procedure StopTimer1;    //останов таймера 1
procedure StopTimer2;    //останов таймера 2

procedure InternalTimer0;//выбор внутреннего источника для таймера 0
procedure ExternalTimer0;//выбор внешнего источника для таймера 0
procedure InternalTimer1;//выбор внутреннего источника для таймера 1
procedure ExternalTimer1;//выбор внешнего источника для таймера 1
procedure InternalTimer2;//выбор внутреннего источника для таймера 2
procedure ExternalTimer2;//выбор внешнего источника для таймера 2

procedure SetModeTimers(dnum,dmode:byte);//установка режима работы таймера
procedure SetModeUart(dmode:byte);{Mode}
procedure SetParamUart;  {установка параметров УАПП}
procedure SetParamUart828;

procedure SetTimer0Gate;
procedure SetTimer1Gate;
procedure ClrTimer0Gate;
procedure ClrTimer1Gate;

procedure SetFallInt0;   //установка типа прерывания по INT0 - срез
procedure SetPotInt0;    //установка типа прерывания по INT0 - потенциал 0
procedure SetFallInt1;   //установка типа прерывания по INT0 - срез
procedure SetPotInt1;    //установка типа прерывания по INT0 - потенциал 0

procedure UserBank(dnum:byte);{dnum}

procedure SetXDataRC1;   //разрешение внутренней внешней памяти для AT89C51RC1
procedure SetXData516;   //разрешение внутренней внешней памяти для W78E516
procedure SetXdata828;   //разрешение внутренней внешней памяти для AT89LP828
procedure SetPorts828;
procedure SetPorts828wp4;
procedure SetModeTimer828(number,mode:byte;constanta:word);

implementation
uses i8032,declare;
{===============================================}
procedure SetFallInt0;   //установка типа прерывания по INT0 - срез
begin
It0:=true;
end;
{===============================================}
procedure SetPotInt0;    //установка типа прерывания по INT0 - потенциал 0
begin
it0:=false;
end;
{===============================================}
procedure SetFallInt1;   //установка типа прерывания по INT0 - срез
begin
it1:=true;
end;
{===============================================}
procedure SetPotInt1;    //установка типа прерывания по INT0 - потенциал 0
begin
it1:=false;
end;
{===============================================}
procedure UserBank(dnum:byte);{выбор банка регистров}
begin
case dnum of
  0: asm
         clr 0d3h
         clr 0d4h
     end;   
  1: asm
         clr 0d4h
         setb 0d3h
     end;   
  2: asm
         setb 0f4h
         clr 0d3h
     end;   
  3: asm
         setb 0d4h
         setb 0d4h
     end;   
end;
end;
{===============================================}
procedure SetModeUart(dmode:byte);{mode установка моих параметров УАПП}
begin
case dmode of
  0: asm
         clr 9fh
         clr 9eh
     end;   
  1: asm
         clr 9fh
         setb 9eh
     end;   
  2: asm
         setb 9fh
         clr 9eh
     end;   
  3: asm
         setb 9fh
         setb 9eh
     end;   
end; 
end;
{===============================================}
procedure SetModeTimers;{mode,num установка режима работы таймеров}
begin
case dnum of
  0:begin
     case dmode of
      0: asm
             anl TMOD,#0fch
             orl TMOD,#00h
             //clr tmod.0
             //clr tmod.4
         end;   
      1: asm
             anl TMOD,#0fch
             orl TMOD,#01h
         end;   
      2: asm
             anl TMOD,#0fch
             orl TMOD,#02h
         end;  
      3: asm
             anl TMOD,#0fch
             orl TMOD,#03h
         end;   
     end
    end;
  1:begin
     case dmode of
      0: asm
             anl TMOD,#0cfh
             orl TMOD,#00h
         end;   
      1: asm
             anl TMOD,#0cfh
             orl TMOD,#10h
         end;   
      2: asm
             anl TMOD,#0cfh
             orl TMOD,#20h
         end;   
      3: asm
             anl TMOD,#0cfh
             orl TMOD,#30h
         end;   
     end;
    end;
  2:begin
     case dmode of
      0: asm
             clr 0cdh
             clr 0cch
             clr 0c8h
         end;  
      1: asm
             clr 0cdh
             clr 0cch
             setb 0c8h
         end;    
      2: asm
             setb 0cdh
             setb 0cch
             clr 0c8h
         end;   
     end;  
    end;
end;
end;
{===============================================}
procedure EniAllInt;assembler;{отмена запрещения всех прерываний}
asm
//setb 0afh
setb ea
end;
{===============================================}
procedure DisAllInt;assembler;
asm
//clr 0afh
clr ea
end;
{===============================================}
procedure EniTimer0;assembler;{разрешение прерываний от ТС0}
asm
//setb 0a9h
setb et0
end;
{===============================================}
procedure StartTimer0;assembler;
asm
//setb 8ch
setb tr0
end;
{===============================================}
procedure StartTimer1;assembler;
asm
//setb 8eh
setb tr1
end;
{===============================================}
procedure SetParamUart;assembler;{установка параметров УАПП}
asm
mov 87h,#80h                 {установка двойной скорости}
setb 9ch                     {установка бита REN}
clr 9dh                      {сброс бита SM2}
//clr 0fdh
setb 9eh                     {режим 1}
clr 9fh
setb ps
end;
{===============================================}
procedure SetParamUart828;assembler;{установка параметров УАПП}
asm
  mov pointcom,#0
  clr fcomm
  mov 87h,#80h
  setb ren
  clr sm2
  setb txd
  setb rxd
  clr ti
  clr ri
  setb ps
end;
{===============================================}       
procedure DisiTimer0;assembler;
asm
  //clr 0a9h
  clr et0
end;
{===============================================}
procedure EniTimer1;assembler;
asm
//setb 0abh
setb et1
end;
{===============================================}
procedure DisiTimer1;assembler;
asm
//clr 0abh
clr et1
end;
{===============================================}
procedure EniUART;assembler;
asm
//setb 0ach
setb es
end;
{===============================================}
procedure DisiUART;assembler;
asm
//clr 0ach
clr es
end;
{===============================================}
procedure EniInt0;assembler;
asm
//setb 0a8h
setb ex0
end;
{===============================================}
procedure DisiInt0;assembler;
asm
//clr 0a8h
clr ex0
end;
{===============================================}
procedure EniInt1;assembler;
asm
//setb 0aah
setb ex1
end;
{===============================================}
procedure DisiInt1;assembler;
asm
//clr 0aah
clr ex1
end;
{===============================================}
procedure EniTimer2;assembler;
asm
setb 0adh
end;
{===============================================}
procedure DisiTimer2;assembler;
asm
clr 0adh
end;
{===============================================}
procedure StartTimer2;assembler;
asm
setb tr2
end;
{===============================================}
procedure StopTimer2;assembler;
asm
clr tr2
end;
{===============================================}
procedure StopTimer0;assembler;
asm
//clr 8ch
clr tr0
end;
{===============================================}
procedure StopTimer1;assembler;
asm
//clr 8eh
clr tr1
end;
{===============================================}
procedure InternalTimer0;assembler;
asm
anl TMOD,#0fbh
end;
{===============================================}
procedure ExternalTimer0;assembler;
asm
orl TMOD,#4
end;
{===============================================}
procedure InternalTimer1;assembler;
asm
anl TMOD,#0bfh
end;
{===============================================}
procedure ExternalTimer1;assembler;
asm
orl TMOD,#40h
end;
{===============================================}
procedure InternalTimer2;assembler;
asm
anl 0c8h,#0fdh
end;
{===============================================}
procedure ExternalTimer2;assembler;
asm
orl 0c8h,#2
end;
{===============================================}
procedure SetTimer0Gate;assembler;
asm
orl TMOD,#8
end;
{===============================================}
procedure SetTimer1Gate;assembler;
asm
orl TMOD,#80h
end;
{===============================================}
procedure ClrTimer0Gate;assembler;
asm
anl TMOD,#0f7h
end;
{===============================================}
procedure ClrTimer1Gate;assembler;
asm
anl TMOD,#7fh
end;
{===============================================}
procedure MyStartTC2;assembler;
asm
  CLR EXEN2
  CLR C_T2
  CLR RCLK
  CLR TCLK
  CLR EXF2
  MOV TH2,#HIGH(CONTIM2)
  MOV TL2,#LOW(CONTIM2)
  MOV RCAP2L,#LOW(CONTIM2)
  MOV RCAP2H,#HIGH(CONTIM2)
  CLR TF2
  CLR CP_RL2
  anl t2mod,#$FE
  SETB ET2
  SETB TR2
end;
{===============================================}
//процедура разрешения внутренней расширенной в AT89C51RC1
procedure SetXDataRC1;
begin
auxr:=auxr and %11111101;
end;
{===============================================}
//процедура разрешения внутренней расширенной в W78E516
procedure SetXData516;
begin
chpenr:=$87;
chpenr:=$59;
chpcon:=chpcon or $10;
chpenr:=0;
end;
{===============================================}
procedure SetXdata828;
begin
memcon:=$5b;
end;
{===============================================}
procedure SetPorts828;
begin
asm
  mov 0c2h,#0
  mov 0c3h,#0
  mov 0c4h,#0
  mov 0c5h,#0
  mov 0c6h,#0
  mov 0c7h,#0                           //квазидвунаправленные
end;
p2:=$0FF;
p1:=$0FF;
p3:=$0FF;
end;
{===============================================}
procedure SetPorts828wp4;
begin
asm
  mov 0c2h,#0
  mov 0c3h,#0
  mov 0c4h,#0
  mov 0c5h,#0
  mov 0c6h,#0
  mov 0c7h,#0                           //квазидвунаправленные
  mov 0beh,#0
  mov 0bfh,#0
end;
p2:=$0FF;
p1:=$0FF;
p3:=$0FF;
p4:=$0FF;
end;
{===============================================}
procedure SetModeTimer828(number,mode:byte;constanta:word);
//constanta - это то, что дополняет 65536
begin
iw:=65536-constanta;
case number of
  0: begin
      SetModeTimers(0,mode);
      tl0:=lo(iw);
      th0:=hi(iw);
      rl0:=tl0;
      rh0:=th0;
     end;
  1: begin
      SetModeTimers(1,mode);
      tl1:=lo(iw);
      th1:=hi(iw);
      rl1:=tl1;
      rh1:=th1;
     end;
  2: begin
      SetModeTimers(2,mode);
      tl2:=lo(iw);
      th2:=hi(iw);
      RCAP2L:=tl2;
      RCAP2H:=th2;
     end;
end;
end;
{===============================================}
end.

bottom of page