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