Funciones para el manejo de bits


Estas tres funciones pretenden hacer lo mismo que BTFSx, BSF y BSF del ensamblador en microcontroladores PIC.

La primera de ellas permite testear determinado bit de un dato y devuelve el estado (0 o 1) del mismo.

Function BTF (Dato As Integer, Bit As Integer) As Integer
'Declara una matriz donde guarda los bits.
ReDim Bits(0 To 7) As Integer

'Desarma la palabra de 8 bits.
If Dato > 127 Then Dato = Dato - 128: Bits(7) = 1
If Dato > 63 Then Dato = Dato - 64: Bits(6) = 1
If Dato > 31 Then Dato = Dato - 32: Bits(5) = 1
If Dato > 15 Then Dato = Dato - 16: Bits(4) = 1
If Dato > 7 Then Dato = Dato - 8: Bits(3) = 1
If Dato > 3 Then Dato = Dato - 4: Bits(2) = 1
If Dato > 1 Then Dato = Dato - 2: Bits(1) = 1
If Dato > 0 Then Dato = Dato - 1: Bits(0) = 1

'Genera el resultado de la funcion.
BTF = Bits(Bit)

End Function

De esta forma, si llamamos a la función x = BTF (Dato, Bit) tendremos en x el estado del bit indicado. La forma de utilizarla es la siguiente:

x = BTF(Variable_Entera, Nro_de_Bit)
x = BTF(255, 2)

La segunda función se encarga de establecer en 1 determinado bit de un dato sin importar su estado actual. Esto quiere decir que si antes de ejecutar la función el bit ya estaba en uno queda así como estaba y, si antes de ejecutar estaba en cero, lo pasa a uno.

Function BSF (Dato As Integer, Bit As Integer) As Integer
'Declara una matriz donde guarda los bits.
ReDim Bits(0 To 7) As Integer

'Desarma la palabra de 8 bits.
x = Dato
If x > 127 Then x = x - 128: Bits(7) = 1
If x > 63 Then x = x - 64: Bits(6) = 1
If x > 31 Then x = x - 32: Bits(5) = 1
If x > 15 Then x = x - 16: Bits(4) = 1
If x > 7 Then x = x - 8: Bits(3) = 1
If x > 3 Then x = x - 4: Bits(2) = 1
If x > 1 Then x = x - 2: Bits(1) = 1
If x > 0 Then x = x - 1: Bits(0) = 1

'Si el bit no esta alto lo sube.
If Bits(Bit) = 0 And Bit = 0 Then Dato = Dato + 1
If Bits(Bit) = 0 And Bit = 1 Then Dato = Dato + 2
If Bits(Bit) = 0 And Bit = 2 Then Dato = Dato + 4
If Bits(Bit) = 0 And Bit = 3 Then Dato = Dato + 8
If Bits(Bit) = 0 And Bit = 4 Then Dato = Dato + 16
If Bits(Bit) = 0 And Bit = 5 Then Dato = Dato + 32
If Bits(Bit) = 0 And Bit = 6 Then Dato = Dato + 64
If Bits(Bit) = 0 And Bit = 7 Then Dato = Dato + 128

'Genera el resultado de la funcion.
BSF = Dato

End Function

Devuelve como resultado de la función el dato proporcionado al llamarla con el bit indicado puesto en alto. Si el bit ya estaba alto el dato devuelto es el mismo que el ingresado a la función. Estas son las formas de llamar a la función:

x = BSF(Variable_Entera, Nro_de_Bit)
x = BSF(255, 2)

La última función se encarga de establecer en 0 determinado bit de un dato sin importar su estado actual. Esto quiere decir que si antes de ejecutar la función el bit ya estaba en cero queda así como estaba y, si antes de ejecutar estaba en uno, lo pasa a cero.

Function BCF (Dato As Integer, Bit As Integer) As Integer
'Declara una matriz donde guarda los bits.
ReDim Bits(0 To 7) As Integer

'Desarma la palabra de 8 bits.
x = Dato
If x > 127 Then x = x - 128: Bits(7) = 1
If x > 63 Then x = x - 64: Bits(6) = 1
If x > 31 Then x = x - 32: Bits(5) = 1
If x > 15 Then x = x - 16: Bits(4) = 1
If x > 7 Then x = x - 8: Bits(3) = 1
If x > 3 Then x = x - 4: Bits(2) = 1
If x > 1 Then x = x - 2: Bits(1) = 1
If x > 0 Then x = x - 1: Bits(0) = 1

'Si el bit esta alto lo baja.
If Bits(Bit) = 1 And Bit = 0 Then Dato = Dato - 1
If Bits(Bit) = 1 And Bit = 1 Then Dato = Dato - 2
If Bits(Bit) = 1 And Bit = 2 Then Dato = Dato - 4
If Bits(Bit) = 1 And Bit = 3 Then Dato = Dato - 8
If Bits(Bit) = 1 And Bit = 4 Then Dato = Dato - 16
If Bits(Bit) = 1 And Bit = 5 Then Dato = Dato - 32
If Bits(Bit) = 1 And Bit = 6 Then Dato = Dato - 64
If Bits(Bit) = 1 And Bit = 7 Then Dato = Dato - 128

'Genera el resultado de la funcion.
BCF = Dato

End Function

Devuelve como resultado de la función el dato proporcionado al llamarla con el bit indicado puesto en bajo. Si el bit ya estaba bajo el dato devuelto es el mismo que el ingresado a la función. Estas son las formas de llamar a la función:

x = BCF(Variable_Entera, Nro_de_Bit)
x = BCF(255, 2)

Desarrollé este pequeño programa que sirve para tener una idea de como utilizar estas tres funciones. Ingresando arriba un dato y seleccionando el bit sobre el que se desea trabajar si clickea sobre Probar BTF aparece una paleta donde se indica en que estado esta el bit seleccionado dentro del dato ingresado. El 2do. botón hace que el bit indicado pase a uno en el dato ingresado. Si el dato en el casillero ya tiene ese bit en alto la función no hace nada. El tercer botón se encarga del efecto análogo, haciendo que el bit seleccionado pase a bajo en caso de no estarlo y colocando el resultado en el mismo casillero de ingreso de datos.

Click aquí para descargarlo.

 

 

Autor: Pablo Canello