A fast PCD8544 library (Nokia 5110)

That's right, you don't have to manipulate Pin 10. I'm not sure what library you are using for the SD card, but as far as I can remember the default SD library in Arduino doesn't need you to manipulate its pin either.

Regarding the character problems, that sounds to me like a biasing problem, or perhaps contrast.
I sort of adjusted the code to run well on my LCD, but different displays could be different and require other configuration to work properly.
This library allows you to supply your own configuration values to the display, this is 'low level' stuff, but as there are different kinds of displays, I felt that this more advanced option should be available to the user in cases like this.
There are two begin() functions, one which takes no parameters and it initializes the LCD with default values, and another which takes the configuration values from the users. This is how it's declared.

void begin(bool invert, uint8_t vop, uint8_t tempCoef, uint8_t bias);
  • Invert is a boolean value which lets you choose whether the display will show dark characters on light background (false, no-invert) or light characters on dark background (true, inverted). The default configuration is no-invert.
  • vop mainly controls the contrast of the display, usually the value range for this should be between 0xB0 and 0xBF (hexadecimal values). You can go a bit over that, but it isn't recommended and usually isn't needed. I found that my display works best with 0xB6 or 0xB7.
    *tempCoef stands for temperature coefficient. You probably shouldn't change it and leave it at the default value of 0x04.
    *bias (together with vop) controls the voltage level which powers the LCD itself (glass part, with the crystals). I found that on my display a value of 0x12 works the best, but from looking online I saw recommended values of 0x13 and 0x14.
    So what you have to do is "play" around with vop and bias to find a combination which works best for your display.
    What I'd suggest you to do is the following:
  1. Replace your "lcd.begin();" call with "lcd.begin(false, 0xB7, 0x04, 0x12);" and see if there's an improvement.
  2. If there is not try changing bias to 0x13 and/or to 0x14 and see if there is an improvement.
    I recommend you not to go over the values I mentioned to make sure you don't damage the LCD.
    VOP --> 0xB0 to 0xBF should be fine.
    BIAS --> 0x12 to 0x14 should be fine.
    Try a few combinations, and you will probably find the one which works best with your display.

Sorry for the long post, but I hope it helps you understand why this problem occurs and how sort it out.