#include <iom128.h>
#include <ina90.h>
#define TESTBIT(ADDRESS,BIT) (ADDRESS & (1<<BIT))
#define LED_Green (PORTF = 0x7F)
#define LED_Red (PORTF = 0xDF)
#define BUZZER_Toggle (PORTC^=0x01)
char sendbuf[11];
char savebuf[11];
char save1[3];
//unsigned int TimeTick = 0;
/* void _Init_Timer_(void)
{
TIMSK = 0;
TCCR1B |=((1<<CS10) | (1<<CS12));
TCNT1 = 0XE3E0;
TIMSK |=(1<<TOIE1);
_SEI();
}
#pragma vector = TIMER1_OVF_vect
__interrupt void _Timer1_OVF(void)
{
TimeTick++;
TCNT1 = 0xE3E0;
}
*/
void sdelay(unsigned int Dly)
{
while(Dly--);
}//end SDelay
void buzzer(unsigned int times)
{
unsigned int i;
for(i=0;i<times;i++)
{
BUZZER_Toggle;
sdelay(250);
}
}
void LDelay(unsigned int Dly)
{
unsigned int i;
double dd;
for ( i=0; i<Dly ; i++ )
for (dd=0.;dd<100. ;dd+=0.1 );
}
void usart_Init0 (void)
{
DDRD = 0xfe;
UCSR0A = 0x00;
UCSR0B = 0x18;
UCSR0C = 0x06;
UBRR0H = 0x00;
UBRR0L = 8;
}
void usart_Init1 (void)
{
DDRD = 0xfb;
UCSR1A = 0x00;
UCSR1B = 0x18;
UCSR1C = 0x06;
UBRR1H = 0x00;
UBRR1L = 8;
}
void InitPort(void)
{
// DDRE = 0xFE;
DDRC = 0x01;
PORTC = 0x00; // Buzzer
DDRF = 0xA0;
PORTF = 0xFF; //LED
// DDRA = 0x00;
}//end InitPort
unsigned char usart_Receive0 (void) //PC
{
while(!(UCSR0A & 0x80));
return UDR0;
}
void usart_Transmit0(unsigned char tCh0) //PC
{
while (!(UCSR0A & 0x20));
UDR0 = tCh0;
}
unsigned char usart_Receive1 (void) //RFID
{
while(!(UCSR1A & 0x80));
return UDR1;
}
void usart_Transmit1(unsigned char tCh1) //RFID
{
while (!(UCSR1A & 0x20));
UDR1 = tCh1;
}
void Inventory_Request(void) //RFID 에 카드 값 요청
{
usart_Transmit1(0x03);
usart_Transmit1(0x06);
usart_Transmit1(0x01);
usart_Transmit1(0x00);
}
void Rfid_Receive(void)
{
int i;
for(i=0;i<11;i++){
savebuf[i]=usart_Receive1();//RFID에서 오는 tag값 저장
}
sendbuf[0]=savebuf[2];
sendbuf[1]=savebuf[3];
sendbuf[2]=savebuf[4];
sendbuf[3]=savebuf[1];
sendbuf[4]=savebuf[0];
sendbuf[5]=savebuf[10];
sendbuf[6]=savebuf[9];
sendbuf[7]=savebuf[8];
sendbuf[8]=savebuf[7];
sendbuf[9]=savebuf[6];
sendbuf[10]=savebuf[5];
}
void Trans(void)
{
int i;
for(i=0;i<11;i++){// 수신된값 아스키 코드로 변환
switch(sendbuf[i])
{
case 0x40 : sendbuf[i]='a'; break;
case 0x41 : sendbuf[i]='b'; break;
case 0x42 : sendbuf[i]='c'; break;
case 0x0a : sendbuf[i]='d'; break;
case 0x00 : sendbuf[i]='e'; break;
case 0xe0 : sendbuf[i]='f'; break;
case 0x04 : sendbuf[i]='g'; break;
case 0x01 : sendbuf[i]='h'; break;
case 0x0d : sendbuf[i]='i'; break;
case 0x7c : sendbuf[i]='j'; break;
case 0x7e : sendbuf[i]='k'; break;
case 0x1e : sendbuf[i]='l'; break;
}
}
}
void main (void)
{
char ch='0';
int aaa=0;
InitPort();
usart_Init0();
usart_Init1();
while(1){
while (1)
{
LED_Green;
if(TESTBIT(PINA, 5)){
LED_Red;
LDelay(10);
ch='1';
}
if(ch=='1'){
Inventory_Request();//RFID에 tag값 요청
Rfid_Receive();
Trans();
if(sendbuf[10]==save1[0]){ch='0';break;} //카드 중복 체크 방지 위해
else if(sendbuf[10]==save1[1]){ch='0';break;}
else if(sendbuf[10]==save1[2]){ch='0';break;}
else
{
usart_Transmit0(sendbuf[10]);
save1[aaa]=sendbuf[10];
aaa++;
buzzer(800);
ch='0';
}
}
if(TESTBIT(PINA, 3)){usart_Transmit0('x'); LDelay(10);}
if(TESTBIT(PINA, 6)){usart_Transmit0('z'); LDelay(10);}
}
}
}