I have been able to display 2 different characters on the display now however I am still unsure on how to "push" new characters to the screen. In my code it is just a while loop switching between displaying the first digit and the second digit, preventing me from sending it a new character. I would like to be able to write a function that writes to the display and keeps it there until another command is set. I believe this is accomplished by threading a method to keep the screen 'alive' and send it an event(?) to update it. I haven't used events or threading before however so I'm not sure how to implement it yet so any help is appreciated.
Since characters currently don't "stick" you are doing multiplexing by looping while toggling between the two digits. Sure, you could do the multiplex loop in a thread but there's a good chance it will flicker depending on how much and what you do in your main thread. To get "sticky" characters, you'd have to use some kind of slave chip like the ones suggested some of the other guys earlier in this thread.
As for "pushing in" arbitrary characters, you could display other letters quite easily by simply reading them from an array of digits or something like that.
Consider creating a base class "Digit" for setting the GPIOs for any given character you wan't to display in either of the two 7-segment digits. The class could have a method called "Render()" that would set the GPIOs as necessary depending on which character the class instance represents.
You could then derive one sub class from "Digit" for each character that you need, i.e. among others, you would have sub classes DigitH, DigitI and Digit0...Digit9 and so forth overriding the Render method. You could then create and dictionary of Digit objects and simply index the array using the corresponding ASCII character taken from the string(s) that you want to display, i.e. "HI", "40" etc.
This software approach can be used regardless of whether or not you choose to use a slave chip.