Ir al contenido

Bits, bytes, hexadecimal y mascaras

En el PIC18F4550 casi todo se configura modificando bits individuales dentro de registros de 8 bits (un byte: 2⁸ = 256 estados, del 0 al 255). Si necesitas repasar la idea de digitales, empieza por Que significa 8 bits.

Esta pagina complementa Arquitectura basica y Registros principales: alli viste que son WREG, STATUS y los SFR; aqui aprendes como leer, escribir y enmascarar bits en ensamblador.

Dominar binario, hexadecimal y mascaras es indispensable para el parcial y para las practicas de laboratorio (especialmente la Practica 1, que exige rutinas logicas con la ALU).

ConceptoDefinicionEn el PIC18
BitLa unidad minima: vale 0 o 1Cada pin, bandera o bit de un SFR
ByteGrupo de 8 bitsUn registro (WREG, LATB, STATUS…)
NibbleMedio byte = 4 bitsUn digito hex (0–F) o nibble alto/bajo

Los bits se numeran del 0 al 7. El bit 0 es el LSB (menos significativo); el bit 7 es el MSB (mas significativo):

Bit: 7 6 5 4 3 2 1 0
Valor: 1 1 0 0 0 0 1 1 → decimal 195, hex 0xC3
Peso: 128 64 32 16 8 4 2 1 (potencias de 2)

Para calcular el decimal: suma los pesos donde el bit vale 1. En el ejemplo: 128 + 64 + 2 + 1 = 195.

Escribir B'11000011' es largo; en hex un byte son solo 2 digitos (0xC3). Cada digito hex representa 4 bits (un nibble):

HexBinarioDecimal
000000
100011
910019
A101010
B101111
C110012
D110113
E111014
F111115
DecimalBinarioHex (0x)Hex (sufijo H)Uso tipico
0000000000x0000HTodo apagado
1000000010x0101HSolo bit 0
15000011110x0F0FHNibble bajo completo
240111100000xF0F0HNibble alto completo
170101010100xAAAAHPatron alternado
255111111110xFFFFHTodos los bits en 1

Decimal → binario: divide entre 2 y lee los restos de abajo hacia arriba, o resta potencias de 2 (128, 64, 32…).

Hex → binario: cada digito hex se expande a 4 bits. 0xC3C = 1100, 3 = 001111000011.

Binario → hex: agrupa de a 4 bits desde la derecha. 110000111100 + 00110xC3.

Decimal → hex: divide entre 16. Ejemplo: 195 ÷ 16 = 12 resto 3 → 0xC3 o C3H.

El mismo byte puede escribirse de varias formas. Todas valen lo mismo:

EstiloEjemploUso tipico
Prefijo 0x0x00, 0xFF, 0xC3Codigo MPASM, muchas herramientas
Sufijo H00H, FFH, C3HApuntes, informes, hojas de ejercicio
MPASM con h00h, 0FFh, 0C3hAlternativa valida en el .ASM

Regla del sufijo H: los digitos son hex; la H al final indica base 16. 00H = cero; 0FH = 15; F0H = 240. No confundas 0FH (15) con F0H (240).

Un bit concreto — encender, apagar, invertir

Sección titulada «Un bit concreto — encender, apagar, invertir»

Cuando solo quieres cambiar un bit de un SFR sin tocar los demas, usa instrucciones de bit:

InstruccionEfectoEjemplo
BSFPone el bit en 1BSF LATB, 0 → RB0 en alto
BCFPone el bit en 0BCF TRISB, 0 → RB0 como salida
BTFSSSalta si el bit es 1BTFSS PORTB, 3 → lee boton
BTFSCSalta si el bit es 0BTFSC STATUS, Z → salta si Z=1

Ya lo viste en Arquitectura — SFR y Registros — GPIO:

; Configurar RB0 como salida y encender LED
BCF TRISB, 0 ; bit 0 de TRISB = 0 → salida
BSF LATB, 0 ; bit 0 de LATB = 1 → LED encendido

Para invertir un bit (toggle) sin leer el byte entero:

; Invertir RB0: si estaba en 1 pasa a 0 y viceversa
MOVLW B'00000001' ; mascara solo bit 0
XORWF LATB, F ; XOR bit a bit → invierte ese bit

Mascaras de bits — modificar varios bits a la vez

Sección titulada «Mascaras de bits — modificar varios bits a la vez»

Una mascara es un patron de bits que indica que posiciones quieres afectar. Las operaciones logicas de la ALU aplican la mascara bit a bit sobre WREG y otro operando.

AND deja en 1 solo donde ambos operandos tienen 1. Sirve para enmascarar (quedarte con ciertos bits) o apagar bits poniendo 0 en la mascara:

; Leer solo el nibble alto de PORTB (bits 7..4)
MOVF PORTB, W
ANDLW B'11110000' ; 0xF0 — bits 4-7 pasan; 0-3 quedan en 0
; Apagar bits 4-7 de LATC sin tocar 0-3
MOVLW B'00001111' ; mascara: conservar nibble bajo
ANDWF LATC, F ; bits altos → 0

IOR pone en 1 donde cualquiera de los operandos tiene 1. Sirve para prender bits sin apagar los demas:

; Encender bits 0 y 3 de LATB (resto intacto)
MOVLW B'00001001' ; bits 0 y 3 en 1
IORWF LATB, F

En MPASM la instruccion se escribe IORWF / IORLW.

XOR da 1 donde los bits differen. Usos:

  • Toggle de bits seleccionados (ver arriba).
  • Comparar si dos valores son iguales (resultado 0 → bandera Z = 1 en STATUS).
MOVLW D'5'
XORWF contador, W ; si contador == 5 → W = 0 → Z = 1
BTFSS STATUS, Z
GOTO no_es_cinco ; si contador != 5 → salta al destino
; contador == 5 ...
GOTO fin_cmp
no_es_cinco:
; contador != 5 ...
fin_cmp:

Invierte todos los bits del byte: 01, 10. En PIC18 con WREG:

MOVF LATB, W
XORLW B'11111111' ; equivalente a NOT de W (0xFF)
MOVWF temp ; temp = complemento de LATB

O con COMF sobre un registro de archivo:

COMF temp, F ; temp = NOT temp

Desplazan bits con o sin acarreo — la Practica 1 pide rotacion sin acarreo:

InstruccionDireccionQue hace
RLCFIzquierdaMSB entra en C; bit que sale por la izquierda entra por la derecha (con acarreo)
RRCFDerechaLSB entra en C; rotacion hacia la derecha
RLNCFIzquierdaRota sin acarreo — el bit que sale vuelve por el otro extremo
RRNCFDerechaRota sin acarreo hacia la derecha

Ejemplo — rotar temp a la izquierda sin acarreo:

RLNCF temp, F

Muchos informes piden separar un byte en dos nibbles (util en displays, BCD, tablas):

; temp = 0xC3 → nibble_alto = 0xC0, nibble_bajo = 0x03
MOVF temp, W
ANDLW B'11110000' ; 0xF0 — solo bits 7..4
MOVWF nibble_alto
MOVF temp, W
ANDLW B'00001111' ; 0x0F — solo bits 3..0
MOVWF nibble_bajo

Para mover el nibble bajo al alto (shift de 4 posiciones):

SWAPF temp, F ; intercambia nibles alto ↔ bajo
; o bien cuatro rotaciones con RLNCF

El laboratorio UNEXPO exige rutinas de software para suma, resta, multiplicacion, division, mas OR, AND, XOR, complemento y rotacion usando la ALU del PIC18. Las logicas pasan casi siempre por WREG:

; AND entre PORTB y una mascara en W
MOVF PORTB, W
ANDLW B'00001111' ; W = PORTB AND 0x0F
; OR entre LATC y W
MOVLW B'10000000'
IORWF LATC, F ; LATC = LATC OR W
; XOR entre temp y W
MOVLW B'10101010'
XORWF temp, F

Relacion con Arquitectura — STATUS: despues de AND, OR o XOR, revisa Z (¿resultado cero?) y N (signo del bit 7).

Ejemplo integrado — configurar varios pines

Sección titulada «Ejemplo integrado — configurar varios pines»

Quieres RB0–RB3 como salidas y RB4–RB7 como entradas en un solo paso (mascara sobre TRISB: 1 = entrada):

MOVLW B'11110000' ; bits 4-7 = 1 (entrada); 0-3 = 0 (salida)
MOVWF TRISB ; escribe el byte completo

O bit a bit (mas claro en aprendizaje, mas largo en codigo):

; Salidas RB0-RB3
BCF TRISB, 0
BCF TRISB, 1
BCF TRISB, 2
BCF TRISB, 3
; Entradas RB4-RB7
BSF TRISB, 4
BSF TRISB, 5
BSF TRISB, 6
BSF TRISB, 7

Ejercicio · Parcial

Convierte 0xC3 a binario y explica BCF

0xC3 = 11000011 (decimal 195). Bits activos: 0, 1, 6 y 7.

Si PORTB valia 0xC3 y ejecutas BCF PORTB, 6:

  • Solo el bit 6 pasa a 0; los demas no cambian.
  • Resultado: 1100001110000011 = 0xC3 con bit 6 apagado = 0x83 (decimal 131).

¿Por que conviene BCF en vez de escribir todo PORTB? Porque no arriesgas modificar pines que no querias tocar.

  • Confundir notacion: 0x0F = 0FH = 15, pero 0xF0 = F0H = 240 — el orden de los nibbles importa.
  • Bit vs pin: el bit 3 de LATB es el pin RB3; la numeracion empieza en 0.
  • AND vs OR: AND apaga bits donde la mascara es 0; OR enciende bits donde la mascara es 1.
  • Mascara invertida en TRIS: en TRISx, 1 = entrada y 0 = salida — al disenar mascaras, piensa en que significa cada bit.
  • Escribir PORTx para salidas: escribe LATx (o BSF/BCF sobre LATx); lee entradas con PORTx. Ver Registros — PORT vs LAT.
  • Olvidar el sufijo -LW vs -WF: ANDLW opera con literal → WREG; ANDWF opera con registro → WREG o el registro (F).

¿Cuantos valores distintos representa un byte sin signo?

256 valores, del 0 al 255 (2⁸ combinaciones).

¿Que hace ANDLW 0x0F despues de MOVF PORTB, W?

Deja en WREG solo el nibble bajo de PORTB; los bits 4–7 quedan en 0.

¿Para que sirve una mascara con OR?

Para encender bits concretos sin apagar los que ya estaban en 1.

¿Como sabes si dos bytes son iguales usando XOR?

XORWF entre ellos; si el resultado es 0, la bandera Z de STATUS queda en 1.

Examen interactivo

Bits y hexadecimal

Basado en: Clase Tema 2 y 3 (1).pdf

0 de 0 respondidas

El valor hexadecimal 0x0F en binario es:
Para encender bits concretos sin apagar los que ya estan en 1 usas una operacion...
Un registro de 8 bits puede representar cuantos valores sin signo distintos?
El valor hexadecimal 0xC3 en binario es:
Despues de MOVF PORTB,W y ANDLW 0x0F, WREG contiene:
LATB vale 0xC3. Ejecutas BCF LATB, 6. LATB queda en:
Para encender SOLO el bit 0 de LATB sin tocar los demas, la instruccion mas directa es:
XORWF entre dos bytes iguales deja la bandera Z de STATUS en:
La instruccion SWAPF sobre un byte:
En TRISB, escribir MOVLW B'11110000' y MOVWF TRISB configura: