Code:
'****************************************************************
' SIMPLE 15X8 LED MATRIX SCROLLING EXAMPLE
' 16F877A External 8MHz Xtal Osc
' LED Matrix columns are conected to PORTC pin rc0 via ULN2004AN and CD4017.
' RC1 reset for 4017
' LED Matrix rows conected to PORTB via 100 ohm resistors
' RB0 - top row
' Author: Muamer Halilovic
' www.mtskola.com
' today
'***************************************************************************************
Device 16F877A
Xtal 8
TRISB = %00000000
TRISC = %10000000
TRISD = %00000000
PORTB=0
PORTC=0
PORTD=0
All_Digital = True
EWrite 0,[%00000100,%00000110,%01111111,%00000110,%00000100] 'Up Arrow
EWrite 5,[%00010000,%00110000,%01111111,%00110000,%00010000] 'Dn Arrow
EWrite 10,[%01111110,%00010001,%00010001,%00010001,%01111110] 'A
EWrite 15,[%01111111,%01001001,%01001001,%01001001,%00110110] 'B
EWrite 20,[%00111110,%01000001,%01000001,%01000001,%00100010] 'C
EWrite 25,[%01111111,%01000001,%01000001,%00100010,%00011100] 'D
EWrite 30,[%01111111,%01001001,%01001001,%01001001,%01000001] 'E
EWrite 35,[%01111111,%00001001,%00001001,%00001001,%00000001] 'F
EWrite 40,[%00111110,%01000001,%01001001,%01001001,%01111010] 'G
EWrite 45,[%01111111,%00001000,%00001000,%00001000,%01111111] 'H
EWrite 50,[%00000000,%01000001,%01111111,%01000001,%00000000] 'I
EWrite 55,[%00100000,%01000000,%01000001,%00111111,%00000001] 'J
EWrite 60,[%01111111,%00001000,%00010100,%00100010,%01000001] 'K
EWrite 65,[%01111111,%01000000,%01000000,%01000000,%01000000] 'L
EWrite 70,[%01111111,%00000010,%00000110,%00000010,%01111111] 'M
EWrite 75,[%01111111,%00000100,%00001000,%00010000,%01111111] 'N
EWrite 80,[%00111110,%01000001,%01000001,%01000001,%00111110] 'O
EWrite 85,[%01111111,%00001001,%00001001,%00001001,%00000110] 'P
EWrite 90,[%01111111,%00001001,%00011001,%00101001,%01000110] 'R
EWrite 95,[%01000110,%01001001,%01001001,%01001001,%00110001] 'S
EWrite 100,[%00000001,%00000001,%01111111,%00000001,%00000001] 'T
EWrite 105,[%00111111,%01000000,%01000000,%01000000,%00111111] 'U
EWrite 110,[%00011111,%00100000,%01000000,%00100000,%00011111] 'V
'________________________________________________________________
'Deklaracija promjenjivih
'________________________________________________________________
Dim kolona As Byte
Dim brojac As Byte
Dim k As Byte
Dim scan As Byte
Dim scroll As Byte
leddata var Byte[100]
Dim ir_ulaz As Word ' WORD variabla za zaprimanje podataka
Dim EEpromAdress As Byte 'eprom adresa za upis
Dim test As Word 'uporedjivach
Dim upisi As ir_ulaz.LowByte
Dim i As Byte
Dim sledeceslovo As Word
Dim prethodnoslovo As Word
Dim potvrdi As Word
Dim kraj As Word
Dim x As Byte
Dim j As Byte
Dim cnt As Byte
'________________________________________________________________
'poetene vrijednosti
'________________________________________________________________
EEpromAdress = 255
cnt=0
k=109
j=0
'________________________________________________________________
'Inicijalizacija
'________________________________________________________________
High PORTD.0
DelayMS 1300
Low PORTD.0
DelayMS 1300
'________________________________________________________________
'pregledaj eeprom ako ima sta idi na main ako ne idi na pripremu
'________________________________________________________________
provjera:
test.LowByte = ERead EEpromAdress 'iscitaj zapis iz eeproma sa adrese 255
If test.LowByte = $FF Then 'ako je FF pici dalje
GoSub eepromprogON
DelayMS 1000
EndIf
test.LowByte = ERead 255
If test.LowByte <> $FF Then
GoSub odaberporuku
DelayMS 1000
EndIf
'*******************************************************************
Declare RC5In_Pin PORTC.7 'infrared sensor pin
'********************************************************************
main:
Clear
Low PORTD.0
j=0
leddata[0-13] = $00
For i = 0 To 4
k=115
leddata [i+14]=ERead k+i 'B
leddata [19]=$00
leddata [i+20]=ERead k+i+6 'B
leddata [25]=$00
leddata [i+26]=ERead k+i+12 'B
leddata [31]=$00
leddata [i+32]=ERead k+i+18 'B
Next
For scroll = 0 To 37 '
For scan = 0 To 50
PORTC.1 = 1 'reseting 4017
PORTC.1 =0
For kolona = 0 To 14
PORTC.0 = 1 'clock 4017
PORTC.0 =0
PORTB = leddata[kolona]
DelayUS 150
PORTB=0
Next
Next
For brojac = 0 To 36
leddata[brojac]=leddata[brojac+1]
Next
Next
GoTo main
eepromprogON:
High PORTD.0
Repeat
ir_ulaz.LowByte= RC5In ' Primanje signala sa TSOP1738
Until upisi<> 255' Trazi-cekaj dok ne naleti valjano zaglavlje signala
EWrite EEpromAdress , [ ir_ulaz.LowByte ]
sledeceslovo.LowByte = ERead EEpromAdress
Low PORTD.0
DelayMS 100
High PORTD.0
DelayMS 100
Low PORTD.0
DelayMS 100
High PORTD.0
Repeat
ir_ulaz.LowByte= RC5In ' Primanje signala sa TSOP1738
Until upisi<> 255' Trazi-cekaj dok ne naleti valjano zaglavlje signala
EEpromAdress=EEpromAdress - 1
EWrite EEpromAdress , [ ir_ulaz.LowByte ]
prethodnoslovo.LowByte = ERead EEpromAdress
Low PORTD.0
DelayMS 100
High PORTD.0
DelayMS 100
Low PORTD.0
DelayMS 100
High PORTD.0
Repeat
ir_ulaz.LowByte= RC5In ' Primanje signala sa TSOP1738
Until upisi<> 255' Trazi-cekaj dok ne naleti valjano zaglavlje signala
EEpromAdress=EEpromAdress - 1
EWrite EEpromAdress , [ ir_ulaz.LowByte ]
kraj.LowByte = ERead EEpromAdress
Low PORTD.0
DelayMS 100
High PORTD.0
DelayMS 100
Low PORTD.0
DelayMS 100
High PORTD.0
Repeat
ir_ulaz.LowByte= RC5In ' Primanje signala sa TSOP1738
Until upisi<> 255' Trazi-cekaj dok ne naleti valjano zaglavlje signala
EEpromAdress=EEpromAdress -1
EWrite EEpromAdress , [ ir_ulaz.LowByte ]
potvrdi.LowByte = ERead EEpromAdress
For x=0 To 5
Toggle PORTD.0
DelayMS 100
x=x+1
Next
x=0
EEpromAdress=0
Return
odaberporuku:
High PORTD.0
While ir_ulaz.LowByte<>kraj.LowByte
Repeat
ir_ulaz.LowByte= RC5In ' Primanje signala sa TSOP1738
Until upisi<> 255' Trazi-cekaj dok ne naleti valjano zaglavlje signala
If ir_ulaz.LowByte=sledeceslovo.LowByte Then
For i = 0 To 4
leddata [i]=ERead i+cnt '
Next
For scan = 0 To 185
PORTC.1 = 1 'reseting 4017
PORTC.1 =0
For kolona = 0 To 4
PORTC.0 = 1 'clock 4017
PORTC.0 =0
PORTB = leddata[kolona]
DelayUS 500
PORTB=0
Next
Next
If cnt=115 Then
cnt=0
EndIf
cnt=cnt+5
' j=j+1
ElseIf ir_ulaz.LowByte=prethodnoslovo.LowByte Then
cnt=cnt-5
For i = 0 To 4
leddata [i]=ERead i+cnt '
Next
For scan = 0 To 185
PORTC.1 = 1 'reseting 4017
PORTC.1 =0
For kolona = 0 To 4
PORTC.0 = 1 'clock 4017
PORTC.0 =0
PORTB = leddata[kolona]
DelayUS 500
PORTB=0
Next
Next
If cnt=0 Then
cnt=115
EndIf
' j=j+1
'zapamti slovo u eeprom na lokaciji 115 pa nadalje!
ElseIf ir_ulaz.LowByte=potvrdi.LowByte Then
k=k+6
For i = 0 To 4
leddata [i]=ERead i+cnt '
Next
For i = 0 To 4
EWrite (i+k),[leddata [i]] '
DelayMS 20
Next
Low PORTD.0
DelayMS 200
High PORTD.0
' j=j+1
'elseIf ir_ulaz.LowByte=kraj.lowbyte and j<>0 Then GoTo main
EndIf
Wend
'goto main
Return
End
as for the schematic i just used cd4017 datasheet section for cascading columns, the clock is portc.0 pin and the reset is portc.1 pin, as you can see i am working on a protoboard so i dont have a full schematic. This fun project is in development and probably wont be finished for long so i cant ofer a PCB design
Bookmarks