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).
Que es un bit y que es un byte
Sección titulada «Que es un bit y que es un byte»| Concepto | Definicion | En el PIC18 |
|---|---|---|
| Bit | La unidad minima: vale 0 o 1 | Cada pin, bandera o bit de un SFR |
| Byte | Grupo de 8 bits | Un registro (WREG, LATB, STATUS…) |
| Nibble | Medio byte = 4 bits | Un 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 0Valor: 1 1 0 0 0 0 1 1 → decimal 195, hex 0xC3Peso: 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.
Hexadecimal — por que lo usas
Sección titulada «Hexadecimal — por que lo usas»Escribir B'11000011' es largo; en hex un byte son solo 2 digitos (0xC3). Cada digito hex representa 4 bits (un nibble):
| Hex | Binario | Decimal |
|---|---|---|
| 0 | 0000 | 0 |
| 1 | 0001 | 1 |
| … | … | … |
| 9 | 1001 | 9 |
| A | 1010 | 10 |
| B | 1011 | 11 |
| C | 1100 | 12 |
| D | 1101 | 13 |
| E | 1110 | 14 |
| F | 1111 | 15 |
Tabla de conversion rapida (bytes utiles)
Sección titulada «Tabla de conversion rapida (bytes utiles)»| Decimal | Binario | Hex (0x) | Hex (sufijo H) | Uso tipico |
|---|---|---|---|---|
| 0 | 00000000 | 0x00 | 00H | Todo apagado |
| 1 | 00000001 | 0x01 | 01H | Solo bit 0 |
| 15 | 00001111 | 0x0F | 0FH | Nibble bajo completo |
| 240 | 11110000 | 0xF0 | F0H | Nibble alto completo |
| 170 | 10101010 | 0xAA | AAH | Patron alternado |
| 255 | 11111111 | 0xFF | FFH | Todos los bits en 1 |
Como convertir paso a paso
Sección titulada «Como convertir paso a paso»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. 0xC3 → C = 1100, 3 = 0011 → 11000011.
Binario → hex: agrupa de a 4 bits desde la derecha. 11000011 → 1100 + 0011 → 0xC3.
Decimal → hex: divide entre 16. Ejemplo: 195 ÷ 16 = 12 resto 3 → 0xC3 o C3H.
Notaciones hex equivalentes
Sección titulada «Notaciones hex equivalentes»El mismo byte puede escribirse de varias formas. Todas valen lo mismo:
| Estilo | Ejemplo | Uso tipico |
|---|---|---|
Prefijo 0x | 0x00, 0xFF, 0xC3 | Codigo MPASM, muchas herramientas |
| Sufijo H | 00H, FFH, C3H | Apuntes, informes, hojas de ejercicio |
| MPASM con h | 00h, 0FFh, 0C3h | Alternativa 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:
| Instruccion | Efecto | Ejemplo |
|---|---|---|
BSF | Pone el bit en 1 | BSF LATB, 0 → RB0 en alto |
BCF | Pone el bit en 0 | BCF TRISB, 0 → RB0 como salida |
BTFSS | Salta si el bit es 1 | BTFSS PORTB, 3 → lee boton |
BTFSC | Salta si el bit es 0 | BTFSC STATUS, Z → salta si Z=1 |
Ya lo viste en Arquitectura — SFR y Registros — GPIO:
; Configurar RB0 como salida y encender LEDBCF TRISB, 0 ; bit 0 de TRISB = 0 → salidaBSF LATB, 0 ; bit 0 de LATB = 1 → LED encendidoPara invertir un bit (toggle) sin leer el byte entero:
; Invertir RB0: si estaba en 1 pasa a 0 y viceversaMOVLW B'00000001' ; mascara solo bit 0XORWF LATB, F ; XOR bit a bit → invierte ese bitMascaras 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 — apagar o filtrar bits
Sección titulada «AND — apagar o filtrar bits»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, WANDLW B'11110000' ; 0xF0 — bits 4-7 pasan; 0-3 quedan en 0
; Apagar bits 4-7 de LATC sin tocar 0-3MOVLW B'00001111' ; mascara: conservar nibble bajoANDWF LATC, F ; bits altos → 0IOR (OR) — encender bits
Sección titulada «IOR (OR) — encender bits»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 1IORWF LATB, FEn MPASM la instruccion se escribe IORWF / IORLW.
XOR — invertir o comparar
Sección titulada «XOR — invertir o comparar»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 = 1BTFSS STATUS, ZGOTO no_es_cinco ; si contador != 5 → salta al destino; contador == 5 ...GOTO fin_cmpno_es_cinco: ; contador != 5 ...fin_cmp:Complemento (NOT)
Sección titulada «Complemento (NOT)»Invierte todos los bits del byte: 0 → 1, 1 → 0. En PIC18 con WREG:
MOVF LATB, WXORLW B'11111111' ; equivalente a NOT de W (0xFF)MOVWF temp ; temp = complemento de LATBO con COMF sobre un registro de archivo:
COMF temp, F ; temp = NOT tempRotaciones
Sección titulada «Rotaciones»Desplazan bits con o sin acarreo — la Practica 1 pide rotacion sin acarreo:
| Instruccion | Direccion | Que hace |
|---|---|---|
RLCF | Izquierda | MSB entra en C; bit que sale por la izquierda entra por la derecha (con acarreo) |
RRCF | Derecha | LSB entra en C; rotacion hacia la derecha |
RLNCF | Izquierda | Rota sin acarreo — el bit que sale vuelve por el otro extremo |
RRNCF | Derecha | Rota sin acarreo hacia la derecha |
Ejemplo — rotar temp a la izquierda sin acarreo:
RLNCF temp, FNibble alto y nibble bajo
Sección titulada «Nibble alto y nibble bajo»Muchos informes piden separar un byte en dos nibbles (util en displays, BCD, tablas):
; temp = 0xC3 → nibble_alto = 0xC0, nibble_bajo = 0x03MOVF temp, WANDLW B'11110000' ; 0xF0 — solo bits 7..4MOVWF nibble_alto
MOVF temp, WANDLW B'00001111' ; 0x0F — solo bits 3..0MOVWF nibble_bajoPara mover el nibble bajo al alto (shift de 4 posiciones):
SWAPF temp, F ; intercambia nibles alto ↔ bajo; o bien cuatro rotaciones con RLNCFOperaciones logicas y la Practica 1
Sección titulada «Operaciones logicas y la Practica 1»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 WMOVF PORTB, WANDLW B'00001111' ; W = PORTB AND 0x0F
; OR entre LATC y WMOVLW B'10000000'IORWF LATC, F ; LATC = LATC OR W
; XOR entre temp y WMOVLW B'10101010'XORWF temp, FRelacion 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 completoO bit a bit (mas claro en aprendizaje, mas largo en codigo):
; Salidas RB0-RB3BCF TRISB, 0BCF TRISB, 1BCF TRISB, 2BCF TRISB, 3; Entradas RB4-RB7BSF TRISB, 4BSF TRISB, 5BSF TRISB, 6BSF TRISB, 7Ejercicio · 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:
11000011→10000011= 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.
Errores comunes
Sección titulada «Errores comunes»- Confundir notacion:
0x0F= 0FH = 15, pero0xF0= F0H = 240 — el orden de los nibbles importa. - Bit vs pin: el bit 3 de
LATBes 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
PORTxpara salidas: escribeLATx(oBSF/BCFsobreLATx); lee entradas conPORTx. Ver Registros — PORT vs LAT. - Olvidar el sufijo
-LWvs-WF:ANDLWopera con literal →WREG;ANDWFopera con registro →WREGo el registro (F).
Preguntas tipo parcial
Sección titulada «Preguntas tipo parcial»¿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.
Bits y hexadecimal
Basado en: Clase Tema 2 y 3 (1).pdf
0 de 0 respondidas
Inicia sesion en CALETAS para sincronizar este resultado entre dispositivos.
Iniciar sesion en CALETAS