Principle Of RFID:
RFID READER MODULE
Pin Description
INTCON (Interrupt Control Register)
PEIE/GIEL:
GIE/GIEH:
PIR1 (Peripheral Interrupt Request 1)
TXIF
RCIF
TXREG
PIE1 (Peripheral Interrupt Enable 1)
TXIE
RCIE
Applications
/* Name : main.c
* Purpose : Source code for RFID interface with ATMEGA16.
* Author : Gemicates
* Date : 2017-09-11
* Website : www.gemicates.org
* Revision : None
*/
// Program to get the 12 byte string and display it on LCD by Polling method:
/*
The RFID unique code is been displayed on LCE
LCD DATA port----PORT B
ctrl port------PORT D
rs-------PD0
rw-------PD1
en-------PD2
*/
#define F_CPU 8000000UL
#define USART_BAUDRATE 9600
#define BAUD_PRESCALE (((F_CPU / (USART_BAUDRATE * 16UL))) - 1)
#include<avr/io.h>
#include<util/delay.h>
#define delay_ms;
#define LCD_DATA PORTA // LCD data port
#define ctrl PORTB
#define en PB2 // enable signal
#define rw PB1 // read/write signal
#define rs PB0 // register select signal
void LCD_cmd(unsigned char cmd);
void init_LCD(void);
void LCD_write(unsigned char data);
void usart_init();
unsigned int usart_getch();
unsigned char i, card[12];
void getcard_id(void);
void LCD_display(void);
int main(void)
{
DDRA=0xff; // LCD_DATA port as output port
DDRB=0x07; // ctrl as output
init_LCD(); // initialization of LCD
delay_ms(50); // delay of 50 milliseconds
usart_init(); // initiailztion of USART
LCD_write_string("Unique ID No."); // Function to display string on LCD
while(1)
{
getcard_id(); // Function to get RFID card no. from serial port
LCD_cmd(0xC0); // to go in second line and zeroth position on LCD
LCD_display(); // a function to write RFID card no. on LCD
}
return 0;
}
void getcard_id(void) // Function to get 12 byte ID no. from rfid card
{
for(i=0;i<12;i++)
{
card[i]= usart_getch(); // receive card value byte by byte
}
return;
}
void LCD_display(void) // Function for displaying ID no. on LCD
{
for(i=0;i<12;i++)
{
LCD_write(card[i]); // display card value byte by byte
}
return;
}
void init_LCD(void)
{
LCD_cmd(0x38); // initializtion of 16x2 LCD in 8bit mode
_delay_ms(1);
LCD_cmd(0x01); // clear LCD
_delay_ms(1);
LCD_cmd(0x0E); // cursor ON
_delay_ms(1);
LCD_cmd(0x80); // ---8 go to first line and --0 is for 0th position
_delay_ms(1);
return;
}
void LCD_cmd(unsigned char cmd)
{
LCD_DATA=cmd;
ctrl =(0<<rs)|(0<<rw)|(1<<en);
_delay_ms(1);
ctrl =(0<<rs)|(0<<rw)|(0<<en);
_delay_ms(50);
return;
}
void LCD_write(unsigned char data)
{
LCD_DATA= data;
ctrl = (1<<rs)|(0<<rw)|(1<<en);
_delay_ms(1);
ctrl = (1<<rs)|(0<<rw)|(0<<en);
_delay_ms(50);
return ;
}
void usart_init()
{
UCSRB |= (1 << RXEN) | (1 << TXEN); // Turn on the transmission and reception circuitry
UCSRC |= (1 << URSEL) | (1<<USBS) | (1 << UCSZ0) | (1 << UCSZ1);
// Use 8-bit character sizes
UBRRL = 0x51; // Load lower 8-bits of the baud rate value..
// into the low byte of the UBRR register
UBRRH = 0x103; // Load upper 8-bits of the baud rate value..
// into the high byte of the UBRR register
}
unsigned int usart_getch()
{
while ((UCSRA & (1 << RXC)) == 0); // Do nothing until data have been received..
// and is ready to be read from UDR
return(UDR); // return the byte
}
void LCD_write_string(unsigned char *str) // take address value of the string in pointer *str
{
int i=0;
while(str[i]!='\0') // loop will go on till the NULL characters is soon in string
{
LCD_write(str[i]); // sending data on LCD byte by byte
i++;
}
return;
}