'
' **********************************************
' * 64 x 16 LED matrix panel Control program *
'
' * interrupt by O-Family *
' **********************************************
'
'
Const Number_of_panel = 2 'Number of panels. (1-4)
Const Ledbuff_length = 64 'Number of horizontal axis byte. (Horizontal 32dots * Number of panel + Scroll buffer)
Const Ledbuf_size = 1024 'Capacity of LED buffer. (Horizontal 32bytes * Number of panels * Vertical 8dot + Scroll buffer)
Const Scrollb_size = 64
Const Ledbuff_size = 1025
Const Test = 1
'
$regfile = "m1284pdef.dat"
$crystal = 20000000
'
$hwstack = 128
$swstack = 128
$framesize = 128
'
' * Definition of port name *
'
Panel_abcd Alias Portd
Panel_rgb Alias Portb 'LED panel [R1,G1,B1,R2,G2,B2] -> [0,1,2,3,4,5 bit] Connection Port
Panel_a Alias Portd.7 'LED panel [A] Connection Port.Bit
Panel_a_p Alias Portd 'LED panel [A] Connection Port
Panel_a_b Alias 7 'LED panel [A] Connection Bit
Panel_b Alias Portd.6 'LED panel [B] Connection Port.Bit
Panel_b_p Alias Portd 'LED panel [B] Connection Port
Panel_b_b Alias 6 'LED panel [B] Connection Bit
Panel_c Alias Portd.5 'LED panel [C] Connection Port.Bit
Panel_c_p Alias Portd 'LED panel [C] Connection Port
Panel_c_b Alias 5 'LED panel [C] Connection Bit
Panel_d Alias Portd.4 'LED panel [D] Connection Port.Bit
Panel_d_p Alias Portd 'LED panel [D] Connection Port
Panel_d_b Alias 4 'LED panel [D] Connection Bit
Panel_clk Alias Portc.1 'LED panel [CLK] Connection Port.Bit
Panel_clk_p Alias Portc 'LED panel [CLK] Connection Port
Panel_clk_b Alias 1 'LED panel [CLK] Connection Bit
Panel_lat Alias Portc.0 'LED panel [LAT] Connection Port.Bit
Panel_lat_p Alias Portc 'LED panel [LAT] Connection Port
Panel_lat_b Alias 0 'LED panel [LAT] Connection Bit
Panel_oe Alias Portc.2 'LED panel [OE] Connection Port.Bit
Panel_oe_p Alias Portc 'LED panel [OE] Connection Port
Panel_oe_b Alias 2 'LED panel [OE] Connection Bit
'
' * Declaration of variable *
'
Dim V As Byte
Dim W As Word
Dim X As Word
Dim Y As Byte
'
Dim Ledbuff(ledbuff_size) As Byte 'DMA Data buffer. (Horizontal 32bytes * Number of panels * Vertical 8dot + Scroll bufferj
Dim Rowadr As Byte 'Row address counter. (0-7)
Dim Ledintf As Byte 'LED display interrupt generation flag.
Dim Transfer_length As Byte 'Number of bytes to be transferred to the LED buffer.
'
Dim Temp1 As Byte 'Temporary variable. (Byte)
'--------------------- LED panel general purpose routine -----------------------
'
Dim Ledtempw1 As Word , Ledtempw2 As Word
'Dim Ana As Double
Dim Xx As Byte
Dim Aa(8) As Byte
Dim Bb(32) As Byte
Dim Wa(32) As Byte
Dim Wwb(16) As Word At Bb() Overlay
Dim Wwa(16) As Word At Wa() Overlay
Dim Rr1(8)as Byte
Dim Rr2(8)as Byte
Dim Kar As String * 1
Dim Car As String * 10
Dim Dotsize As Byte '8 , 16 dots character
Dim Bb16(16) As Word
Dim Ab16(16) As Word
Declare Sub Get_chr(byval Karr As String * 1 , Byval Num As Byte)
Declare Sub Get_chr16(byval Karr16 As String * 1)
Declare Sub Rotate_chr
'Declare Sub Rotate_16 ' not finnished
Declare Sub Ledclear
Declare Sub Writebuff(byval Wx As Word)
'
' * Port initialization *
'
Config Portb.0 = Output
' Config Panel_rgb = Output 'LED panel [R1,G1,B1,R2,G2,B2] Connection Port.
Config Panel_a = Output 'LED panel [A] Connection Port.
Config Panel_b = Output 'LED panel [B] Connection Port.
Config Panel_c = Output 'LED panel [C] Connection Port.
Config Panel_d = Output
Config Panel_clk = Output 'LED panel [CLK] Connection Port.
Config Panel_lat = Output 'LED panel [LAT] Connection Port.
Config Panel_oe = Output 'LED panel [OE] Connection Port.
Set Panel_oe 'LED panel [OE] Port high.
'
' * Setting the Timer *
'
Config Timer2 = Pwm , Prescale = 64 , Clear Timer = 1 'Timer2 setting. 8,000,000Hz / 32 = 250,000Hz
Set Tccr2b.wgm22 'Fast PWM.
Compare2a = 125 - 1 '250,000Hz / 125count = 2,000Hz(500us)
Compare2b = 123 'Brightness value. (12-123)
On Compare2a Tint2a Nosave
Enable Compare2a
On Compare2b Tint2b Nosave
Enable Compare2b
'
#if Number_of_panel = 1
Transfer_length = 32 'Transfer the 32 bytes.
#endif
#if Number_of_panel = 2
Transfer_length = 64 'Transfer the 64 bytes.
#endif
#if Number_of_panel = 3
Transfer_length = 128 'Transfer the 96 bytes.
#endif
#if Number_of_panel = 4
Transfer_length = 128 'Transfer the 128 bytes.
#endif
'
Enable Interrupts
Compare2b = 12 'Set the brightness value.
Call Ledclear 'Clear the LED panelscreen.
Do
'Ledbuff(16) = &B10000000
Wait 1
X = 1
Car = "ABCDEFGHI"
Y = Len(car)
For Temp1 = 1 To Y
Kar = Mid(car , Temp1 , 1)
Call Get_chr(kar , 8)
Call Rotate_chr
Call Writebuff(x)
Wait 2
X = X + 7
Next
Wait 2
For Temp1 = 0 To 50
Gosub Ledscroll
Waitms 200
Next Temp1
Wait 2
Wait 2
Call Get_chr( "Z" , 8)
Call Rotate_chr
Call Writebuff(513)
Wait 2
Call Ledclear
Wait 2
Call Get_chr( "B" , 16)
Call Rotate_chr
Call Writebuff(1)
Call Get_chr( "6" , 16)
Call Rotate_chr
Call Writebuff(24)
Wait 2
Call Get_chr( "H" , 16)
Call Rotate_chr
Call Writebuff(36)
Wait 3
Call Ledclear
Car = Str(wwa(1) )
Xx = 1
Y = Len(car)
For Temp1 = 1 To Y
Kar = Mid(car , Temp1 , 1)
Call Get_chr(kar , 8)
Call Rotate_chr
Call Writebuff(xx)
Wait 2
Xx = Xx + 7
Next
Wait 8
Call Ledclear
Loop
End
'--------------------- LED panel general purpose routine -----------------------
Sub Writebuff(byval Wx As Word)
Local Yy As Byte
Local Vv As Byte
Local Ww As Word
Local Xx As Byte
Local Xj As Byte
Local Fj As Byte
Local Fz As Byte
Ww = Wx
Select Case Dotsize
Case 8
For Yy = 1 To 8
For Vv = 0 To 7
Select Case Aa(yy).vv
Case 1
Ledbuff(ww) = &B10000000
Case 0
Ledbuff(ww) = 1
End Select
Incr Ww
Next
Ww = Ww + 56
Next
Case 16
For Fj = 1 To 4
Select Case Fj
Case 1
Ww = Wx
Xx = 1
Xj = 8
Case 2
Ww = Wx + 8
Xx = 9
Xj = 16
Case 3
Ww = Wx + 512
Xx = 17
Xj = 24
Case 4
Ww = Wx + 512
Ww = Ww + 8
Xx = 25
Xj = 32
End Select
For Yy = Xx To Xj
For Vv = 0 To 7
Select Case Wa(yy).vv
Case 1
Ledbuff(ww) = &B10000000
Case 0
Ledbuff(ww) = 1
End Select
Incr Ww
Next
Ww = Ww + 56
Next
Next
End Select
End Sub
Sub Get_chr(byval Karr As String * 1 , Byval Num As Byte)
'--use local variables
Local Le As Word
Local Lf As Word
Local Lz As Byte
Dotsize = Num 'set character size global
Le = Asc(karr)
Le = Le - &H20
Select Case Num
Case 8
Shift Le , Left , 3
Le = Le + 3 '4 byte data header
Restore Font8x8S
For Lz = 1 To 8
Lf = Le + Lz
Bb(lz) = Lookup(lf , Font8x8s)
Next Lz
Case 16
Shift Le , Left , 5 '32 bytes per character
Le = Le + 3 '4 byte data header
Restore Font16x16s
For Lz = 1 To 32
Lf = Le + Lz
Bb(lz) = Lookup(lf , Font16x16s)
Next Lz
Case Else
End Select
End Sub
'================
' not working yet to be finnished later
Sub Rotate_16
Local J As Byte
Local X As Byte
Local N As Byte
Local P As Byte
Local Q As Byte
'==WWA 16 WORDS CONTAINS CHR
'==WWB 16 WORDS WRITE CHARACTER HERE
Q = Memcopy(wa(1) , Bb(1) , 32)
P = 15
'For J = 1 To 16
N = 0
J = 1
For X = 1 To 16
Wwb(x).p = Wwa(j).n
Incr N
Next X
Decr P
'Next
Q = Memcopy(bb(1) , Wa(1) , 32)
End Sub
'====================
Sub Rotate_chr
'--use local variables
Local Lj As Byte
Local Lx As Byte
Local Ln As Byte
Local Lp As Byte
Local Lq As Byte
Local Ly As Byte
Local Lm As Byte
'===== dotsize global is the size of the character
Select Case Dotsize
Case 8
'8x8
For Lj = 1 To 8
Ln = Lj - 1
For Lx = 1 To 8
Lp = Lx - 1
Aa(lj).lp = Bb(lx).ln
Next Lx
Next Lj
Case 16 '16x16
Lm = 1
For Ly = 1 To 32 Step 8
Lq = Memcopy(bb(ly) , Rr2(1) , 8)
For Lj = 1 To 8
Ln = Lj - 1
For Lx = 1 To 8
Lp = Lx - 1
Rr1(lj).lp = Rr2(lx).ln
Next Lx
Lq = Memcopy(rr1(1) , Wa(ly) , 8)
Next Lj
Next
End Select
End Sub
'
' * Scroll the horizontal axis 16dot *
'
Scroll:
For Temp1 = 0 To 50
Gosub Ledscroll
Waitms 200
Next Temp1
Return
Sub Ledclear
Local Clr As Byte
Local Lw As Byte
Clr = 1
Lw = Memcopy(clr , Ledbuff(1) , Ledbuff_size , 2)
End Sub
' O-Family
' ******************************
' * Scroll the horizontal axis *
' ******************************
'
Ledscroll: '1dot left scroll.
Ledtempw2 = Ledbuff_size - 1
For Ledtempw1 = 1 To Ledtempw2
Ledbuff(ledtempw1) = Ledbuff(ledtempw1 + 1)
Next Ledtempw1
Return
'
' ************************************
' * Timer2 Compare Match A interrupt *
' ************************************
'
$notransform On
'
$asm
Tint2a:
PUSH R2
IN R2,SREG
PUSH R0
PUSH R1
PUSH XL
PUSH XH
;
LDS XL,{rowadr}
LDI XH, Ledbuff_Length
MUL XH,XL
Loadadr Ledbuff(1) , X
ADD XL,R0
ADC XH,R1
;
LDS R0,{Transfer_Length}
Tint2a1:
LD R1,X+
Out Panel_rgb , R1
SBI Panel_clk_p, Panel_clk_b
CBI Panel_clk_p, Panel_clk_b
DEC R0
BRNE Tint2a1
;
LDS XL,{rowadr}
SBI Panel_oe_p, Panel_oe_b
SBI Panel_lat_p, Panel_lat_b
cBI Panel_lat_p, Panel_lat_b
;
SBI Panel_oe_p, Panel_oe_b
SBI Panel_lat_p, Panel_lat_b
cBI Panel_lat_p, Panel_lat_b
;
CBI Panel_a_p, Panel_a_b
CBI Panel_b_p, Panel_b_b
CBI Panel_c_p, Panel_c_b
cBI Panel_d_p, Panel_d_b
SBRC XL,0
SBI Panel_a_p, Panel_a_b
SBRC XL,1
SBI Panel_b_p, Panel_b_b
SBRC XL,2
SBI Panel_c_p, Panel_c_b
SBRC XL,3
sBI Panel_d_p, Panel_d_b
INC XL
ANDI XL,$0F
STS {rowadr},XL
'CBI Panel_oe_p, Panel_oe_b
;
POP XH
POP XL
POP R1
POP R0
Out Sreg , R2
POP R2
CBI Panel_oe_p, Panel_oe_b
RETI
$end Asm
'
' ************************************
' * Timer2 Compare Match B interrupt *
' ************************************
'
$asm
Tint2b:
PUSH R24
SBI Panel_oe_p, Panel_oe_b
LDI R24,$FF
STS {Ledintf},R24
POP R24
RETI
$end Asm
'
$notransform Off
'
' * Font data *
'
$include "font8x8S.font"
$include "font16x16S.font"
|