Turbo51
Модули общего назначения
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.