|
|
View previous topic :: View next topic |
Author |
Message |
Christophe
Joined: 10 May 2005 Posts: 323 Location: Belgium
|
Expression must evaluate to a constant |
Posted: Thu Jun 01, 2006 1:53 am |
|
|
Hello,
this is my keypad matrix scanning code :
in NS.h
Code: | // Definiëer keyboard matrix: 9R x 8K
//Rijen
#define R1 PIN_C0
#define R2 PIN_C1
#define R3 PIN_B1
#define R4 PIN_B2
#define R5 PIN_B3
#define R6 PIN_B4
#define R7 PIN_B5
#define R8 PIN_B6
#define R9 PIN_B7
//Kolommen
#define K1 PIN_D0
#define K2 PIN_D1
#define K3 PIN_D2
#define K4 PIN_D3
#define K5 PIN_D4
#define K6 PIN_D5
#define K7 PIN_D6
#define K8 PIN_D7 |
in main loop:
Code: | //******************************* READ MATRIX ********************************//
void Read_Matrix ()
{
ALLES_LOS = TRUE;
PRESSED = FALSE;
Output_low (R1);
delay_us (100);
temp = input_d (); // Lees de waarde van de poort
Output_float (R1);
if ( (buffer [0] & temp) != buffer [0] ) // er is gedrukt
PRESSED = TRUE;
buffer [0] = buffer [0] & temp; // Onthoud dat er ingedrukt is
if (temp != 255)
Alles_los = FALSE;
// RIJ 2
Output_low (R2);
delay_us(100);
temp = input_d();
Output_float(R2);
if ((buffer[1] & temp) != buffer[1])
Pressed = TRUE;
buffer[1] = buffer [1] & temp;
if (temp != 255)
Alles_los = FALSE;
// RIJ 3
Output_low(R3);
delay_us(100);
temp = input_d();
Output_float(R3);
if ((buffer[2] & temp) != buffer[2])
Pressed = TRUE;
buffer[2] = buffer [2] & temp;
if (temp != 255)
Alles_los = FALSE;
// RIJ 4
Output_low(R4);
delay_us(100);
temp = input_d();
Output_float(R4);
if ((buffer[3] & temp) != buffer[3])
Pressed = TRUE;
buffer[3] = buffer [3] & temp;
if (temp != 255)
Alles_los = FALSE;
// RIJ 5
Output_low(R5);
delay_us(100);
temp = input_d();
Output_float(R5);
if ((buffer[4] & temp) != buffer[4])
Pressed = TRUE;
buffer[4] = buffer [4] & temp;
if (temp != 255)
Alles_los = FALSE;
// RIJ 6
Output_low(R6);
delay_us(100);
temp = input_d();
Output_float(R6);
if ((buffer[5] & temp) != buffer[5])
Pressed = TRUE;
buffer[5] = buffer [5] & temp;
if (temp != 255)
Alles_los = FALSE;
// RIJ 7
Output_low(R7);
delay_us(100);
temp = input_d();
Output_float(R7);
if ((buffer[6] & temp) != buffer[6])
Pressed = TRUE;
buffer[6] = buffer [6] & temp;
if (temp != 255)
Alles_los = FALSE;
// RIJ 8
Output_low(R8);
delay_us(100);
temp = input_d();
Output_float(R8);
if ((buffer[7] & temp) != buffer[7])
Pressed = TRUE;
buffer[7] = buffer [7] & temp;
if (temp != 255)
Alles_los = FALSE;
// RIJ 9
Output_low(R9);
delay_us(100);
temp = input_d();
Output_float(R9);
if ((buffer[8] & temp) != buffer[8])
Pressed = TRUE;
buffer[8] = buffer [8] & temp;
if (temp != 255)
Alles_los = FALSE;
} |
Now this works fine, but you can see that there is many the same code used. So I want to that shorter. This is my idea:
Global const array:
Code: | const char Scan [9] = { PIN_C0, PIN_C1, PIN_B1, PIN_B2, PIN_B3, PIN_B4, PIN_B5,
PIN_B6, PIN_B7 }; |
scanning routine:
Code: | void Read_Matrix ()
{
int8 j;
ALLES_LOS = TRUE;
PRESSED = FALSE;
// RIJ per RIJ inscannen
for ( j = 0 ; j < 9 ; j++ )
{
output_low (Scan [j]);
delay_us (75);
Temp = input_d ();
output_float (Scan [j]);
if ( ( Buffer [j] & Temp ) != Buffer [j] ) // er is gedrukt
PRESSED = TRUE;
Buffer [j] = Buffer [j] & Temp;
if (temp != 255)
ALLES_LOS = FALSE;
}
} |
Now my compîler gives error Expression must evaluate to a constant; I was hoping you guys could give hints on this? |
|
|
ckielstra
Joined: 18 Mar 2004 Posts: 3680 Location: The Netherlands
|
|
|
Christophe
Joined: 10 May 2005 Posts: 323 Location: Belgium
|
|
Posted: Thu Jun 01, 2006 5:33 am |
|
|
thanks,
that was exactly what I needed; thanks for sharing:
Code: | void Read_Matrix ()
{
int8 j;
ALLES_LOS = TRUE;
PRESSED = FALSE;
// RIJ per RIJ inscannen
for ( j = 0 ; j < 9 ; j++ )
{
do_pin_io (Scan [j], 0);
delay_us (75);
Temp = input_d ();
do_pin_io (Scan [j], 2);
if ( ( Buffer [j] & Temp ) != Buffer [j] ) // er is gedrukt
PRESSED = TRUE;
Buffer [j] = Buffer [j] & Temp;
if (temp != 255)
ALLES_LOS = FALSE;
}
}
// do_pin_io() --
// This function will perform an i/o action on a CCS pin.
// The ccs_pin parameter must be a value defined in the .H
// file for your PIC, such as PIN_B0, PIN_C5, etc.
// The CCS pin value and state can be passed in variables.
// The action must be as follows:
// Action = 0: Set the specified pin = 0
// Action = 1: Set the specified pin = 1
// Action = 2: Read the specified pin and return
// its value (0 or 1).
// Any action value > 2 will be treated as 2. For actions
// 0 and 1, the return value has no meaning (but 0 is
// returned).
int8 do_pin_io(int8 ccs_pin, int8 action)
{
int8 io_port;
int8 bitmask;
int8 retval;
int8 const bitmask_table[] = {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
retval = 0;
io_port = ccs_pin >> 3; // Get the i/o port address
bitmask = bitmask_table[ccs_pin & 7];
if(action < 2) // Is this an output action ?
{
*(io_port | 0x80) &= ~bitmask; // Set TRIS = output
if(action)
{
*io_port |= bitmask; // Set pin = 1
}
else
{
*io_port &= ~bitmask; // Set pin = 0
}
}
else // If not, we will read the pin (action = 2)
{
*(io_port | 0x80) |= bitmask; // Set TRIS = input
retval = !!(*io_port & bitmask); // Read pin (ret. 0 or 1)
}
return(retval); // This only has meaning if action = 2
} |
However, when I want to say output_float (SOME_PIN), how can I state that? |
|
|
Ttelmah Guest
|
|
Posted: Thu Jun 01, 2006 5:52 am |
|
|
If you read a pin, it is 'floated'. Output_float, is really just a version of the input function, that doesn't actually return the value. So 'action=2', will do what you want.
Best Wishes |
|
|
|
|
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
|