Most of the commonly-used methods (like HSERIN [DEC numdata] work, but provide no user feedback as to what they are typing. It also doesn't allow for backspacing. This include file provides both.
As an added bonus, the file lets you input negative numbers by typing a "-" before the number. And, because people who are used to occasionally putting a "-" before their entry may also put a "+", the file will accept this also.
This routine will work with most serial terminal programs, like HYPERTERM and Bray's TERMINAL. No fancy emulation modes (VT-XX) need to be selected.
The INCLUDE has several defaults that can be overridden by changing the values of certain variables before the INCLUDE is called via a GOSUB. These defaults include the maximum number of characters (MAXCHAR), whether or not "-" and "+" will be allowed before the number entry (ALLLOWSIGN), and the timeout - how long the routine will wait with no input before returning.
If the MAXCHAR limit is reached, the value is returned as if an <ENTER> had been pressed. Of course, an <ENTER> can be pressed at any time. 5 is the default.
If ALLOWSIGN = 1, then a "+" or "-" will be allowed - BUT ONLY IN THE LEFTMOST POSITION. A "+" is displayed, but "thrown away" later. A "-" on the other hand, will return the twos compliment of the number.
Pressing <ESC> will return the value of zero and set bit 2 of the variable KERROR. Likewise, entering nothing will cause a timeout and will set KERROR bit 1 and return a value of zero. Entering a negative number that is too large will set KERROR bit 0.
Kerror bit 7 will be set if the returned value is negative.
The returned value is KRETURNED.
To invoke the utility :
This routine is written for hardware serial ports. Although software ports (SERIN2) CAN be used, I discourage this horrible practice whenever I can.
USAGE:
<Set up serial port>
INCLUDE "KBNumberInput.bas"
<Change defaults, if desired>
...
...
...
Hserout [CR,LF,"Give me the number "]
Gosub GetNum
IF !Kerror then
HSEROUT [CR,LF,"The number you typed in was ",#KResult]
else
if Kerror.7 then
HSEROUT [CR,LF,"The NEGATIVE number you typed in was ",SDEC Keyresult]
else
<Process errors here>
endif
endif
;-----------------------------------------------------------------------------------------
; Numeric Input Routine by Charles Linquist
; Set MaxNum to maximum number of digits you will take (default = 5)
; Set KInputTimeout to the number of secs you will wait before giving up.
; If you will accept a sign ("+" or "-") then set AllowSign to 1 in your
; program it will over-ride these values
;
; KRESULT is , well, the result.
;-----------------------------------------------------------------------------------------
Keyin var byte
Maxnum var byte
YY var word
POSN var byte
AllowSign var bit
Kerror var Byte
KInputString var byte [10]
KResult Var word
KInputTimeout var Word
XN var byte
BS CON 8
ESC cON 27
LF con 10
SP con 32
CR con 13
MaxNum = 5 ; max number of chars
KInputTimeout = 10000 ; 10 sec
AllowSign = 0
goto OverKInput
GetNum:
KResult = 0
Kerror = 0
YY = 1
POSN=0
ArrayWrite KInputString,[Rep $FF\8] ; Fill with $FF
GetMoreN:
HSERIN KInputTimeout,DeadAtKeyboard,[Keyin]
IF Keyin = ESC THEN Escaped
If Keyin = CR THEN DunInputn
If AllowSign then
IF Posn = 0 THEN
If Keyin = "-" THEN
Kerror.7 = 1
Hserout ["-"]
goto GetMoreN
endif
if Keyin = "+" then
Hserout ["+"]
goto GetMoreN
endif
ENDIF
endif
IF Keyin = BS THEN
IF POSN > 0 THEN
HSEROUT [BS,SP,BS]
POSN = POSN - 1
KInputString [POSN] = $FF
GOTO GetMoreN
ENDIF
ENDIF
iF POSN >= MaxNum THEN goto DunInputN
IF Keyin < "0" or Keyin > "9" THEN GetMoreN
HSEROUT [Keyin]
KInputString [POSN] = Keyin - "0"
POSN = POSN +1
GOTO GetMoreN
DunInputN:
For xN = 4 to 0 STEP - 1
IF KInputString[XN]= 255 THEN NotANum
KResult = KResult + (KInputString[xN]*YY)
YY = YY *10
NotANum:
Next XN
If Kerror.7 then
If Kresult < 32768 then
KResult = 0 - KResult
else
Kerror.0 = 1
goto zeronum
endif
endif
Return ; success
DeadAtKeyboard:
Kerror.1 = 1
Goto ZeroNum
Escaped:
Kerror.2 = 1
ZeroNum:
KResult = 0
RETURN
OverKInput:
No attempt has been made to prevent entries over 65535. An easy way to prevent this mistake is to set MAXNUM to 4. This will make it impossible to enter numbers over 9999.


Menu

Re: 16F690 MCLR as Input
many thanks Henrik to clarify this post.
jackberg1 - 27th October 2025, 20:42that make more sense to me now with further test, when the pin RA3
has nothing connected to it, the input is floating thus
when adding a pulldown it's...