This collection of routines was developed to illustrate some of the basic programming concepts of the BX24. They use no more than the two surface mount LEDs and a wire (pushbutton) to ground on Pin 12.
LEDFL_1 simply turns off the green LED and flashes the red LED. LEDFL_2 extends this to flash either the green or red LED depending on the state of a pushbutton on Pin 12. LEDFL_3 perfroms the same function using a subroutine.
Program LEDFL_4 illustrates how a quantity may be displayed using flashes and LEDFL_5 dials a telephone number (simulated using the red LED) and then sends the quantity using the green LED.
' LEDFL_1.Bas (BX24)
'
' Turns off Green surface mount LED and flashes Red LED.
'
' Illustrates use of "const", "do - loop", "PutPin", "Sleep".
'
' Note that the surface mount LEDs are turned on with a 0.
'
' Copyright, Peter H. Anderson, Baltimore, MD, Nov, '99
Const RedLED as Byte = 25
Const GreenLED as Byte = 26
Sub Main()
Do
Call PutPin(GreenLED, 1) ' turn the green LED off
Call PutPin(RedLED, 0) ' turn Red LED on
Call Sleep(0.5)
Call PutPin(RedLED, 1) ' turn it off
Call Sleep(0.25)
Loop
End Sub
' LEDFL_2.Bas (BX24)
'
' Flashes Red surface mount LED if pushbutton PB0 on Pin 12 is at ground.
' Otherwise the Green LED is flashed. Note that the flash rates are
' different.
'
' Illustrates the use of "If Then, Else, End If", configuring a pin as an
' input with an internal pullup
'
' Copyright, Peter H. Anderson, Baltimore, MD, Nov, '99
Const RedLED as Byte = 25
Const GreenLED as Byte = 26
Const PB0 as Byte = 12
Sub Main()
Do
Call PutPin(PB0, 3) ' make PB0 an input with internal pullup
If (GetPin(PB0)=0) Then ' read the pushbutton
Call PutPin(GreenLED, 1) ' turn the green LED off
Call PutPin(RedLED, 0) ' turn Red LED on
Call Sleep(0.5)
Call PutPin(RedLED, 1) ' turn it off
Call Sleep(0.25)
Else
Call PutPin(RedLED, 1) ' turn the red LED off
Call PutPin(GreenLED, 0) ' turn green LED on
Call Sleep(0.1)
Call PutPin(GreenLED, 1) ' turn it off
Call Sleep(0.1)
End If
Loop
End Sub
' LEDFL_3.Bas (BX24)
'
' Performs the same function as LEDFL_2.Bas except flashing of the LED
' is implemented in a subroutine.
'
' Note that in calling the sub, parameters are copied, in the same order,
' to the subroutine. Note that Pin, NumTimes, OnTime and OffTime are
' local variables known only to Sub FlashLED which are dynamically created
' and exist only when the program is executing the subroutine.
'
' Copyright, Peter H. Anderson, Baltimore, MD, Nov, '99
Const RedLED as Byte = 25
Const GreenLED as Byte = 26
Const PB0 as Byte = 12
Sub Main()
Do
Call PutPin(PB0, 3) ' make PB0 an input with internal pullup
If (GetPin(PB0)=0) Then ' read the pushbutton
Call PutPin(GreenLED, 1) ' turn the green LED off
Call FlashLED(RedLED, 1, 0.5, 0.25)
' flash Red LED, one time, 0.5 secs on and 0.25 secs off
Else
Call PutPin(RedLED, 1) ' turn the red LED off
Call FlashLED(GreenLED, 1, 0.1, 0.1)
' flash Green LED, one time, 0.1 secs on and 0.1 secs off
End If
Loop
End Sub
Sub FlashLED(ByVal Pin as Byte, ByVal NumTimes as Integer, _
ByVal OnTime as Single, ByVal OffTime as Single)
Dim N as Integer
For N = 1 to NumTimes
Call PutPin(Pin, 0)
Call Sleep(OnTime)
Call PutPin(Pin, 1)
Call Sleep(OffTime)
Next
End Sub
' LEDFL_4.Bas (BX24)
'
' Assumes the Green LED is a Sonalert or similar noise maker. Program
' causes the quantity 123 to be sent as "beep" / "beep, beep" /
' "beep, beep, beep". Note that in the case of a zero; e.g., 101,
' the zero is sent as 10 beeps.
'
' An application might be to send a quantity such as temperature over a
' phone line.
'
' Illustrates use of the MOD operator. Note that Integer divide is \.
'
' Copyright, Peter H. Anderson, Baltimore, MD, Nov, '99
Const RedLED as Byte = 25
Const GreenLED as Byte = 26
Const PB0 as Byte = 12
Sub Main()
Dim Temperature as Integer, Temp as Integer
Dim Digit as Integer
Temperature = 103 ' this might be the result of an A/D conversion
Temp = Temperature
Digit = Temp \ 100 ' number of hundreds
If (Digit = 0) Then
Digit = 10
End If
Call FlashLED(GreenLED, Digit, 0.25, 0.25) ' send hundreds
Call Sleep(2.0) ' delay between digits
Temp = Temp MOD 100 ' take the remainder
Digit = Temp \ 10 ' number of tens
If (Digit = 0) Then
Digit = 10
End If
Call FlashLED(GreenLED, Digit, 0.25, 0.25)
Call Sleep(2.0) ' delay between digits
Digit = Temp MOD 10 ' units
If (Digit = 0) Then
Digit = 10
End If
Call FlashLED(GreenLED, Digit, 0.25, 0.25)
Call Sleep(2.0) ' delay between digits
Do ' loop indefinitely
Loop
End Sub
Sub FlashLED(ByVal Pin as Byte, ByVal NumTimes as Integer, _
ByVal OnTime as Single, ByVal OffTime as Single)
Dim N as Integer
For N = 1 to NumTimes
Call PutPin(Pin, 0)
Call Sleep(OnTime)
Call PutPin(Pin, 1)
Call Sleep(OffTime)
Next
End Sub
' LEDFL_5.Bas (BX24)
'
' Assumes RED LED is dial pulse relay.
'
' When depressed PB0, phone goes off hook and waits 2.0 seconds and assumes
' dial tone is present. The phone number is then dial pulsed at 50 percent
' break at 10 pulses per second. On completion, a wait of 2.0 secs. The
' quantity is then "sent" ten times followed by going back on-hook.
'
' Assumes the Green LED is a Sonalert or similar noise maker. Program causes
' the quantity 123 to be sent as "beep" / "beep, beep" / "beep, beep, beep".
' Note that in the case of a zero; e.g., 101, the zero is sent as 10 beeps.
'
' An application might be to send a quantity such as temperature over a phone line.
'
' Illustrates use of subroutines, use of arrays, passing arrays by reference
' to a sub or function.
'
' Note that an array is passed to a subroutine ByRef. That is, the address
' of the first element is passed.
'
' As dial pulsing is one of "Off, On", a new subroutine FlashLEDInv was
' developed. Note the typecast CInt of Digit.
'
' Copyright, Peter H. Anderson, Baltimore, MD, Nov, '99
Const RedLED as Byte = 25
Const GreenLED as Byte = 26
Const PB0 as Byte = 12
Sub Main()
Dim Temperature as Integer, N as Integer
Dim TelNum(1 to 20) as Byte
TelNum(1) = 1 ' intialize the tel number
TelNum(2) = 8
TelNum(3) = 0
TelNum(4) = 0
TelNum(5) = 5
TelNum(6) = 5
TelNum(7) = 5
TelNum(8) = 1
TelNum(9) = 2
TelNum(10) = 1
TelNum(11) = 2
TelNum(12) = &Hf ' meaning there is no more
Temperature = 103 ' this might be the result of an A/D conversion
Do ' loop until pushbutton PB0 is depressed
Call PutPin(RedLED, 1) ' be sure on hook
Call PutPin(GreenLED, 1)
Call PutPin(PB0, 3)
Loop Until (GetPin(PB0) = 0)
Call PutPin(RedLED, 0) ' go off hook
Call Sleep(2.0)
Call DialTelNum(TelNum)
Call Sleep(5.0) ' give some time for party to answer phone
For N = 1 To 10 ' send the quantity ten times
Call SendQuantity(Temperature)
Call Sleep(2.0) ' pause between sending
Next
Call PutPin(RedLED, 1) ' back on hook
End Sub
Sub DialTelNum(ByRef Tel() as Byte)
Dim N as Integer
Dim Digit as Byte
For N=1 to 20
Digit = Tel(N)
If (Digit = &Hf) Then
Exit For
End If
If (Digit = 0) Then
Digit = 10
End If
Call FlashLEDInv(RedLED, CInt(Digit), 0.05, 0.05)
Call Sleep(1.0) ' one second between digits
Next
End Sub
Sub SendQuantity(ByVal Q as Integer)
Dim Digit as Integer
Digit = Q \ 100 ' number of hundreds
If (Digit = 0) Then
Digit = 10
End If
Call FlashLED(GreenLED, Digit, 0.25, 0.25) ' send hundreds
Call Sleep(2.0) ' delay between digits
Q = Q MOD 100 ' take the remainder
Digit = Q \ 10 ' number of tens
If (Digit = 0) Then
Digit = 10
End If
Call FlashLED(GreenLED, Digit, 0.25, 0.25)
Call Sleep(2.0) ' delay between digits
Digit = Q MOD 10 ' units
If (Digit = 0) Then
Digit = 10
End If
Call FlashLED(GreenLED, Digit, 0.25, 0.25)
Call Sleep(2.0) ' delay between digits
End Sub
Sub FlashLED(ByVal Pin as Byte, ByVal NumTimes as Integer, _
ByVal OnTime as Single, ByVal OffTime as Single)
Dim N as Integer
For N = 1 to NumTimes
Call PutPin(Pin, 0)
Call Sleep(OnTime)
Call PutPin(Pin, 1)
Call Sleep(OffTime)
Next
End Sub
Sub FlashLEDInv(ByVal Pin as Byte, ByVal NumTimes as Integer, _
ByVal OffTime as Single, ByVal OnTime as Single)
Dim N as Integer
For N = 1 to NumTimes
Call PutPin(Pin, 1)
Call Sleep(OnTime)
Call PutPin(Pin, 0)
Call Sleep(OffTime)
Next
End Sub