PIC18F2550 Memory game PIC c18 programming led off

Thread Starter

elec2010

Joined Mar 1, 2012
4
I am using MPLAB C18 compiler to write c code for a PIC18F2550 which is to control a memory game. The user is to repeat a sequence of flashing LEDs by pressing corresponding buttons. A bit like a old Simon game but with a sequence just happening once.
I have been struggling so far and I have only managed to get a number of LEDs to turn on, but the buttons only turn off the LEDs for a split second then they go on again.
Here's my code so far:

Rich (BB code):
#include <stdio.h>
#include <stdlib.h>
#include <p18f2550.h>
#include <delays.h>
//#pragma config WDT = OFF //Disable watchdog timer
// LED Configuration
#define LED_PIN_0 LATAbits.LATA0 //RA0
#define LED_PIN_1 LATAbits.LATA1 //RA1
#define LED_PIN_2 LATAbits.LATA2 //RA2
#define LED_PIN_3 LATAbits.LATA3 //RA3
#define LED_PIN_4 LATAbits.LATA4 //RA4
#define LED_PIN_5 LATAbits.LATA5 //RA5
#define LED_PIN_6 LATAbits.LATA6 //RA6
// Push Button Configuration
#define PUSH_BUTTON_0 PORTBbits.RB0 //RB0
#define PUSH_BUTTON_1 PORTBbits.RB1 //RB1
#define PUSH_BUTTON_2 PORTBbits.RB2 //RB2
#define PUSH_BUTTON_3 PORTBbits.RB3 //RB3
#define PUSH_BUTTON_4 PORTBbits.RB4 //RB4
#define PUSH_BUTTON_5 PORTBbits.RB5 //RB5
#define PUSH_BUTTON_6 PORTBbits.RB6 //RB6
// Global Variables
int led_array[7] ; // array storing the pin outs
int button_array[7] ;
void main()
{
int i;
ADCON1 = 0b11111111;
TRISA = 0; // sets the LED pins to output
TRISB = 1; // sets pushbutton pins to input
PORTA = 0;
PORTB = 0;
//sequence
led_array[0] = 1 ;
led_array[1] = 0 ;
led_array[2] = 1 ;
led_array[3] = 0 ;
led_array[4] = 1 ;
led_array[5] = 1 ;
led_array[6] = 0 ;
// Configure the LEDs
LED_PIN_0 = led_array[0] ;
LED_PIN_1 = led_array[1] ;
LED_PIN_2 = led_array[2] ;
LED_PIN_3 = led_array[3] ;
LED_PIN_4 = led_array[4] ;
LED_PIN_5 = led_array[5] ;
LED_PIN_6 = led_array[6] ;
// Configure the push button array
PUSH_BUTTON_0 = button_array[0] ;
PUSH_BUTTON_1 = button_array[1] ;
PUSH_BUTTON_2 = button_array[2] ;
PUSH_BUTTON_3 = button_array[3] ;
PUSH_BUTTON_4 = button_array[4] ;
PUSH_BUTTON_5 = button_array[5] ;
PUSH_BUTTON_6 = button_array[6] ;
if ( PUSH_BUTTON_0 == 1 )
{
led_array[0] = 0;
}
if ( PUSH_BUTTON_1 == 1 )
{
led_array[1] = 1;
}
if ( PUSH_BUTTON_2 == 1 )
{
led_array[2] = 0;
}
if ( PUSH_BUTTON_3 == 1 )
{
led_array[3] = 1;
}
if ( PUSH_BUTTON_4 == 1 )
{
led_array[4] = 0;
}
if ( PUSH_BUTTON_5 == 1 )
{
led_array[5] = 0;
}
if ( PUSH_BUTTON_6 == 1 )
{
led_array[6] = 1;
}
}
 

spinnaker

Joined Oct 29, 2009
7,830
I am using MPLAB C18 compiler to write c code for a PIC18F2550 which is to control a memory game. The user is to repeat a sequence of flashing LEDs by pressing corresponding buttons. A bit like a old Simon game but with a sequence just happening once.
I have been struggling so far and I have only managed to get a number of LEDs to turn on, but the buttons only turn off the LEDs for a split second then they go on again.
Here's my code so far:
And what have you done to debug this on your own? Have you stepped through the code with your debugger?
 

Thread Starter

elec2010

Joined Mar 1, 2012
4
I know that the button configurations are backwards but I am using Proteus for simulation and its the only way that i get an output. The code was very different and written properly before i started the simulation but nothing worked there so i removed everything and started again with this basic code trying to get there step by step. Thank you all for your responses.
 

tshuck

Joined Oct 18, 2012
3,534
I know that the button configurations are backwards but I am using Proteus for simulation and its the only way that i get an output. The code was very different and written properly before i started the simulation but nothing worked there so i removed everything and started again with this basic code trying to get there step by step. Thank you all for your responses.
You may get an output, but you aren't going to get what you want. How do you know everything was working properly? If it was working properly, why dismantle it and simulate a different function?
 

ErnieM

Joined Apr 24, 2011
8,415
In other words.

while(1);


at the very end of your code.
Well, perhaps a bit more, unless the player is supposed to remember a sequence of LEDs before they are shown, simultaneously press 1 to 7 buttons before even turning on the power... then guessing if he got it correct.

I'd thing something like this is in order:

- Display random LED sequence
- wait till any key pressed
- blank all LEDs
- start timer
- loop
- if button pressed toggle that LED, reset timer
- if timer expires, exit this loop
- compare lit LEDs to goal sequence and display results
- wait till any key pressed, then do it all over again.
 

Thread Starter

elec2010

Joined Mar 1, 2012
4
I made some changes based on what you said. I added a super loop and two counters. The first counter (keypress) checks if a button is pressed an turns the sequence off. The second counter (a) is supposed to check if the correct buttons were pressed but it doesn't. I want it to check if the correct buttons are pressed and if yes to exit the program else to start again from the begining. This is my code so far :
#include <stdio.h>
#include <stdlib.h>
#include <p18f2550.h>
#include <delays.h>
//#pragma config WDT = OFF //Disable watchdog timer
// LED Configuration
#define LED_PIN_0 LATAbits.LATA0 //RA0
#define LED_PIN_1 LATAbits.LATA1 //RA1
#define LED_PIN_2 LATAbits.LATA2 //RA2
#define LED_PIN_3 LATAbits.LATA3 //RA3
#define LED_PIN_4 LATAbits.LATA4 //RA4
#define LED_PIN_5 LATAbits.LATA5 //RA5
#define LED_PIN_6 LATAbits.LATA6 //RA6
// Push Button Configuration
#define PUSH_BUTTON_0 PORTBbits.RB0 //RB0
#define PUSH_BUTTON_1 PORTBbits.RB1 //RB1
#define PUSH_BUTTON_2 PORTBbits.RB2 //RB2
#define PUSH_BUTTON_3 PORTBbits.RB3 //RB3
#define PUSH_BUTTON_4 PORTBbits.RB4 //RB4
#define PUSH_BUTTON_5 PORTBbits.RB5 //RB5
#define PUSH_BUTTON_6 PORTBbits.RB6 //RB6
// Global Variables
int led_array[7] ; // array storing the pin outs
int button_array[7] ;
void led_off();
void check();
void main()
{
int i;
int a = 0;
int keypress = 0;
ADCON1 = 0b11111111;
TRISA = 0; // sets the LED pins to output
TRISB = 1; // sets pushbutton pins to input
PORTA = 0;
PORTB = 0;
// Configure the LEDs
led_array[0] = LED_PIN_0 ;
led_array[1] = LED_PIN_1 ;
led_array[2] = LED_PIN_2 ;
led_array[3] = LED_PIN_3 ;
led_array[4] = LED_PIN_4 ;
led_array[5] = LED_PIN_5 ;
led_array[6] = LED_PIN_6 ;
// Configure the push button array
button_array[0] = PUSH_BUTTON_0;
button_array[1] = PUSH_BUTTON_1;
button_array[2] = PUSH_BUTTON_2;
button_array[3] = PUSH_BUTTON_3;
button_array[4] = PUSH_BUTTON_4;
button_array[5] = PUSH_BUTTON_5;
button_array[6] = PUSH_BUTTON_6;
//sequence
LED_PIN_0 = 1 ;
LED_PIN_1 = 0 ;
LED_PIN_2 = 1 ;
LED_PIN_3 = 0 ;
LED_PIN_4 = 1 ;
LED_PIN_5 = 1 ;
LED_PIN_6 = 0 ;
while(1){
if ( PUSH_BUTTON_0 == 1 )
{
LED_PIN_0 = 0;
keypress ++;
a++;
}
if ( PUSH_BUTTON_1 == 1 )
{
LED_PIN_1 = 1;
keypress ++;
}
if ( PUSH_BUTTON_2 == 1 )
{
LED_PIN_2 = 0;
keypress ++;
a++;
}
if ( PUSH_BUTTON_3 == 1 )
{
LED_PIN_3 = 1;
keypress ++;
}
if ( PUSH_BUTTON_4 == 1 )
{
LED_PIN_4 = 0;
keypress ++;
a++;
}
if ( PUSH_BUTTON_5 == 1 )
{
LED_PIN_5 = 0;
keypress ++;
a++;
}
if ( PUSH_BUTTON_6 == 1 )
{
LED_PIN_6 = 1;
keypress ++;
}
led_off(keypress);
check(a);
};
}
void led_off(int kp)
{
if(kp != 0){
LED_PIN_0 = 0 ;
LED_PIN_1 = 0 ;
LED_PIN_2 = 0 ;
LED_PIN_3 = 0 ;
LED_PIN_4 = 0 ;
LED_PIN_5 = 0 ;
LED_PIN_6 = 0 ;
}
}
void check(int a1)
{
if (a1 == 4)
{LED_PIN_0 = 1 ;
LED_PIN_1 = 1 ;
LED_PIN_2 = 1 ;
LED_PIN_3 = 1 ;
LED_PIN_4 = 1 ;
LED_PIN_5 = 1 ;
LED_PIN_6 = 1 ;
}
else
{
LED_PIN_0 = 1 ;
LED_PIN_1 = 0 ;
LED_PIN_2 = 1 ;
LED_PIN_3 = 0 ;
LED_PIN_4 = 1 ;
LED_PIN_5 = 1 ;
LED_PIN_6 = 0 ;
}
}
 

tshuck

Joined Oct 18, 2012
3,534
Your TRISB is being set to 0x01, I think you mean to set it to 0xFF, otherwise, RB0 is an input, while all others are output...
 
Top