|
ME Labs, Inc. 719-520-5323 |
|
|
|
ME Labs, Inc. | 1-719-520-5323 | Example Program - PULSEXT.pbpPICBASIC PRO sample program for dialing with pulses instead of DTMF. Works as a telephone, but doesnt detect incoming calls. See phone1xt.pbp for ring detect and ringer code.' Name : PULSEXT.pbp
' Compiler : PICBASIC PRO Compiler 2.6
' Assembler : PM or MPASM
' Target PIC : PIC16F877-20, PIC18F452 or similar type
' Hardware : LAB-XT Experimenter Board
' Oscillator : 20MHz external
' Keywords : DCD, HPWM, LCDOUT, LOOKUP, NCD, SELECT CASE
' Description : PICBASIC PRO sample program for dialing with pulses
' instead of DTMF. Works as a telephone, but doesn't detect incoming
' calls. See phone1xt.pbp for ring detect and ringer code.
'
' MeLabs PIC programmer should not be connected to the ICSP header
' when running this code. It may interfere with the operation
' of the keypad.
Define LOADER_USED 1 ' Only required for melabs Loader
Define OSC 20 ' Match the crystal on the board
' Define LCD registers and bits
Define LCD_DREG PORTD
Define LCD_DBIT 4
Define LCD_RSREG PORTE
Define LCD_RSBIT 0
Define LCD_EREG PORTE
Define LCD_EBIT 1
sieze Var PORTD.1 ' Relay control pin (sieze line)
loop_current Var PORTA.3 ' Loop current present (active low)
' Define program variables
h Var Byte ' Loop counter, misc
col Var Byte ' Keypad column
row Var Byte ' Keypad row
key Var Byte ' Key value
disp_key Var Byte ' Key label
TRISD = 0 ' Set PORTD to outputs
PORTD = 0 ' Initialize PORTD, all zeros
ADCON1 = 7 ' Set PORTA and PORTE to digital
Pause 100 ' Wait for LCD to start up
LCDOut $fe,1 ' Clear display
OPTION_REG.7 = 0' Enable PORTB pullups (16F)
'INTCON2.7 = 0 ' Enable PORTB pullups (18F)
initialize:
key = $FF ' Set key value to $FF (cleared)
sieze = 0 ' Deactivate the line-sieze relay (Hang Up)
Pause 250 ' Wait 250mS for line to settle
LCDOut $fe, 1, "Press A for off-hook", $FE, $C0 ' Display sign-on message
mainloop:
' If Off Hook and the loop_current drops, Hang-Up the phone
' and initialize variables.
IF (sieze = 1) AND (loop_current = 1) Then initialize
GoSub getkey ' Check for user keypad entry
Select Case key ' Take action based on user keypad entry
Case 12 ' User entry "A" - Off Hook
sieze = 1 ' Activate sieze relay
Pause 250 ' Pause 250mS to establish loop current
LCDOut $FE, 1, "Press B to hang up", $FE, $C0 ' New prompt on LCD
LCDOut $fe,$C0, "ready ", disp_key ' Display user prompt
Case 13,14,15 ' User entries "B", "C", "D" - Hang Up
GoTo initialize ' Hang Up and initialize variables
Case Is < 12 ' User pressed number or *# key
LCDOut $fe,$C0, "Dialing: ", disp_key ' Display key label on LCD
IF sieze = 1 Then ' If Off Hook, dial the digit
For h = 1 TO key ' Loop for each pulse
Pause 45 ' 45mS "Make" time
sieze = 0 ' Drop the line
Pause 65 ' 65mS "Break" time
sieze = 1 ' Sieze the line
Next h ' Next pulse
Pause 300 ' Pause 300mS between digits
EndIF
LCDOut $fe,$C0, "ready ", disp_key ' Display user prompt
End Select ' Continue program
GoTo mainloop ' Repeat main loop
' Subroutine to get a key from keypad
getkey:
' Check for keypress
For row = 0 TO 3 ' Loop for 4 rows in keypad
PORTB = 0 ' All output pins low
TRISB = ~(DCD row) ' Set one row pin to output
'@ NOP ' Fudge for 18F452
col = PORTB >> 4 ' Read column pins
IF col != $0F Then ' Check if key is pressed
HPwm 1,127,7500 ' Begin speaker tick
GoTo gotkey ' If any keydown, exit
EndIF
Next row ' Repeat for the next row
key = $FF ' No keys down, set key to $FF
Return ' Return to main loop
gotkey: ' Change row and column to key number 0 - 15
Pause 15 ' Debounce
HPwm 1,0,0 ' End speaker tick
' Wait for all keys up
PORTB = 0 ' All output pins low
TRISB = $F0 ' Least significant 4 pins out, top 4 pins in
IF ((PORTB >> 4) != $0F) Then gotkey ' If any keys down, loop
key = (row * 4) + (NCD (col^$0F)) - 1 ' Combine row and column into numeric value
' Translate key to display label:
' 1 2 3 A
' 4 5 6 B
' 7 8 9 C
' * 0 # D
LookUp key,["123A456B789C*0#D"],disp_key
' Translate key to pulse dial value (* and # are invalid)
' 1 2 3 12
' 4 5 6 13
' 7 8 9 14
' 0 10 0 15
LookUp key,[1,2,3,12,4,5,6,13,7,8,9,14,0,10,0,15],key
Return ' Return to main loop
End
Download the program file. |
|
Copyright 2022 ME Labs, Inc. PO Box 8250 Asheville NC 28814 (719) 520-5323 (719) 520-1867 fax email: support@melabs.com |
|