PDA

View Full Version : how to scroll text smoothly on 5x7 display? (no shift registers)



CuriousOne
- 10th June 2014, 05:40
Hello.

I have 16F876 and 5x7 pixel led display. Rows of display are connected to PORTB.1-7 and columns to PORTC.1-5.

I wrote a simple multiplex program which displays static character on display. However, I want to scroll some text on display, from right to left, via 1 pixel increments. All code examples I've found, use HC595 or similar to wire the led display, so code is based on SHIFTOUT. Since I'm not using such register, I have no way to shift out something.

Any ideas?

Amoque
- 11th June 2014, 04:36
This is some code I used some time ago for a single 5x7 display marquee - or maybe I only used 5x5... To be honest, I don't remember where I left it - working or not, or what exactly it was doing. Its a starting point... no guarantees. Happy to answer questions if I still can.





MSG VAR BYTE [26]
Row var byte [6]
Col var byte
SPD VAR WORD
LTR VAR BYTE
LTRCOL VAR BYTE
POS VAR BYTE
LP VAR BYTE
TRISB=0 'PORTB AS OUTPUT
TRISD=0 'PORTD AS OUTPUT
LTRCOL=0:pos=0

'HARD CODE TEST MESSAGE
MSG[0]= "P":MSG[1]= "R":MSG[2]= "E":MSG[3]= "S":MSG[4]= "S":MSG[5]= " "
MSG[6]= "M":MSG[7]= "E":MSG[8]= " ":MSG[9]= " ":MSG[10]= " ":MSG[11]= " "
MSG[12]= " ":MSG[13]= "P":MSG[14]= "R":MSG[15]= "E":MSG[16]= "S":MSG[17]= "S"
MSG[18]= " ":MSG[19]= "M":MSG[20]= "E":MSG[21]= " ":MSG[22]= " ":MSG[23]= " "
MSG[24]= " ":MSG[25]= " "

Looper: 'START MAIN LOOP

FOR SPD=0 TO 300 'SPEED LOOP SETS TIME STATIC COLUMS ARE DRAWN
FOR COL=1 TO 5 'COL LOOP MULTIPLEXES COLUMNS; EACH COL IN TURN, ROW VALS AS BYTE
PORTD=255 'TURN OFF ALL COLUMNS
PORTB=ROW[col] 'SET ROWS VAL [BINARY 0=ON, 1=OFF]
SELECT CASE COL 'CASE TURNS ON COLUMNS AFTER ROW VAL LOADED
CASE 1: portD.1 =0
CASE 2: portD.2 =0
CASE 3: portD.3 =0
CASE 4: portD.4 =0
CASE 5: portD.5 =0
END SELECT
NEXT COL 'NEXT COLUMN
NEXT SPD 'MULTIPLEX COLUMNS AGAIN
LOOKDOWN msg[pos],["ABCDEFGHIJKLMNOPQRSTUVWXYZ* "],LTR 'FIND POSITION OF EACH LETTER IN TURN
IF (POS =26) OR (LTR=26) THEN 'MAX STRING LENGTH... RESET TO REPEAT FROM ELEMENT 0
POS=0: GOTO LOOPER
ENDIF
READ (LTR*5)+LTRCOL, ROW[6] 'LTR= START OF 5 COL CODES IN DATA STATEMENTS; LTRCOL= NEXT COLUMN DATA-LOAD "OFF-SCREEN" TO SHIFT IN
LTRCOL=LTRCOL+1 '+1 FOR NEXT TIME -- TO GET NEXT COLUMN FOR SHIFT IN
iF LTRCOL=6 THEN 'IF LETTER IS DONE SHIFTING
LTRCOL=0: ROW[6]=255 :pos=pos+1 'LTR * 5 INCREMENTS, SO RESET COL COUNTER, ADD COL SPACE BETWEEN LETTERS, AND INCREMENT FOR NEXT STRING ELEMENT
ENDIF
'SHIFT COLUMNS LEFT
FOR COL=2 TO 6 'SHIFT COLUMNS LEFT 1 POSITION
ROW[COL-1]=ROW[COL]
NEXT COL
Goto Looper 'REPEAT MAIN LOOP

END

DATA $87,$EB,$EB,$EB,$87, $83,$AB,$AB,$AB,$D7, $C7,$BB,$BB,$BB,$BB 'ABC; HEX CODES: EACH COL IS HEX INTERPRETATION OF BINARY ON/OFF
DATA $83,$BB,$BB,$BB,$C7, $83,$AB,$AB,$AB,$AB, $83,$EB,$EB,$EB,$EB 'DEF; '0' FOR ON '1' FOR OFF; HEX FOR LESS TYPING!
DATA $C7,$BB,$BB,$EF,$8F, $83,$EF,$EF,$EF,$83, $BB,$BB,$83,$BB,$BB 'GHI
DATA $9F,$BF,$BF,$BF,$83, $83,$EF,$EF,$D7,$BB, $83,$BF,$BF,$BF,$9F 'JKL
DATA $83,$F7,$EF,$F7,$83, $83,$F7,$EF,$DF,$83, $C7,$BB,$BB,$BB,$C7 'MNO
DATA $83,$EB,$EB,$EB,$F7, $C7,$BB,$BB,$9B,$C7, $83,$EB,$EB,$CB,$B7 'PQR
DATA $A3,$AB,$AB,$AB,$8B, $FB,$FB,$83,$FB,$FB, $C3,$BF,$BF,$BF,$C3 'STU
DATA $F3,$CF,$BF,$CF,$F3, $E3,$9F,$E3,$9F,$E3, $BB,$D7,$EF,$D7,$BB 'VWX
DATA $E3,$EF,$8F,$EF,$E3, $9B,$AB,$AB,$AB,$B3, $FF,$FF,$FF,$FF,$FF 'YZ [SPC]