OLED Portable Display Original 7—segment LED Version

OLED Portable Display Picaxe Basic Declarations

OLED Portable Display Picaxe Basic Declarations

#rem 4-digit Portable Display.bas 

This is a hand-held 4-digit white 7-segment LED display receiving data from the 

Mobile Logger, the Solar Transmitter.or the Alpha LED Clock

as selected on switch-on.

John Saunders

8/13/2018

#endrem

#picaxe 14M2

SETFREQ M8

symbol DispRx            = C.2

symbol ButtonLeft      = pinC.0

symbol ButtonRight     = pinC.4

symbol VoltPort           = B.2

symbol Int_Port           = pinC.1

symbol Rcvr_In         = B.3


rem variables

symbol LeftSwVal          = bit0

symbol RightSwVal        = bit1

symbol NewModeFlag    = bit2

symbol BattVolt            = w13

symbol Scratch             = b1

symbol Iter         = b2

symbol TableAddress    = b3        'A DATA address containing a DATA address

symbol DataAddress       = b4        'A DATA address containing an ID character


rem global variables

symbol DPCode         = b6        'Code for displaying decimal points:0=none,1=x.xxx,2=xx.xx,4=xxx.x,4=colon in middle

symbol Mode            = b7        'The source device: 0="s"=Solar Transmitter,1="t"=Alpha LED Clock,2="w"=Mobile Logger

symbol Field            = b8        'The message field being displayed. 


rem interrupt variables

symbol FieldAddress     = b10     'A memory address containing data

symbol I_tmp          = b11

symbol CheckHex        = b12

symbol MemAddress        = b13        'A received memory address

symbol Msg_End        = b14        'Memory address of last data character (=length code + 43)

symbol CheckSum        = b15

symbol StoreAddress    = b16


#rem

Master formatting tables for ID display

The first is the Mode ID character to go in the first digit

Each field has 2 values: for the characters in digits 3 & 4, 

#endrem

DATA   0,(0x6D,0x63,0x71,0x76,0x3E,0x39,0x3E,0x6D,0x73)    'Solar Transmitter, Mode = 0, Key = "s", ID = "S"

DATA  10,(0x39,0x5E,0x77,0x07,0x31,0x5E,0x77,0x07,0x31)    'Alpha LED Clock    Mode = 1, Key = "t", ID = "C"

DATA  20,(0x38,0X77,0X38,0x63,0x71,0x76,0x3E,0x6D,0x73)    'Mobsile Logger     Mode = 2, Key = "w", ID = "L"


#rem

Master formatting tables for Data display, 4 fields of 5 bytes each

First is the decimal point code which is bit-mapped 

The rest are the memory addresses for the 4 digits the Mode ID character to go in the first digit

#endrem

DATA  30,(0, 28,104,105,106,0, 28,108,109,110,0, 28,112,113,114,0, 28,116,117,118)    'Solar Transmitter, Mode = 0, Key = "s", ID = "S"

DATA  50,(2,104,105,107,108,8,110,111,113,114,2,104,105,107,108,4,110,111,113,114)    'Alpha LED Clock    Mode = 1, Key = "t", ID = "C"

DATA  70,(0,104,105,106,107,4,109,110,111,112,4,114,115,117,117,1,119,120,121,122)    'Mobsile Logger     Mode = 2, Key = "w", ID = "L"


#rem Memory mapping by field

field:             0          1          2          3

"s" Name      Temperature   Humidity   Current     Voltage

"s" Format       " ",xxx    " ",xxx    " ",xxx     " ",x.xx

"s" Address      30-32      32-34     35-37         38-40         

"t" Name        Month        Date       Hour        Minute 

"t" Format            xx.xx                  xx:xx

"t" Address      30-31       32-33      34-35       36-37

"w" Name      Altitude   Temperature  Humidity     Voltage

"w" Format      xxxx        xxx.x       xxx.x       xx.xx

"w" Address      30-33      34-37       38-41       42-45

Display Battery:

Battery Format                " ",x.xx

Battery Address               46-49

Interrupt mapping: 210-255

#endrem 

OLED Portable Display Picaxe Init and Main

init:

SETFREQ m8

LET Field = 1

LET NewModeFlag=1

LET Mode = 2

POKE 28,0                'Mobile Logger

LET LeftSwVal =  ButtonLeft

LET RightSwVal =  ButtonRight

IF LeftSwVal = 0 THEN

    LET Mode = 0            'Solar Transmitter

ENDIF

IF RightSwVal = 0 THEN

    LET Mode = 1            'Alpha LED Clock

ENDIF

PAUSE 100

SETINT  %00000010,%00000010        'Interrupt when C.1 high


main:

PAUSE 100

IF NewModeFlag=1 AND Mode < 4 THEN

    SERTXD ("Mode=",#Mode,",Field=",#Field,13,10)

    GOSUB DisplayID

    DO

        LET LeftSwVal =  ButtonLeft

        LET RightSwVal =  ButtonRight

    LOOP UNTIL LeftSwVal = 1 AND RightSwVal = 1

    LET NewModeFlag = 0

ENDIF


IF Field = 4 THEN

    GOSUB GetVolts

    PAUSE 1000

ENDIF


GOSUB GetKeys


GOTO Main

OLED Portable Display Picaxe Sub-Programs

GetKeys:

LET LeftSwVal =  ButtonLeft

IF LeftSwVal = 0 AND NewModeFlag=0 THEN

    IF Field > 0 THEN

        DEC Field

    ELSE

        LET Field = 4

    ENDIF

    LET NewModeFlag=1            'Show Mode ID

ENDIF


LET RightSwVal =  ButtonRight

IF NewModeFlag=0 AND RightSwVal = 0 THEN

    IF Field < 4 THEN

        INC Field

    ELSE

        LET Field = 0

    ENDIF

    LET NewModeFlag=1            'Show Mode ID

ENDIF


RETURN


GetVolts:

rem Measure and Display Battery voltage

SEROUT DispRx,T9600_8,(0X77,2,0X7B,0)

FVRSETUP FVR4096

ADCCONFIG %011

READADC10 VoltPort,BattVolt

LET BattVolt =  4 * BattVolt + 5 / 10

LET BattVolt = BattVolt // 1000

LET Scratch = BattVolt/100

SEROUT DispRx,T9600_8,(0X79,1,Scratch)

LET BattVolt = BattVolt // 100

LET Scratch = BattVolt / 10

SEROUT DispRx,T9600_8,(0X79,2,Scratch)

LET Scratch    = BattVolt // 10

SEROUT DispRx,T9600_8,(0X79,32,Scratch)

RETURN


DisplayID:

LET TableAddress = 10 * Mode                'DATA Location of Mode letter

READ TableAddress,Scratch

SETINT OFF

SEROUT DispRx,T9600_8,(0X7B,Scratch,0X7C,0)    'Mode character and A blank position                    

LET DataAddress = 3 * Field + TableAddress    'Field position in Master table for field ID 

READ DataAddress,Scratch                'Position 3 character                    

SEROUT DispRx,T9600_8,(0X7D,Scratch)        'Left Field ID letter

INC DataAddress

READ DataAddress,Scratch                'Right Field ID letter                                    

SEROUT DispRx,T9600_8,(0X7E,Scratch,0X77,0)    'and cancel decimal points    

SETINT  %00000010,%00000010                'Interrupt when C.1 high

RETURN


DisplayField:                        'Display data value on interrupt

SEROUT DispRx,T9600_8,(0X7B,0X1C)            'Briefly show symbol in left digit

PAUSE 800                    

LET FieldAddress = 20 * Mode + 30            'Master table for mode 

LET FieldAddress = 5 * Field + FieldAddress    'Field position in Master table for Decimal Code

READ FieldAddress,I_tmp                    'Decimal code

SEROUT DispRx,T9600_8,(0X77,I_tmp)

INC FieldAddress                        'DATA address for MSB number memory location

READ FieldAddress,MemAddress                'MSB address

PEEK MemAddress,I_tmp

SEROUT DispRx,T9600_8,(0X79,0,I_tmp)

INC FieldAddress                        'DATA address for MSB number memory location

READ FieldAddress,MemAddress                'Digit2 address

PEEK MemAddress,I_tmp

SEROUT DispRx,T9600_8,(0X79,1,I_tmp)INC FieldAddress                        'DATA address for MSB number memory location

READ FieldAddress,MemAddress                'Digit3 address

PEEK MemAddress,I_tmp

SEROUT DispRx,T9600_8,(0X79,2,I_tmp)INC FieldAddress                        'DATA address for MSB number memory location

READ FieldAddress,MemAddress                'Digit4 address

PEEK MemAddress,I_tmp

SEROUT DispRx,T9600_8,(0X79,3,I_tmp)

RETURN



Interrupt:                    'Message from selected transmitter

LET bptr=100

POKE 100,"Z"

SERIN [40],Rcvr_In,N2400_8,("14L1776"),@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc, @bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc, @bptrinc,@bptrinc,@bptrinc,@bptr

LOOKUP Mode,("s","t","w"),I_tmp

PEEK 100,StoreAddress 

IF StoreAddress <> I_tmp THEN End_Interrupt            'Not the one wanted

PEEK 102, I_tmp               'The length code, 60 + number of data bytes between commas, including commas between fields

LET Msg_End = I_tmp + 43         'Address of last data character

IF Msg_end < 114 OR Msg_End > 122 THEN End_Interrupt            'A message length for checksum

LET Checksum = 0

FOR StoreAddress = 104 TO Msg_End

    PEEK StoreAddress,CheckHex     

    LET CheckSum = CheckSum + CheckHex

NEXT

LET CheckHex = CheckSum / 16

IF CheckHex  < 10 THEN

    LET CheckHex = CheckHex + "0"

ELSE

    LET CheckHex = CheckHex + "7"

ENDIF

LET StoreAddress = Msg_End + 2      'Address of first checksun byte

PEEK StoreAddress,I_tmp                'First Checksum character

IF CheckHex <> I_tmp THEN End_Interrupt

LET CheckHex = CheckSum & $F

IF CheckHex  < 10 THEN

    LET CheckHex = Checkhex + "0"

ELSE

    LET CheckHex = CheckHex + "7"

ENDIF

LET StoreAddress = Msg_End + 3      'Address of second checksun byte

PEEK StoreAddress,I_tmp                'Second Checksum character

IF CheckHex <> I_tmp THEN End_Interrupt



IF NewModeFlag = 1 OR Field = 4 THEN End_Interrupt


GOSUB DisplayField

End_Interrupt:

SETINT  %00000010,%00000010    'Interrupt when C.1 high

RETURN