CCS C Software and Maintenance Offers
FAQFAQ   FAQForum Help   FAQOfficial CCS Support   SearchSearch  RegisterRegister 

ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

CCS does not monitor this forum on a regular basis.

Please do not post bug reports on this forum. Send them to CCS Technical Support

kbd.c revisited

 
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion
View previous topic :: View next topic  
Author Message
bofin
Guest







kbd.c revisited
PostPosted: Fri Jul 25, 2003 5:57 pm     Reply with quote

<font face="Courier New" size=-1>hi, I have implemented the code from <a href="http://www.pic-c.com/forum/general/posts/12750.html" TARGET="_blank">http://www.pic-c.com/forum/general/posts/12750.html</a> and it works a treat.
... up to a point. The routine seems to 'fall through'. ie it doesn't wait for a key press before returning.

I am using a 4x4 keypad on port B and an LCD unit on port D on a F877. compiler version 3.083. compiler v3.125 made no difference.

here is a code snippet (part of main()):
void main(void)
{
int number;
char k;

lcd_init();
kbd_init();

while(TRUE){

lcd_putc("\fEnter Command.\n");

k=kbd_getc();
while(k!=0) {
if(k='A')
AllUnits();
else if('B')
GroupUnits();
else if('C')
OneUnit() ;
}
k='\0';
}

one sample routine for calling GroupUnit() {OneUnit() is very similar}

void AllUnits() {
lcd_putc("\fSelect ALL units\nMake anouncement.");
printf("A");
output_low(LED);
}

// select Group
void GroupUnits() {
char k;
int number;
lcd_putc("\fSelect GROUP \nEnter GROUP number");
number=kbd_num();
lcd_putc("\fMake anouncement.");
lcd_putc("\nPress D to finish");
printf("G\%c",number);
output_low(LED);
k=kbd_getc();
while(k!=0) {
if((k=='D')||(k=='F'))
output_high(LED);
}
}

int kbd_num( ){
char i,j,k;
int m;
i=kbd_getc(); lcd_putc(i);
j=kbd_getc(); lcd_putc(j);
k=kbd_getc(); lcd_putc(k);
return(m = i*100 + j*10 + k);
}

Now, I expect the kbd_getc() routine within kbd_num() to wait for the user to push keys and hence dsiplay the numbers entered, but it just cycles through the "Enter Command" part of main().
If I press 'A' for the AllUnits option, the PIC cycles within that routine. The only way out is a reset button on MCLR.


PS I'd like to express my thanks to PCM Programmer for all the hassle he puts up with from us users of the forum.

Thanks for your help with my problem
John</font>
___________________________
This message was ported from CCS's old forum
Original Post ID: 144516380
PCM programmer



Joined: 06 Sep 2003
Posts: 21708

View user's profile Send private message

Re: kbd.c revisited
PostPosted: Fri Jul 25, 2003 6:51 pm     Reply with quote

:=The routine seems to 'fall through'. ie it doesn't wait for a key press before returning.
--------------------------------------------------------

That's the CCS sample code and it expects to be polled
constantly. Here's a quick routine that I whipped out that
will wait for a key to be pressed. I've also shown how to
call it from your main() routine. It will sit there at the
line "k = wait_for_key();" until it gets a key.
When it gets a key, the value will be returned and put in "k".
Then you can test the value of k, and do whatever you want
with it.

<PRE>
This new routine will wait for a key to be pressed.
<BR>
char wait_for_key(void)
{
char c;
<BR>
while(1)
{
c = kbd_getc();
<BR>
if(c)
return(c);
<BR>
delay_us(100);
}
<BR>
}
<BR>

The delay value of 100 us is set to work with the CCS value
of 33, for the keyboard debounce factor. It works OK with
my crystal frequency of 8 MHz. It should probably work OK
with whatever frequency you're using too.

<BR>
//----------------------
main()
{
char k;
<BR>
lcd_init();
kbd_init();
<BR>
lcd_putc("\fReady!\n");
<BR>
while(TRUE)
{
// Comment out these two lines.
// k=kbd_getc();
// if(k!=0)
<BR>
k = wait_for_key(); // <--- Add this line.
if(k=='*')
lcd_putc('\f');
else
lcd_putc(k);
}
}
</PRE>
___________________________
This message was ported from CCS's old forum
Original Post ID: 144516382
bofin
Guest







Re: kbd.c revisited
PostPosted: Mon Jul 28, 2003 4:37 am     Reply with quote

I really want to express my thanks to PCM Programmer for helping me with this. It was a case of being too close to the problem. You know how it gets ....

Thanks
John

:=:=The routine seems to 'fall through'. ie it doesn't wait for a key press before returning.
:=--------------------------------------------------------
:=
:=That's the CCS sample code and it expects to be polled
:=constantly. Here's a quick routine that I whipped out that
:=will wait for a key to be pressed. I've also shown how to
:=call it from your main() routine. It will sit there at the
:=line "k = wait_for_key();" until it gets a key.
:=When it gets a key, the value will be returned and put in "k".
:=Then you can test the value of k, and do whatever you want
:=with it.
:=
:=<PRE>
:=This new routine will wait for a key to be pressed.
:=<BR>
:=char wait_for_key(void)
:={
:=char c;
:=<BR>
:=while(1)
:= {
:= c = kbd_getc();
:=<BR>
:= if(c)
:= return(c);
:=<BR>
:= delay_us(100);
:= }
:=<BR>
:=}
:=<BR>
:=
:=The delay value of 100 us is set to work with the CCS value
:=of 33, for the keyboard debounce factor. It works OK with
:=my crystal frequency of 8 MHz. It should probably work OK
:=with whatever frequency you're using too.
:=
:=<BR>
:=//----------------------
:=main()
:={
:=char k;
:=<BR>
:=lcd_init();
:=kbd_init();
:=<BR>
:=lcd_putc("\fReady!\n");
:=<BR>
:=while(TRUE)
:= {
:= // Comment out these two lines.
:= // k=kbd_getc();
:= // if(k!=0)
:=<BR>
:= k = wait_for_key(); // <--- Add this line.
:= := if(k=='*')
:= lcd_putc('\f');
:= else
:= lcd_putc(k);
:= }
:=}
:=</PRE>
___________________________
This message was ported from CCS's old forum
Original Post ID: 144516422
Display posts from previous:   
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion All times are GMT - 6 Hours
Page 1 of 1

 
Jump to:  
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