When I write code for myself, I often write it using literate programming techniques. Briefly, literate programming recognizes that computer programs are meant to be read by both humans and computers. The idea is to write the code with enough explanatory information that the reasoning behind it will be apparent. There are two intended outputs using literate programming - a human readable version and the code itself. Click here to see a sample document for a program I wrote.
Of course, this form of documentation may not be what you want. I've worked with a number of customers and have supplied a variety of documents. Some are mostly text, some are mostly screenshots, some contain technical diagrams, etc. What is delivered is entirely dependent on your requirements.

