Methods to drive a multiplexed LCD with logic-level signals?
The technique I use is to drive the common wires through all eight combinations of high and low (I think I used the sequence 000 001 010 100 111 110 101 011, though I don't think it really matters) and, for each common wire phase, drive the segment wires in such a way as to make at least two of the three segments correct.  Which is to say, if C2..C0 are the common wires, and S2..S0 are the desired values of three segments which connect a particular segment wire to C2..C0, the output value should be high if (C2 xor S2)+(C1 xor S1)+(C0 xor S0) is at least 2.

As an example, suppose that one wants S0 to be dark and S1 and S2 to be light (so S2..S0 == 001).  The eight phases, drive state of the segment wires, and the resulting states of S2..S0, are as follows (for each segment, Y/N indicates whether it's energized; an asterisk will indicate whether it's the correct state):


Com Drv S2 S1 S0
000  0  N* N* N
001  0  N* N* Y*
010  1  Y  N  Y*
100  1  N* Y  Y*
111  1  N* N* N
110  1  N* N* Y*
101  0  Y  N  Y*
011  0  N* Y  Y*


Notice that each segment will be in the correct state 3/4 of the time.  The logic to generate the correct states is a little irksome, but to avoid bogging down my interrupt handler I compute the first four four output patterns when setting the display content, so my interrupt handler just has to output one of the four patterns, in regular or complemented form.

The only annoyance I've observed with this method is that at slower scan rates, changing the display content will sometimes cause 'ghosting' on segments which should be transparent in both the old and new values.  This occurs because the segment may have gone from being incorrectly energized on the fourth 'beat' one frame, to being incorrectly energized on the first beat of the next frame'; the two consecutive energized 'beats' cause the segment to momentarily become visibly opaque.  Avoiding this problem requires using a scan rate twice as fast as would otherwise be necessary to avoid flicker; to minimize power consumption, my application switches to a faster scan rate during active use, or a lower rate when it's showing a static screen.