calculator-like code entry with matrix keypad and display
Hi all
In a part of the project I am busy building I would like to type in a few numbers using a 4x4 matrix keypad ..for example the number 123
The keypad portion works well so far (I am using the example from mister_e in the code examples area of the forums)
What I am battling with is how to get the digits that are typed in to display on the LCD and then send them only after a # or * is keyed in.
This operation is very similar to the way a calculator or code entry system acts.
So let's say for example I type in the number 123#
If a mistake is made the * key could backspace or clear the display with a prompt to try again (I haven't yet worked out whether to use and array or a select case statement or a bunch of if then statements)
I would like all digits typed in to be displayed on the LCD (just like a calculator/phone/code entry system)
I store the 3 digits in an array datatx[3]
Then I add the three digits datatx[0]+datatx[1]+datatx[2]
(This should give me a single binary number right ?)
once I have that number I would like to send it to the PC using HSEROUT
Here's the code I have so far,
Code:
'*************************************
'Keypress display on LCD and TX to wherever
'*************************************
'Ocsillator selections here
OSCCON = $70 'Int CLK 8MHz
OSCTUNE.6 = 1 'PLL 4x
ADCON1= %00001111 '$0F = disable A/D converter
cmcon = 7
INTCON2.7 = 0 'switch pull-ups ON
'END of oscillator selections
'timer/oscillator defines
DEFINE OSC 32 '4x 8MHz
'END of timer/oscillator defines
'Port IO directions and presets for port pins begin here
'TRISX = %76543210 << tris bit order numbering
'TRISA = %11111111 'All pins are outputs
'// Define port pins as inputs and outputs ...
TRISA = %00000000 'example only - TRISB = %00001111 ;Make B4-B7 outputs, B0-B3 inputs,
TRISB = %11111111 'for 4x4 keypad all input
TRISC = %10010000
TRISD = %00000000
TRISE.0 = 0
TRISE.1 = 0
TRISE.2 = 0
'End of Port IO directions and presets for port pins begin here
'variables begin here
A0 var byte
myvar var byte
datatx var byte [3]
datarx var byte
counter var byte
'net var byte
'end of variables
'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
'includes begin here
INCLUDE "modedefs.bas"
include "c:\pbp\samples\keypad.bas"
'end of includes
DEFINE HSER_RCSTA 90h ' Enable serial port & continuous receive
DEFINE HSER_TXSTA 20h ' Enable transmit, BRGH = 0
DEFINE HSER_SPBRG 207 ' 2400 Baud @ 32MHz, 0.17%
DEFINE HSER_CLROERR 1 ' Clear overflow automatically
'Keypad code begins here
DEFINE KEYPAD_ROW 4 ' 4 ROW keypad
DEFINE KEYPAD_ROW_PORT PORTB ' ROW port = PORTB
DEFINE KEYPAD_ROW_BIT 0 ' ROW0 = PORTB.4
DEFINE KEYPAD_COL 4 ' 4 COL keypad
DEFINE KEYPAD_COL_PORT PORTB ' COL port = PORTB
DEFINE KEYPAD_COL_BIT 4 ' COL0 = PORTB.0
DEFINE KEYPAD_DEBOUNCEMS 200 ' debounce delay = 200 mSec
DEFINE KEYPAD_AUTOREPEAT 1 ' use auto-repeat feature
'end keypad code
'keypad capture code begins here
Pause 2000 ' Wait for LCD to startup
start: 'mister_e's keypad code
lcdout "1=send 2=program 3=
for counter = 0 to 3
@ READKEYPAD _myvar 'read keypress variable
LOOKUP myvar,[0,"123A456B789C*0#D"],myvar 'use lookup table to diplay proper keypress
datatx = myvar 'pass the variable to solve strange character problem
lcdout "begin is ", dec datatx(0),dec datatx(1),dec datatx(2),dec datatx(3) 'display the variable on the LCD
if datatx = "#" then goto TX
'if datatx = "*" then goto clearkeys
pause 1000
Lcdout $fe,1
next counter
if counter = 3 then goto clearkeys
goto start
TX:
hserout ["i got this string of numbers",$0d,$0a]
HSEROUT ["1st digit ", dec datatx(0),$0d,$0a]
HSEROUT ["2nd digit ", dec datatx(1), $0d,$0a]
HSEROUT ["3rd digit ", dec datatx(2), $0d,$0a]
goto start
clearkeys:
datatx = 0
goto start
end
At this stage:
The LCD shows the 3 digits but only the first one ever changes
Hserout sends the data to the PC but the values are always the same.
I would really appreciate it if someone could help point out where I am going wrong
Kind regards
Dennis
I'm all for keeping it simple !
Joe S and Al thanks so much for the reply !!
And both your codes snippets work like a charm !
I love the DIG command ...very cool !
They certainly did simplify mine somewhat :-)
OK so here's the deal so far.
The HSEROUT line is working well !
Each decimal digit is displayed correctly and in the correct order!
So a number like 123 gets sent and displayed correctly :-)
Now what remains is what I have been on about since the beginning of this thread and that is the following.
I need to get each keypress stored in an array and then 'JOIN' (either by adding them or some other method ) them up into one number..that's why I went off on a tangent in the last post.
All I would like to do is be able to send one bye or word containing the actual number keyed in.
I would like to be able to key in the number 123 (and see it on screen) and then send it as the actual number 123 decimal or binary or hex ...just not as 3 separate bytes. Consider the same thing being done with a bank of 8 dip switches ... I set the dip switches to reflect the number 123 (bin=11110111 and hex =A3) and that's what I would read in and send.
But this seems to be rather difficult to do using a keypad not so ?
Again any suggestions etc would be greatly appreciated
Kind regards
Dennis