Ummm... no, eso no vale, te pondre unos ejemplos de por que:
Como aclaración, aunque supongo que ya lo sabes:
"PORTC |= hour" es lo mismo que "PORTC = PORTC | hour"
Teniendo en cuenta esto, ahora pasare a darle unos valores al puerto seguidos y veremos lo que ocurre haciendolo como lo haces:
Código:
PORTC = 0; Le doy al puerto entero un valor de 0 para inicializarlo y ver que ocurre con los siguientes cambios
PORTC |= 1; -> resultado = B00000001 -> Esto en binario es un 1
PORTC |= 2; -> resultado = B00000011 -> Esto en binario no es 2, es un 3! Como el OR no vale para introducir 0s el valor no es correcto!
PORTC |= 3; -> resultado = B00000011 -> Esto en binario es un 3, correcto.
PORTC |= 4; -> resultado = B00000111 -> Esto en binario es un 7!! Mismo caso que con el 2
Como ves, haciendo un OR nunca vas a conseguir eliminar los 1 del puerto, por ejemplo en el ultimo caso el valor que tu deseas obtener en dicho puerto es B00000100 (un 4), pero como realizas una operacion OR con el valor anterior que es B00000011 (un 3) lo que obtienes al final es B00000111 (Un 7).
B00000011
B00000100
B00000111
Por tanto si lo quieres hacer bien necesitas si o si hacerte una mascara que primero te limpie los bit 0 a 3 y seguidamente te ponga en dichas posiciones el valor de tu variable hour.
Código:
PORTC = ( PORTC & B11110000 ) | hour
... o mejor esta otra, pues si hour tuviese un valor superior a 15 por alguna razon (B00001111 --> 15) sobreescribirias el 5 bit y la liamos (B000
11111 --> 16)
Código:
PORTC = ( PORTC & B11110000 ) | (hour & B00001111)
Haciendo esto nos aseguramos de que incluso aunque nos equivoquemos al programar no tocamos ningun pin que no debamos.
Por cierto, como extra. En el arduino nano los bit 0 y 1 del PORTD son los bit del RX y TX de tu arduino, por tanto mucho ojo al escribir variables directamente sobre ese puerto, pues probablemente interfieras con la comunicacion del arduino con el PC ya que son los pines utilizados en la interfaz usb.
Si quieres utilizar el PORTD para algo debes utilizar los pines 2 a 7 y para no interferir deberías aplicar esta mascara:
Código:
PORTD = (PORTD & B00000011) | (hour << 2);
Que basicamente lo que hace es dejar los bit 0 y 1 como estaban y luego ponerle a los bit 2 a 7 el contenido de la variable hour. El << sirve para correr los bits de la variable hour hacia la izquierda de forma que no sobreescribas los bit 0 y 1 con el contenido.