Hi there
I'm at wit's end ...
I have been battling to get my matrix keypad(s) working, I have both a 4x3 and a 4x4 keypad.
Two nights ago I stunbled across some postings and code in the forums which looked like they may be what I am looking for (with a few changes perhaps).
After trying out both (namely the one from mister e and Steve) I still have not come right and can't understand what I am doing wrong.
Please see my other posts on mister e's keypad code pages here
http://www.picbasic.co.uk/forum/show...?t=3250&page=3
as well as Steve's on this post(hope cross posting is ok):
http://www.picbasic.co.uk/forum/show...0999#post80999.
With Steve's implemetation I get only a "||" character on the LCD.
Attached is my code.
I am almost convinced I am not setting the registers correctly or calling a variable correctly :-( I was quite happy working with a 16f628 but now that I've re-kindled PIC's as hobby again I decided to go with an 18F series and it's taking some getting used to.
If some kind soul would help me I would really appreciate it.
Comments and suggestion or tips and tricks would be more than welcomed too.
Kind regards
Dennis
Code:'************************************* 'LCD code for 16 X 2 HD4x lcd '************************************* 'Ocsillator selections here OSCCON = $70 'Int CLK 8MHz OSCTUNE.6 = 1 'PLL 4x ADCON1= %00001111 '$0F = disable A/D converter 'END of oscillator selections 'Port IO directions and presets for port pins begin here 'TRISA = %11111111 'All pins are outputs 'TRISB = %00000000 'for keypad '// Define port pins as inputs and outputs ... TRISA = %00001000 TRISB = %00001101 TRISC = %00000000 TRISD = %00000000 TRISE.0 = 0 TRISE.1 = 0 TRISE.2 = 0 'End of Port IO directions and presets for port pins begin here 'timer/oscillator defines DEFINE OSC 32 '4x 8MHz 'END of timer/oscillator defines 'variables begin here myvar var byte 'LCD defines begin here DEFINE LCD_BITS 4 'defines the number of data interface lines (4 or 8) DEFINE LCD_DREG PORTD 'defines the port where data lines are connected to DEFINE LCD_DBIT 4 'defines the position of data lines for 4-bit interface (0 or 4) DEFINE LCD_RSREG PORTD 'defines the port where RS line is connected to DEFINE LCD_RSBIT 2 'defines the pin where RS line is connected to DEFINE LCD_EREG PORTD 'defines the port where E line is connected to DEFINE LCD_EBIT 3 'defines the pin where E line is connected DEFINE LCD_RWREG 0 'defines the port where R/W line is connected to (set to 0 if not used) DEFINE LCD_RWBIT 0 'defines the pin where R/W line is connected to (set to 0 if not used) DEFINE LCD_COMMANDUS 2000 'defines the delay after LCDOUT statement DEFINE LCD_DATAUS 200 'delay in micro seconds 'END of LCD DEFINES 'keypad code here '// 3x3 Keypad - Rows as inputs, Cols as outputs... 'Rows: RA3 Cols: RB1 ' RB3 RA2 ' RB2 RA4 ' RB0 '// ' RB5: LED & Buzzer ... ' RA0: TX to PC's Serial Port '// Declare Variables... Col_A VAR PORTB.1 Col_B VAR PORTA.2 Col_C VAR PORTA.4 Row_A VAR PORTA.3 Row_B VAR PORTB.3 Row_C VAR PORTB.2 Row_D VAR PORTB.0 Buzzer VAR PORTB.5 RX_To_PC VAR PORTA.0 Scan_Col VAR BYTE ' Counter - denoting current col in scan Key_Press VAR BYTE ' Contains 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 I VAR byte ' General working var Scan_Keypad: '// Scan cols @ 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 ENDIF ENDIF '// 6 Key IF Row_B = 0 THEN IF Allow_Key = 0 THEN Key_Press = 6 Allow_Key = 1 ENDIF ENDIF '// 9 Key IF Row_C = 0 THEN IF Allow_Key = 0 THEN Key_Press = 9 Allow_Key = 1 ENDIF ENDIF '// # Key IF Row_D = 0 THEN IF Allow_Key = 0 THEN Key_Press = 35 Allow_Key = 1 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 ENDIF ENDIF '// 5 Key IF Row_B = 0 THEN IF Allow_Key = 0 THEN Key_Press = 5 Allow_Key = 1 ENDIF ENDIF '// 8 Key IF Row_C = 0 THEN IF Allow_Key = 0 THEN Key_Press = 8 Allow_Key = 1 ENDIF ENDIF '// 0 Key IF Row_D = 0 THEN IF Allow_Key = 0 THEN Key_Press = 0 Allow_Key = 1 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 ENDIF ENDIF '// 4 Key IF Row_B = 0 THEN IF Allow_Key = 0 THEN Key_Press = 4 Allow_Key = 1 ENDIF ENDIF '// 7 Key IF Row_C = 0 THEN IF Allow_Key = 0 THEN Key_Press = 7 Allow_Key = 1 ENDIF ENDIF '// * Key IF Row_D = 0 THEN IF Allow_Key = 0 THEN Key_Press = 42 Allow_Key = 1 ENDIF ENDIF end select 'end keypad code '*********************Includes****** 'Includes end here Pause 500 ' Wait for LCD to startup 'loop1: ' Lcdout $fe, 1 ' Clear LCD screen ' Lcdout "Hello" ' Display Hello 'Pause 1000 ' Wait .5 second 'Lcdout $fe, $C0 ' Clear LCD screen 'Lcdout "World" 'pAUSE 1000 'Lcdout $fe, 1 ' Clear LCD screen 'Pause 1000 ' Wait .5 second 'Goto loop1 ' Do it forever 'start: '@ READKEYPAD _myvar 'lcdout $fe, 1 lcdout Key_Press 'goto start
Bookmarks