Numeric_entry.txt

Warning: if you clip this code into your program, look out for possible html code slipping in.

REM General purpose keypad and LCD operator interface
REM SBC2000-074/-062
REM 8/20/98 ss

GLOBAL done AS BIT
GLOBAL sign AS BIT

REM Keypad is mapped "calculator" style (as opposed to "telephone" style)
REM Decimal point, enter, minus and backspace are supported in numeric entry
REM Up arrow, down arrow and enter are supported in incr/decr mode
REM keypad is mapped such that cable exits from lower left corner

REM           key functions                    key codes
REM     +-------------------------+     +---------------------+
REM     |  7     8     9    MINUS |     |  12    8     4    0 |
REM     |  4     5     6    UP    |     |  13    9     5    1 |
REM     |  1     2     3    DOWN  |     |  14    10    6    2 |
REM     |  0     DP    BKSP ENTER |     |  15    11    7    3 |
REM     +-------------------------+     +---------------------+	
REM     |||||                           |||||
REM     |||||                           |||||
REM     |||||<-cable                    |||||<-cable
REM   8 |||||  1                      8 ||||| 1

REM Get_integer fills an integer variable from numeric keys. +/-32767 maximum
FUNCTION get_integer(pos AS INTEGER) AS INTEGER
	LOCAL key AS INTEGER

	done = 0
	sign = 0
	pos = pos-2
	LCD_COMMAND(0x80+pos-3)
	PRINT "      "

	DO
		IF get_integer
			IF ABS(get_integer)>0 AND ABS(get_integer)<10
				LCD_COMMAND(0x80+pos)
			ENDIF

			IF ABS(get_integer)>9 AND ABS(get_integer)<100
				LCD_COMMAND(0x80+pos-1)
			ENDIF

			IF ABS(get_integer)>99 AND ABS(get_integer)<1000
				LCD_COMMAND(0x80+pos-2)
			ENDIF

			IF ABS(get_integer)>999 AND ABS(get_integer)<10000
				LCD_COMMAND(0x80+pos-3)
			ENDIF

			IF ABS(get_integer)>9999
				LCD_COMMAND(0x80+pos-4)
			ENDIF
		ELSE
			LCD_COMMAND(0x80+pos)
		ENDIF
		PRINT " ",get_integer

		DO
			key=KEYPAD(0)
		LOOP UNTIL key<>-1

		SELECT key
			CASE 15
				REM key "0"
				get_integer = get_integer*10
			CASE 14
				REM key "1"
				get_integer = get_integer*10+1-2*sign
			CASE 10
				get_integer = get_integer*10+2+4*sign
			CASE 6
				get_integer = get_integer*10+3+6*sign
			CASE 13
				get_integer = get_integer*10+4+8*sign
			CASE 9
				get_integer = get_integer*10+5+10*sign
			CASE 5
				get_integer = get_integer*10+6+12*sign
			CASE 12
				get_integer = get_integer*10+7+14*sign
			CASE 8
				get_integer = get_integer*10+8+16*sign
			CASE 4
				get_integer = get_integer*10+9+18*sign
			CASE 7
				REM backspace key
				get_integer = get_integer / 10
			CASE 3
				REM enter key
				done = -1
			CASE 0
				REM negative sign
				get_integer = -get_integer
				sign= NOT sign
			CASE ELSE
				REM unmapped keys
		ENDSELECT

		DO
			REM
		LOOP UNTIL KEYPAD(0) <> key
	LOOP UNTIL done
END


GLOBAL xxx AS INTEGER
REM Main routine

DO
	xxx = get_integer(10)
	LCD_COMMAND(0x80+64)
	PRINT XXX,"   "
LOOP UNTIL 0