PRN_CNT/PRN_CNT.BAS
2021-09-08 21:34:51 +02:00

262 lines
11 KiB
QBasic
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

' /**************************************************************************\
'| |
'| Codigo Fuente de PRN_CNT |
'| |
' \**************************************************************************/
dim shared Salidas(10) as single, PortAddress(3) as integer
PortAddress(1) = &378
PortAddress(2) = &278
PortAddress(3) = &3bc
dim shared NULL as ESTADOS
typedef struct ESTADOS
{
b1 as single
b2 as single
b3 as single
b4 as single
b5 as single
b6 as single
b7 as single
}
sub Init.DeInit
/**************************************************************************\
| |
| Esta rutina debe ser llamada al iniciar el programa que use las librerias. |
| |
| Es la encargada de poner a cero todas la salidas, al principio y al salir. |
| |
| |
| Parametros de Entrada: ( ninguno ) |
| Parametros de Salida: |
| OK Todo ha ido bien. |
| ERROR_EN_ATEXIT Error registrando funci¢n |
| FUNCION_YA_REGISTRADA No es la 1¦ vez |
| |
\**************************************************************************/
call ResetAll
end sub
sub ResetAll
/**************************************************************************\
| |
| Resetea todas las salidas y las pone a cero. |
| |
\**************************************************************************/
dim ampl as single
for ampl=0 to ampl<10 step 1
call EscribeSalidas( ampl, NULL, 0 )
next ampl
end sub
function LeeSalidas%( ampl as single, estados as ESTADOS )
/**************************************************************************\
| |
| Obtiene el estado de las salidas ( On/Off ), de la ampliacion AMPL. |
| |
| Parametros de Entrada: |
| ampl Ampliaci¢n donde debemos mirar |
| estados Puntero a estructura con los estados |
| |
| Parametros de Salida: |
| char 1Byte con los estados |
| |
| NOTA: si &estados es NULL, solo se devolvera el char de salida. |
\**************************************************************************/
dim desp as single
if ampl < 0 or ampl >9 then
LeeSalidas = 0
exit
end if
if estados <> NULL then
estados.Salida0 = ( ( Salidas( ampl ) and&00 ) <> 0 )
estados.Salida1 = ( ( Salidas( ampl ) and&02 ) <> 0 )
estados.Salida2 = ( ( Salidas( ampl ) and&04 ) <> 0 )
estados.Salida3 = ( ( Salidas( ampl ) and&08 ) <> 0 )
estados.Salida4 = ( ( Salidas( ampl ) and&10 ) <> 0 )
estados.Salida5 = ( ( Salidas( ampl ) and&20 ) <> 0 )
estados.Salida6 = ( ( Salidas( ampl ) and&40 ) <> 0 )
estados.Salida7 = ( ( Salidas( ampl ) and&80 ) <> 0 )
}
return Salidas( ampl )
}
/**************************************************************************\
| |
| Obtiene el estado de una salida ( On/Off ), cualquiera. |
| |
| Parametros de Entrada: |
| salida ( Si 1 ampl. 0 a 7 ) |
| ( Si 10 ampl. 0 a 80 ) |
| |
| Parametros de Salida: |
| char 1Byte con el estado |
| |
\**************************************************************************/
char Lee_Salida( char salida )
{
return ( Salida( (salida / 8) + 1 ) and( &01 << ( salida - ((salida/8)+1)*8 ) ) <> 0
}
/**************************************************************************\
| |
| Escribe la variable 'estados' ( On/Off ), en la ampliacion AMPL. |
| |
| Parametros de Entrada: |
| ampl Ampliaci¢n donde debemos mirar |
| estados Puntero a estructura con los estados |
| estadosb 1byte con los estados |
| |
| Parametros de Salida: |
| char 1Byte con los estados |
| |
| NOTA: si &estados es NULL, solo se utilizar  la variable estadosb. |
\**************************************************************************/
char Escribe_Salidas( char ampl, ESTADOS *estados, char estadosb )
{
char byte_out=0, cont
outportb( Port_Address(Lpt_usado-1) + 1, &0 )
if ( estados = NULL )
{
outportb( Port_Address(Lpt_usado-1), estadosb )
Salida( ampl ) = estadosb
} else {
byte_out = estados.Salida0
byte_out = ( bytes_out or( ( estados.Salida1 ) << 1) )
byte_out = ( bytes_out or( ( estados.Salida1 ) << 2) )
byte_out = ( bytes_out or( ( estados.Salida1 ) << 3) )
byte_out = ( bytes_out or( ( estados.Salida1 ) << 4) )
byte_out = ( bytes_out or( ( estados.Salida1 ) << 5) )
byte_out = ( bytes_out or( ( estados.Salida1 ) << 6) )
byte_out = ( bytes_out or( ( estados.Salida1 ) << 7) )
outportb( Port_Address(Lpt_usado-1), byte_out )
Salida( ampl ) = byte_out
}
/*
A2 (ampl and&01)
A1 (ampl and&02)
A0 (ampl and&04)
*/
outportb( Port_Address(Lpt_usado-1) + 1, &0 )
outportb( Port_Address(Lpt_usado-1) + 1, &0 )
/*
A2 01.0 Strobe
A1 14.0 AutoFeed
A0 16.0 Inicializaci¢n
11 10 12 13 15
128 64 32 16 8 4 2 1
0 1 0 1 0 1 0 1
13 12 11 10
. . . . þ þ þ þ þ þ þ þ . <-- 1
- - - - - - - - . . . .
15
*/
}
function EscribeSalida%( salida as single, estados as single )
/**************************************************************************\
| |
| Escribe el estado de una salida ( On/Off ), cualquiera. |
| |
| Parametros de Entrada: |
| salida ( Si 1 ampl. 0 a 3 ) |
| ( Si 10 ampl. 0 a 80 ) |
| |
| Parametros de Salida: |
| char 1Byte con el estado |
| |
\**************************************************************************/
dim ampl as single, byte_out as single
ampl = (salida / 8) + 1
byte_out = Lee_Salidas( ampl, NULL )
byte_out = ( byte_out and!( &01 << ( salida - ampl*8 ) ) ) or( estado << ( salida - ampl*8 ) )
Salida( ampl ) = byte_out
EscribeSalidas( ampl, NULL, byte_out )
EscribeSalida = byte_out
end function
function LeeEntradas%( ampl as single, estados as ESTADOS )
' /**************************************************************************\
'| |
'| Lee las entradas y la almacena en la variable estados. |
'| |
'| Parametros de Entrada: |
'| ampl Ampliaci¢n donde debemos mirar |
'| estados Puntero a estructura con los estados |
'| |
'| Parametros de Salida: |
'| char 1Byte con los estados |
'| |
' \**************************************************************************/
end function
function LeeEntrada%( entrada as single )
/**************************************************************************\
| |
| Lee una entrada cualquiera. |
| |
| Parametros de Entrada: |
| entrada ( Si 1 ampl. 0 a 3 ) |
| ( Si 10 ampl. 0 a 80 ) |
| |
| Parametros de Salida: |
| char 1Byte con el estado |
| |
\**************************************************************************/
dim byte_out as single, ampl as single
ampl = (salida / 8) + 1
byte_out = Lee_Entradas( ( (salida / 8) + 1 ), NULL )
byte_out = ( byte_out and( &01 << ( salida - ampl*8 ) ) )
LeeEntrada = byte_out
end function
/*ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ*/
/*ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛFÛIÛNÛÛÛDÛEÛÛÛLÛAÛÛÛÛCÛAÛBÛEÛCÛEÛRÛAÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ*/
/*ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ*/