Hi all
Please would somebody be so kind as to shed some light on the problem I am experiencing.
I am busy re-kindling my hobby and interest in PIC programming, I think these forums are an excellent resource, somehow all roads lead back here after many a google search and reading post after post and numerous articles.
After 3 weeks of late nights and sore eyes and a lot of reading later I have finally gotten to a stage where I have a functional (perhaps a very under-utilized PIC 18F4530).
After having blinked LED's and read switches and getting my LCD working I would like to implement a keypad as opposed to a bank of dip switches.
I am trying to implement the keypad.bas file submitted by mister_e (Thanks mister e ... your code looks fantastic, I'm dying to use it properly :-)
So here's where I'm at now....
I am trying to connect a 4 x 4 matrix keypad to my 18F4520 PIC.
Ultimately I would like to be able to be able to type in a number, end it with a # to signify completed input and then transmit the inputted number to another pic either wired or wireless.
The keypad layout is as follows.
my keypad matrix
1 2 3 A
4 5 6 B
7 8 9 C
* 0 # D
I have connected the keypad to the pic as follows.
Keypad PIC
Column 0 PortA.0
Column 0 PortA.1
Column 0 PortA.2
Column 0 PortA.
Row 0 PortC.0
Row 1 PortC.1
Row 2 PortC.2
Row 3 PortC.3
10K pullups set on column inputs
100 Ohm resistors in series with rows
When I have the above configured my LCD just produces blocks
If I remove either the pullups and/or the series resistors I just get "Key Value" 20 continuously appearing on the LCD and if I press a key on the keypad I get the "key Value" changing on the LCD but it is not the correct value according to my keypad.
I could also use the whole of Port A but when I tried it but had the same results :-(
Initially I tried to connect on PortB and had the same results, so I assumed it was because I was getting inputs from pin 39 and pin 40 of the pic where the PICkit 2 is connected for ICSP.
I have attached my code below.
Please could someone advise as to where I am going wrong or what I could look at to fix the problem !
I think it could be a possible CONFIG problem or coding issue in my code.
Any help would be greatly appreciated.
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
TRISA.0 = 1
TRISA.1 = 1
TRISA.2 = 1
TRISA.3 = 1
TRISB = %00000000
'TRISC = %00000000
TRISC.0 = 1
TRISC.1 = 1
TRISC.2 = 1
TRISC.3 = 1
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 4x4 defines begin here
DEFINE KEYPAD_ROW 4 ' 4 ROW keypad
DEFINE KEYPAD_ROW_PORT PORTC ' ROW port = PORTB
DEFINE KEYPAD_ROW_BIT 0 ' ROW0 = PORTB.4
DEFINE KEYPAD_COL 4 ' 4 COL keypad
DEFINE KEYPAD_COL_PORT PORTA ' COL port = PORTB
DEFINE KEYPAD_COL_BIT 0 ' COL0 = PORTB.0
DEFINE KEYPAD_DEBOUNCEMS 200 ' debounce delay = 200 mSec
DEFINE KEYPAD_AUTOREPEAT 1 ' use auto-repeat feature
'End of KEYPAD defines
'*********************Includes******
include "C:\PBP\SAMPLES\KeyPad.bas"
'Includes end here
'Code begins here
Pause 500 ' Wait for LCD to startup
start:
@ READKEYPAD _myvar
lcdout $fe, 1
lcdout " Key Value = ",DEC2 myvar
goto start
Bookmarks