What am I doing wrong?


Closed Thread
Results 1 to 8 of 8

Hybrid View

  1. #1

    Default What am I doing wrong?

    On Bruce's website he has an example of a sixteen key serial keypad, I am trying to modify it for my use on PortB.
    On PortB using a 16f628a, I have my rows on PortB.1-3 and my Columns are 4-7, so using this particular piece which by the way works very well using it as Bruce's example shows on his web page:
    FOR row = 0 TO 3 ' 4 rows in keypad
    PORTB = 0 ' All output-pins low
    TRISB = (DCD row) ^ $ff ' Set one row pin to output
    col = PORTB >> 4 ' Read columns
    IF col != $f THEN gotkey' If any keydown, exit
    NEXT row

    gotkey: ' Change row and column to key number 1 - 16
    key = (row * 4) + (NCD (col ^ $f))
    'NOTE: for 12-key keypad, change to key = (row * 3)
    It had to be adjusted to compensate for for the keypad shifting left one bit

    FOR row = 1 TO 3 ' I changed this since my row is actually using bit 1-3 is this correct???
    'row is a variable and 1 to 3 would mean bit 1-3 correct and how can I sum up
    'to account for bit 0 not being used?
    PORTB = 0 ' All output-pins low
    TRISB = (DCD row) ^ $fe ' I changed this to $fe so that PortB.0 will be low when the bits are flipped "^$fe"
    col = PORTB >> 4 ' Read columns
    IF col != $f THEN gotkey' If any keydown, exit
    NEXT row

    gotkey: ' Change row and column to key number 1 - 16
    key = (row * 3) + (NCD (col ^ $f)) 'As noted above I am only using three rows instead of four
    Either way I am coming out with duplicate numbers like key = 5 etc.

    What am I doing wrong?
    Thanks again

  2. #2
    Join Date
    Nov 2003
    Location
    Wellton, U.S.A.
    Posts
    5,924


    Did you find this post helpful? Yes | No

    Default

    Not sure but
    Code:
    key = (row * 4) + (NCD (col ^ $f))
    'NOTE: for 12-key keypad, change to key = (row * 3)
    And please use code tags, makes it easier to read...
    Dave
    Always wear safety glasses while programming.

  3. #3


    Did you find this post helpful? Yes | No

    Default

    Thanks Mackrackit, I tried that but that doesn't work right either. I first thought since the orginal code had "row = 0 to 3, and I am using TRISB = (DCD row) ^ $fe that it would seem that I would have to state "row = 1 to 3" the $fe in TRISB = (DCD row) ^ $fe allows for when I flip the bits to set only one to output bit 0 becomes an input, I am using bit 0 for my interrupt in which when no key is pressed it goes to sleep and right before I go back to the main program I do this:
    CMCON=%00000111
    vrcon = 0
    pauseus 10
    TRISB = $fe ' B7-B1 in, B0-out
    PORTB = %00000001 ' All output-pins low except bit 0
    pauseus 10
    intcon.1 = 0 'clears flag
    resume
    then my main program is this:

    enable
    cycle:
    pause 1
    @ Sleep
    @ nop
    @ nop
    goto cycle

    I must admit I am confused about row = 1 to 3, that does mean bit 1-3 in the variable Row doesn't it? if so I thought perhaps I could shift by one bit and account for the change, key = ((row >> 1) * 3) + (NCD (col ^ $f) but that doesn't work either. Anyhow I haven't abandoned the ship yet

    Again, Many thanks for your reply

  4. #4
    Join Date
    Nov 2003
    Location
    Wellton, U.S.A.
    Posts
    5,924


    Did you find this post helpful? Yes | No

    Default

    I am still probably not seeing the problem
    Code:
    FOR row = 0 TO 3        ' 4 rows in keypad
    In your case
    Code:
    FOR row = 0 TO 2        ' 3 rows in keypad
    Or maybe it is wired wrong...
    Dave
    Always wear safety glasses while programming.

  5. #5


    Did you find this post helpful? Yes | No

    Default

    I double checked everything with my Fluke my rows are on Portb. 1,Portb.2,and Portb.3 my columns are on Portb.4 - 7. I had everything setup like the orginal example on Bruce's site and it worked great but I wanted to use Portb.0 for my interrupt, thats when I moved everthing over one bit. It works, about eight functions work correctly but now I can send on two different buttons things like two decimal 7's or 5's , etc. instead of decimal 1-12. When I break the code down on paper to calculate what the output would be it concurs the same thing so thats why I was wondering how I could adjust the code, as far as I can see it has to do with the line "for row = 1 to 3" thats why I asked if 1 to 3 does refer to bit 1-3 in the variable row, and if so how can I compensate for three rows that are now shifted by one bit. I tried to see if ((row >> 1) *3) + (ncd (col ^$fe)) but about the same results.

    Thanks again.
    Last edited by tazntex; - 12th July 2010 at 23:32.

  6. #6
    Join Date
    Nov 2003
    Location
    Wellton, U.S.A.
    Posts
    5,924


    Did you find this post helpful? Yes | No

    Default

    OK, now I think I see what you are doing. Me a little slower than normal today...

    Code:
    row = PORTB & %00001110
    Should isolate bit 1 ,2, and 3.
    Dave
    Always wear safety glasses while programming.

Members who have read this thread : 0

You do not have permission to view the list of names.

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts