My code is a progression of improvements and add ons. Once a code sort of works you dont want to start from scratch to make a new feature. I know that I am a BAD programer. My style is poor and I dont quite understand some key princiables. I tend to lump varriables into one line instead of the one line one colen. Having said that lets get to the code... line 30 defines the led width. any number greater than the total of all the columns will work. Less gives a wrinkle display at the transition column and afterward is way off. So change this to whatever amount of columns you have in your display. 43,51,66,64 ... line 31 defines a stillwidth used in menues to blank useless spaces. lines 32,33,34 set brightness or pulses for the pwm pin 13. Used only in dimming. Hi (254) and low(1) sets max,min. line 33 may need to be changed if the display flickers. line 155 is the 'letter[]' array stored into progmem. This saves a lot of memory but the values can NEVER change. I defined most letters and syombles that are to be used throught the code. I could skip all these and entered their values into the code instead of the actual letter. ex=eom is actually 63. Without the define, eom wont work and my code would have to be written as 63. a meaningless number. Next are varriables and arrays for display menues. The reader has 8 msg slots that hold 45 chr. The actual chr is one byte not the whole 5x5 chr. I have an automatic 'five' that counts each letter. So I store the starting place in the 'letter[]' and then count to five. This can store a message 45 spaces (45x5=225) using 45 bytes instead of 225 bytes. In DBASE they used goto to set up menues. Goto has fallen from grace and I sort of like it better that making long drawn out functions(). A function should be a fast, easy, reuseable, tool...not a chunk of code to run one concept. But I broke the code into FUNCTION() chunks. 326 is a display loop 352 fills msg with '*' and msg numbers 369 in the setup eemsgIn() loads msg with stored data. this happens only in reset or power applied. The eeprom has a defined read cycle and if I read the eeprom each display scan, The life would be about a week. So once at reset or when the user changes the msg. 720 is set order. This allows T time, D date, S stop, and 8 msg to be displayed in any order. Default is T,D,1,2,3,4,5,6,7,8. Use this feature to allow, ex. the clock, date, and msg5. This gives a display moving r-l time,date,msg5...repeat... This is very usefull in the u/d mode and the jump mode. 1077 is for push buttons. A2 reads voltage and sends out data to the menu. 1088 is the windows for this voltage. If you use 1.3k resistor ladder then these windows need to be changed. If 51k pullup resistor on A2 is not that value then you will need to change the window voltages too. My resistor ladder is all 1k and pullup 51k. (51k not 5.1k) sorry I got a whole reel for 3 bucks! 1157 is my clock refresh. This happens only when the loop is finished. If in a menu function this dosent happen. So the clock display can be off by 1.2 to 2 seconds. (who cares) 1214 is the display loop. here we count to 'ledWidth' (56) 1216 is a column 0 reset so you always start fresh from here 1226-1227 is the pulse that gets pushed into the 74hc595 column ics. in this case (56) 7each. The pulse stays on col0 then col1,col2...with the loop counter 'col' Then the row 595 is data is loaded and everything flashes with a latch pulse 1231. 1233 counts my chr in 'letter[]' five spaces. remember nextletter is just the starting index location inside of 'letter[]'. five counts automaticaly the rest of the letter[] index. 1237-1240 just looks for markers to blend the next message/time/date into the display. This is the order[] array. 1242 is the speed the display moves. This gave me the greatest fight. As with any multiplexing your eye is what allowes the display to be seen without flicker. you must compromise the intensity and speed to whatever the human eye can decern. If you run the loop once and stop your eye would see a flash of a display. So the loop must run several times with the same data to allow for reconition. then shift to the left one space and repeat. Slowing the loop down makes flickers on 20+ columns. On a 8x8 matrix almost any slow speed will do and the intensity will increase dramaticaly. This is how real reader boards work. They combine 8x8 matrix together instead of running down the length of the display. But then they have to deal with having 8+ micros sharing data and timing so each 8x8 matrix is in synk. My future endevers with this is to allow the user to create their own screen, save the screen to the eeprom. to save mode setup to eeprom as well as speed so when you get that perfect display running just right the power failure dosent loose the setup. I would like a reverse flashing display mode too.