'// Declare Variables...
Col_A VAR PORTD.4
Col_B VAR PORTD.5
Col_C VAR PORTD.6
Row_A VAR PORTD.0
Row_B VAR PORTD.1
Row_C VAR PORTD.2
Row_D VAR PORTD.3
Scan_Col VAR BYTE ' Counter - current col
Key_Press VAR BYTE ' Value of key (0-9) & * + #
Key_Down VAR BYTE ' Flag set true when key is depressed
Allow_Key VAR BYTE ' Flag - disallow multiple keys being pressed
KeyScan:
@ incf _Scan_Col, 1 ' Inc col pos...
SELECT CASE Scan_Col ' Col (1-3)
CASE 1
Col_A = 0 ' Switch on col (active low)
Col_B = 1 ' Col off
Col_C = 1 ' Col off
'// 3 Key
IF Row_A = 0 THEN ' Key down? ...
IF Allow_Key = 0 THEN ' Any other key down?
Key_Press = 3 ' Load var w/value of key
Allow_Key = 1 ' Disallow other keys
LCDOUT "3"
pause 100
lcdout $FE, $10
ENDIF
ENDIF
'// 6 Key
IF Row_B = 0 THEN
IF Allow_Key = 0 THEN
Key_Press = 6
Allow_Key = 1
LCDOUT "6"
pause 100
lcdout $FE, $10
ENDIF
ENDIF
'// 9 Key
IF Row_C = 0 THEN
IF Allow_Key = 0 THEN
Key_Press = 9
Allow_Key = 1
LCDOUT "9"
pause 100
lcdout $FE, $10
ENDIF
ENDIF
'// # Key
IF Row_D = 0 THEN
IF Allow_Key = 0 THEN
Key_Press = 35
Allow_Key = 1
LCDOUT "#"
pause 100
lcdout $FE, $10
ENDIF
ENDIF
CASE 2
Col_A = 1
Col_B = 0
Col_C = 1
'// 2 Key
IF Row_A = 0 THEN
IF Allow_Key = 0 THEN
Key_Press = 2
Allow_Key = 1
LCDOUT "2"
pause 100
lcdout $FE, $10
ENDIF
ENDIF
'// 5 Key
IF Row_B = 0 THEN
IF Allow_Key = 0 THEN
Key_Press = 5
Allow_Key = 1
LCDOUT "5"
pause 100
lcdout $FE, $10
ENDIF
ENDIF
'// 8 Key
IF Row_C = 0 THEN
IF Allow_Key = 0 THEN
Key_Press = 8
Allow_Key = 1
LCDOUT "8"
pause 100
lcdout $FE, $10
ENDIF
ENDIF
'// 0 Key
IF Row_D = 0 THEN
IF Allow_Key = 0 THEN
Key_Press = 0
Allow_Key = 1
LCDOUT "0"
pause 100
lcdout $FE, $10
ENDIF
ENDIF
CASE 3
Col_A = 1
Col_B = 1
Col_C = 0
'// 1 Key
IF Row_A = 0 THEN
IF Allow_Key = 0 THEN
Key_Press = 1
Allow_Key = 1
LCDOUT "1"
pause 100
lcdout $FE, $10
ENDIF
ENDIF
'// 4 Key
IF Row_B = 0 THEN
IF Allow_Key = 0 THEN
Key_Press = 4
Allow_Key = 1
LCDOUT "4"
pause 100
lcdout $FE, $10
ENDIF
ENDIF
'// 7 Key
IF Row_C = 0 THEN
IF Allow_Key = 0 THEN
Key_Press = 7
Allow_Key = 1
LCDOUT "7"
pause 100
lcdout $FE, $10
ENDIF
ENDIF
'// * Key
IF Row_D = 0 THEN
IF Allow_Key = 0 THEN
Key_Press = 42
Allow_Key = 1
LCDOUT "*"
pause 100
lcdout $FE, $10
ENDIF
ENDIF
Scan_Col = 0
END SELECT
'// Check for key release, all cols on (active low) ...
Col_A = 0
Col_B = 0
Col_C = 0
IF Row_A = 1 THEN
IF Row_B = 1 THEN
IF Row_C = 1 THEN
IF Row_D = 1 THEN
Allow_Key = 0
Key_Down = 0
Key_Press = 255
ENDIF
ENDIF
ENDIF
ENDIF
RETURN
Bookmarks