/**************************************************
Function: CheckButtons();
Description:
check buttons ,if have press,read the key values,
turn on led and transmit it; after transmition,
if received ACK, clear TX_DS interrupt and enter RX Mode;
turn off the led
/**************************************************/
void CheckButtons()
{
uchar Temp,xx,Tempi;
P0=0xff;
Temp=P0&0x0f; //read key value from port P0
if (Temp!=0x0f)
{
delay_ms(10);
Temp=P0&0x0f; // read key value from port P0
if (Temp!=0x0f)
{
xx=Temp;
Tempi=Temp<<4; // Left shift 4 bits
P0=Tempi; // Turn On the led
tx_buf[0]=Tempi; // Save to tx_buf[0]
TX_Mode(); // set TX Mode and transmitting
TxData(xx); // send data to uart
//check_ACK(); // if have acknowledgment from RX device,turn on all led
SPI_RW_Reg(WRITE_REG+STATUS,SPI_Read(READ_REG+STATUS));
delay_ms(200);
P0=0xff; // Turn off the led
RX_Mode(); // set receive mode
while((P0&0x0f)!=0x0f);
}
}
}
/**************************************************/
/**************************************************
Function: main();
Description:
control all subprogrammes;
/**************************************************/
void main(void)
{
uchar xx;
init_io(); // Initialize IO port
Inituart(); // initialize 232 uart
init_int0(); // enable int0 interrupt
RX_Mode(); // set RX mode
while(1)
{
CheckButtons(); // scan key value and transmit
if(flag) // finish received
{
flag=0; // set flag=0
P0=rx_buf[0]; // turn on led
delay_ms(200);
P0=0xff; // turn off led
xx=rx_buf[0]>>4;// right shift 4 bits
TxData(xx); // send data to uart
}
}
}
/**************************************************/
/**************************************************
Function: ISR_int0() interrupt 0;
Description:
if RX_DR=1 or TX_DS or MAX_RT=1,enter this subprogram;
if RX_DR=1,read the payload from RX_FIFO and set flag;
/**************************************************/
void ISR_int0(void) interrupt 0
{
sta=SPI_Read(STATUS); // read register STATUS's value
if(RX_DR) // if receive data ready (RX_DR) interrupt
{
SPI_Read_Buf(RD_RX_PLOAD,rx_buf,TX_PLOAD_WIDTH);//Read receive payload
flag=1;
}
if(MAX_RT)
{
SPI_RW_Reg(FLUSH_TX,0);
}
SPI_RW_Reg(WRITE_REG+STATUS,sta);// clear RX_DR or TX_DS or MAX_RT interrupt flag
}
/**************************************************/