• Welcome to our site! Electro Tech is an online community (with over 170,000 members) who enjoy talking about and building electronic circuits, projects and gadgets. To participate you need to register. Registration is free. Click here to register now.

PIC18F4580 - Keyboard start

Status
Not open for further replies.

frahman3

Member
Hi,

I'm trying to start my program which is to ON/OFF LEDs when a character is pressed from the keyboard. In this case the character would be an 'a'. It is simple but the truth is I still could not figure it out what is wrong with the program. I found when I pressed any keys (including the 's') on the keyboard the TX
indicator (UIC008 - usb icsp pic programmer) is blinking which means the data is being transmitted but led connected at RB7 (led2) is still OFF and the program executes the code to ON/OFF the led connected to RB6(led1) & RB7(led2). Is there any file(s) which I need to include? I'm using CCS C compiler ver. 5.010. Please advice.

TQ

Regards
FR
 

frahman3

Member
Sorry i forgot to upload the program code.

FR

CSS:
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)
#use rs232(baud=9600,UART)
#include <stdlib.h>
#include<string.h>



void main(void)
{
 
 set_TRIS_B(0x0F); //PORT B as OUTPUT/INPUT
 set_TRIS_C(0xFF); //PORT C as INPUT

   while(true)
   {
    wait:
    while(!kbhit())
    if(getc()!='s')
        
    {
    
    output_b(10000000);
    delay_ms(1000);
    output_b(00000000);
    delay_ms(1000);
    goto wait;
        
    }
      output_b(00000000);
      delay_ms(500);
      output_b(11000000);
      delay_ms(800);

   }

}
 

rjenkinsgb

Well-Known Member
Most Helpful Member
You do not have a CPU type include line?

If it's a DSPIC or PIC24 (PCD compiler), the output_x instruction is defined as needing a 16 bit value.

The output_bit() instruction may be more appropriate, that controls individual pins.
eg. to set an output high:
output_bit(PIN_B7, 1);

Have you tried setting a breakpoint after the if getc line, to see what is actually happening there?

I'd change to using a variable for the getc() result, then the IF on a separate line.
That allows you to see what was received by looking at the variable.


However --
Looking again, the programs structure seems odd...

The while statement needs something after it, another statement or {} block, which is executed while kbhit returns false.
At the moment that is the getc line...

Try something more like this:

C:
char c;

  while(true)
  {
    wait:
    while(!kbhit())
       ;
    
    
    c = getc();
  
    if(c !='s')
      
    {
...
 

frahman3

Member
Hi,

Finally with some help the code below meets the requirement.

Regards
FR

CSS:
void main(void)
{
 
 set_TRIS_B(0x0F); //PORT B as OUTPUT/INPUT
 set_TRIS_C(0xFF); //PORT C as INPUT

   while(true)
   {
    wait:
    if(!kbhit())
        if(getc()!='s')
        
    {
    
    output_b(10000000);
    delay_ms(1000);
    output_b(00000000);
    delay_ms(1000);
    goto wait;
        
    }
      output_b(00000000);
      delay_ms(500);
      output_b(11000000);
      delay_ms(800);

   }

}
 
Status
Not open for further replies.

Latest threads

EE World Online Articles

Loading
Top