The I2C bus just isn't suited for that. Keep in mind that it was originally designed to work with everything located on one PCB, or at least in one chassis. It has been stretched (at one point, analog computer monitors used it for identification to the computer, so it worked over the video cable), but when it has the speeds were low, and it was using ...
If the power supply is clean enough, or if you can clean it up, you could try a pair of PCA9615 differential I2C drivers to make your connection less susceptible to noise.
Datasheet here, break-out board with RJ-45 connector here.
I don't know if this will work for you; I have never tried these myself, but I thought I'd mention these ICs from the makers-of.
You open the datasheet and look up possible device addresses and then look at schematics which of the device addresses it is set to.
Register address functions the as memory address, since the chip has no registers. Or all the register addresses contain memory. Which ever way you want to think it.
Welcome to real-time programming. There's an infinite number of things you can do: here's the three most popular:
Update the display out of an ISR that's fired off every 5ms by a timer. This is kind of cheating, using your interrupt controller as a rather poor RTOS.
Make an event-driven task loop (a "superloop"). This is a pretty good way to ...
Have a single counter generating an interrupt every 5 ms, and incrementing a counter.
Looking at your code, you may only need, for instance, a count of 24 to give you a 120 ms cycle. Obviously you can modify any of these numbers to suit.
Then have a function for each task, so left digit, right digit, middle digit, command temp sensor to read, read sensor.
#define ENABLE_PINS 0xFFFE
PM5CTL0 = ENABLE_PINS;
This writes all the other bits as 1. To clear a single bit, use PM5CTL0 &= ~LOCKLPM5;.
//config pins P1.6 SDA P1.7 SCL
P1SEL0 &= ~(BIT6 | BIT7);
P1SEL1 |= (BIT6 | BIT7);
As shown in table 6-21 of the datasheet, you need to set the bit in P1SEL0 and clear the bit in P1SEL1.