'------------------------------------------------------------------------------- 'name : MAX7221test.bas 'copyright : (c) 2009, Dipl.Ing. Dr. Christian Hirt, Austria 'purpose : Test control MAX7221 8-digit 7-Seg Driver 'micro : AT90S2313 'flash : 72% used 'build : 06042009 (06. April 2009) 'status : tested '------------------------------------------------------------------------------- '$Sim 'Only for simulation $regfile = "2313def.dat" 'AT90S2313 $crystal = 3686400 'crystal frequency 3.6864 MHz $hwstack = 32 'hardware stack $swstack = 10 'SW stack $framesize = 40 'frame space '------- Config LED Driver Outputs ------ Config PORTD.4 = Output Config PORTD.5 = Output Config PORTD.6 = Output CS_dsply Alias PORTD.4 CLKdsply Alias PORTD.5 DINdsply Alias PORTD.6 '------- Declarations ------------------- Declare Sub InitMAX7221 Declare Sub WriteDisplay(ByVal OpCd As Byte , ByVal dat As Byte) Declare Sub WriteNumber(ByVal num As Long , ByVal dpdgt As Byte) Dim dp As Boolean Dim i As Byte '--------- Main ---------------------------------------------------------------- CS_dsply = 1 CLKdsply = 0 DINdsply = 0 dp = 0 Call InitMAX7221 'Initialize Call WriteNumber(14250837 , 7) '14.250837 Mhz End '------------------------------------------------------------------------------- Sub InitMAX7221 Call WriteDisplay(&h0F ,&h00) 'DisplayTest: Normal Operation Call WriteDisplay(&h09 ,&hFF) 'DecodeMode: Code B for 8 digits Call WriteDisplay(&h0B ,&h07) 'ScanLimit: Scan all 8 digits Call WriteDisplay(&h0A ,&h0F) 'Intensity: Duty Cycle = 15/16 Call WriteDisplay(&h0C ,&h01) 'ShutDown: Normal Operation For i = 1 to 8 Call WriteDisplay(i , &h0F) Next i End Sub Sub WriteDisplay(ByVal OpCd As Byte , ByVal dat As Byte) Dim dgt As Word If dp = 1 then dat = dat OR Bits(7) End If dgt = Opcd shift dgt , left , 8 dgt = dgt OR dat CS_dsply = 0 Shiftout DINdsply , CLKdsply , dgt , 1 , 16 CS_dsply = 1 End Sub Sub WriteNumber(ByVal num As Long , ByVal dpdgt As Byte) Dim nstr As String*8 Dim nchr As String*1 Dim nr As Byte Dim nl As Byte Dim a As Byte nstr = Str(num) nl = Len(nstr) dpdgt = nl - dpdgt dpdgt = dpdgt + 1 For i = nl to 1 step -1 nchr = Mid(nstr,i,1) nr = Val(nchr) If i = dpdgt then dp = 1 a = nl - i a = a + 1 Call WriteDisplay(a , nr) dp = 0 Next i incr nl For i = nl to 8 Call WriteDisplay(i , &b0000_1111) Next i End Sub '############################## End ############################################