(Justo habia escrito todo esto, me gano Geo antes)
Bueno, eso que tenes ahi es una mala practica de programacion, intentar achicar todo reduciendo la legibilidad del codigo
Separemoslo
if((alarm1_minute == ((minute & 0x0F) + (minute >> 4) * 10)) && (alarm1_hour == ((hour & 0x0F) + (hour >> 4) * 10)) && (second == 0) && alarm1_status)
Dentro del IF tenes 3 condiciones unidos con ANDs, es decir las 3 se deben cumplir
(alarm1_minute == ((minute & 0x0F) + (minute >> 4) * 10))
(alarm1_hour == ((hour & 0x0F) + (hour >> 4) * 10))
alarm1_status
Vamos a analizar alguna...
Si el tiempo de los minutos lo tenes en BCD, es decir 4 bits por cada numero, y el minuto 24 se representa como 0x24 (observa que no es el valor decimal 24). Voy a usar este valor como ejemplo.
Entonces lo que hace esto es pasarlo de BCD a decimal
((minute & 0x0F) + (minute >> 4) * 10))
Primero saca las unidades, por eso hace la AND con 0xF, nuestro ejemplo quedaria 0x04 (4 decimal), y luego las decenas, la rota 4 veces dejando las decenas ocupando el lugar de las unidades, quedando en el ejemplo 0x02 o 2 decimal.
Pero tengo que armar el numero, por eso multiplica las decenas por 10, asi nuestro ejemplo queda en 20 y luego le suma las unidades, quedando 24.
Esto lo compara con lo guardado en minute.
Es decir.. convierte un numero expresado en BCD a un numero decimal, luego compara.
Si corresponde la hora, los minutos e imagino que el tercero es una flag de si esta activa la alarma o no, entonces activa el PIN_B3