I was so impatient to try the suggestions made that I took the rest of the day off.
Below is the modified code. I added another digit in hopes that the change might reveal the problem...
Code:
#CONFIG
__config _CONFIG1, _INTRC_IO & _WDT_OFF & _PWRTE_OFF & _MCLR_ON & _BODEN_OFF & _LVP_OFF & _CPD_OFF & _WRT_PROTECT_OFF & _DEBUG_OFF
__config _CONFIG2, _FCMEN_OFF & _IESO_OFF
#ENDCONFIG
OSCCON = %01110000 'SET OSC OPTIONS
DEFINE OSC 8
ANSEL = %00000011 'SET ANALOG TO DIGITAL
TRISA = %00000000 'SET PORTS OUTPUT
TRISB = %00000000
SDA VAR PORTB.1
SCL VAR PORTB.4
OUTP VAR BYTE
LP VAR BYTE
CHP100 VAR BYTE
CHP010 VAR BYTE
CHP001 VAR BYTE
CHP100 = $74
CHP010 = $72
CHP001 = $78
mainloop:
FOR LP = 0 TO 9
READ LP, OUTP
I2CWRITE SDA, SCL, CHP001, CHP001, OUTP 'WRITE 1's
PAUSE 250
I2CWRITE SDA, SCL, CHP010, CHP010, OUTP 'WRITE 10's
PAUSE 250
I2CWRITE SDA, SCL, CHP100, CHP100, OUTP 'WRITE 100's
PAUSE 250
NEXT LP
Goto mainloop 'LOGICAL END
DATA 63, 6, 91, 79, 102, 109, 124, 7, 127, 103
End
I think there is some progress in that now, at least, each digit will work independently. Applying power with all three modules plugged in, one (random) will work. Pulling the functioning digit, one of the others begins to cycle. Regardless of which digit I remove, one will always work; the others do not. It doesn't matter which spot they occupy - as long as they have a valid address.
In addition, I tried changing the value of the I2C resistors: 3K3, 4K7, 10K0 - no change in function. The circuit is run from adequate supply and is well filtered...
I still don't understand the "control" byte well, but RTFM indicates the class should match the fixed part of the address (MSBs) and the LSB should be zero; the addresses satisfy those requirements and beyond that I don't understand well enough to make an intelligent correction.
Bookmarks