Next more details about how the scrolling is done.
I came up with this simple scroller formula:
adrs = counter + pointer
'adrs' is the register which will read the address to fetch data from, 'counter' is a bit-counter which counts up from 0 to 4 (5 columns), and 'pointer' is the register which INCreases every so many frames. The program starts from zero, so 'counter' and 'pointer' are both zero in the first round, so the first Rows data for the 1st column will be fetched from the 1st address (0). What also must happen is let a small routine INCrease with one after 'counter' resets to zero, at that moment one frames is build (1 image = 1 character) and count that. The next round 'counter' will go to 1, and so 'adrs' will be also 1 because 'pointer' only INCreases each lets say 25 times (25 frames), so after 25 times 'pointer' INCreases with one, and then the first round will be: adrs = 0 + 1 = 1, the second round that will be 2, so you see the reading from the address is shifted one position to the left, because you INC. You can also scroll backwards, simply DEC the routine where 'pointer' is counted each 25 frames. Make the whole sequence run at a speed of about 25 msec, that will make the display refesh at 40 Hz. Here a few pictures of a scrolling an 'R' across the display:





Click here to see an animation (124kB), or click here to see an AVI movie (1MB)
As you can see, my webCAM (CAM was capturing at 30 fps btw) wasn't able to capture the 4th picture very well, at that moment it was just shifting left one position (the pointer INCreased at that moment) What you see are 10 EEPROM addresses filled with data like this:
.ESEG
table:
.db 0b00000000 ;address 0
.db 0b00000000 ;address 1
.db 0b00000000 ;address 2
.db 0b00000000 ;address 3
.db 0b00000000 ;address 4
.db 0b01111111 ;address 5
.db 0b00001001 ;address 6
.db 0b00011001 ;address 7
.db 0b00101001 ;address 8
.db 0b01000110 ;address 9
I did rotate the data 90 degrees in the EEPROM, so I can easely fetch the Rows data, each EEPROM address is one Row of data, so one character are 5 addresses (5 bytes) This Rows data is than set to PORTB of the ATtiny2313 when each column is active. If you are at the point that the 'R' is on-display, scroll it backwards, so that it looks like if the 'R' is shifted on and off the display, ofcourse you can do many tricks e.g. normal scrolling (western is leftways), backwards, up- and downwards, even diagonal in each direction, or you can make symbols, or icons which move while scrolling, the possibilities are almost endless.
How to get the full intensity from the displays ?
The scanning of the LEDs (dots) of the dotmatrix display takes 25 msec (40Hz refresh), so each LED is On for 5 msec (or Off when the data is '0'), because each column is On for 5 msec. One dot needs 10 mA of constant current, but when it goes on and off with a high speed, the intensity will decrease, so you need to put more current through the LEDs to have the same effect (same at 0Hz) Incresing the current can be done with transistors or a driver IC (like ULN2803, etc.) The dots have a duty-cycle of 20%, each LED is on for 20% of the total refresh time (Tref = 25 msec), so 5 msec On and 20 msec Off (see picure below):

But the On / Off time of each dot is 5 msec -> On for 5 msec, so thats only 5/1000th of a second! Now how much current is needed to have the same light-intensity ? Here the formula you can use:
I-led = T-tot / On-time * Normal Current
Where T-tot = the time from one rising edge to another.
On-time = the time that the LED is actually on.
Normal Current = the current the LED can handle at DC (continuesly on -> see datasheet dotmatrix display)
In this scroller project this will be:
The normal current = 10 mA per dot, the new current must be: 25 msec / 5 msec * 10 mA = 50 mA. So the current needs to be 5 times higher, for having the same LED intensity. The voltage over one dot Vf (forward LED voltage), will be average lower (PWM style of signal fed on each dot) For increasing the current, take a simple transistor like the BC327/BC337. The resistors have to be calculated (I didn't), because you can't only take a bare transistor, the basis-current of the transistor needs to be limited with a resistor, else the transistor will damage. Here a diagram which presents one dot:

You can also take a cheap transistor (BC337 and R's) instead of the ULN2003A if you really wanna go for low-cost, but the PCB (printed circuit board) will be a lot more difficult to fix (more tracks, cause each transistor has 3 wires), the advantage of the ULN2003A is that is can sink up to 500 mA max. The 74HC595 steers the colums (5 per dotmatrix display) via the ULN2003A current driver, the AVR the 7 rows (character data), you cannot take the i/o's of the AVR directly, because it can only source up to 20 mA per i/o, and the dot(s) need 50 mA each at this switching speed (40 Hz)
[back to top]