|
|
View previous topic :: View next topic |
Author |
Message |
freyanicole
Joined: 24 Feb 2008 Posts: 2
|
keypad help, please |
Posted: Sun Feb 24, 2008 10:47 pm |
|
|
good day everyone, i'm trying to use a keypad with 16F877A but to no avail, i just can't make it work right. it's still unfinished, but completing a subroutine for the first part is already very complicated for me. please help.
it should go like:
1) input 1-10, and then store the entered value and proceed to a subroutine
(i have created a subroutine for the "1" yet)
2) at the specified subroutine, it should choose from 0 or #. 0 means that you actually input 10, and pressing # means that the input is 1 only.
3) another subroutine goes whether the user sets 1 or 10. the problem, i think, goes with the program itself, maybe someone can help me spot where the fault is..
another problem is when i am using BREAK in switch, isn't it that the other conditions (or cases) should not be followed? i mean, it should terminate itself on that case where it fits, right? that doesn't happen with my code...
here's the datasheet of my LCD:
http://pdf1.alldatasheet.com/datasheet-pdf/view/127934/ETC/JHD162A.html
and for my keypad, it's an alphanumeric one, 4x4 with ABCD's at the rightmost row.. (blue keypad, is that how you guys call it?)
here's my code, written in CCS...
Code: | #include "D:\All SP\all programs\keypad\keypad.h"
#include <LCD.C>
#include <KBD.C>
void time10()
{
char t10;
lcd_putc("\finterval: 0=exit");
lcd_putc("\n3,4,6,8,12,24");
do
{
t10=kbd_getc();
while(1)
{
if (t10==3 || t10==4 || t10==6 || t10==1 || t10==2)
{
if (t10==1 || t10==2)
{
if (t10==1)
{
lcd_putc("\fevery 12 hrs");
}
else
{
lcd_putc("\fevery 24 hrs");
}
}
else
{
lcd_putc("\fevery ");
lcd_putc(t10);
lcd_putc(" hours");
}
}
}
} while(t10!=0);
}
void two_digit()
{
char digit2;
lcd_putc("\f0 or #\n");
while(TRUE)
{
digit2=kbd_getc();
if(digit2=='*')
{
lcd_putc("\fexit");
}
else
{
switch(digit2)
{
case '0':
lcd_putc("\fpt 10");
delay_ms(300);
time10();
break;
case '#':
lcd_putc("\fpt 1");
break;
}
}
}
}
void main()
{
char k;
setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
setup_psp(PSP_DISABLED);
setup_spi(SPI_SS_DISABLED);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
lcd_init();
kbd_init();
// TODO: USER CODE!!
port_b_pullups(TRUE);
lcd_putc("\fenter patient #\n");
while (TRUE)
{
k=kbd_getc();
if(k!=0)
switch(k)
{
case '1':
lcd_putc("\f1");
two_digit();
break;
case '2':
lcd_putc("\f2"); //still working on a subroutine for this
break;
case '3':
lcd_putc("\f3"); //still working on a subroutine for this
break;
default:
lcd_putc("\fInvalid");
}
}
} |
|
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Mon Feb 25, 2008 12:26 am |
|
|
I didn't try to figure out how your program works. I just looked for errors.
In the code below, you're calling kbd_getc() and comparing the result to
various integers. But that routine doesn't return integers. It returns
ASCII values from '0' to '9'. You need to add single quotes around the
numbers below, so they will be ASCII values.
Code: |
t10=kbd_getc();
while(1)
{
if (t10==3 || t10==4 || t10==6 || t10==1 || t10==2)
{
if (t10==1 || t10==2)
|
|
|
|
Wayne_
Joined: 10 Oct 2007 Posts: 681
|
|
Posted: Mon Feb 25, 2008 3:11 am |
|
|
You have 2 other problems as well.
As far as I can tell your switch routine should work fine. The problem is that you have an infinite loop which you will never exit.
The same goes for the time10() routine.
you shouldn't need either of them unless this is your intention.
You can also tidy up the if conditions in time10() to make it more efficient (sp).
Code: |
do {
t10=kbd_getc();
if (t10 == '1') {
lcd_putc("\fevery 12 hrs");
} else if (t10 == '2') {
lcd_putc("\fevery 24 hrs");
} else if (t10== '3' || t10== '4' || t10== '6') {
lcd_putc("\fevery ");
lcd_putc(t10);
lcd_putc(" hours");
}
} while(t10!=0);
|
Are you trying to exit the two_digit routine if '*' is prressed ? Then try this.
Code: |
digit2=kbd_getc();
if(digit2=='*') {
lcd_putc("\fexit");
break; // Exit the while loop! You could put return; here instead but this is cleaner.
}
|
|
|
|
freyanicole
Joined: 24 Feb 2008 Posts: 2
|
|
Posted: Fri Feb 29, 2008 11:19 pm |
|
|
solved the problem, keypad is now working and i can now correctly loop the routines the way i wanted them to...
thanks a lot for the help, everyone.... |
|
|
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|