mohammad3d
 
 
  Joined: 28 Mar 2009 Posts: 17
  
			
			 
			 
			 
			
			
			
			
			
			
  
		  | 
		
			
				| RDM8800 NFC / RFID Module Driver. | 
			 
			
				 Posted: Sat Oct 13, 2018 3:05 am     | 
				     | 
			 
			
				
  | 
			 
			
				Hi every one.
 
 
I write a simple code for reading data from RDM8800 module via serial pin on 
 
pic 16f877 device.
 
 
I use an 2x16 charater LCD for display UID tag number.
 
Just connect RDM8800 TX pin to PIC RX pin(RC7/RX pin26) and enjoy...
 
 
Main.c
 
 
 	  | Code: | 	 		  
 
//main.c File
 
#include <16F887.h>
 
#FUSES NOWDT                    //No Watch Dog Timer
 
#FUSES NOBROWNOUT               //No brownout reset
 
#FUSES NOLVP                    //No low voltage programing, B3(PIC16) or B5(PIC18) used for I/O
 
#FUSES XT
 
#use delay(crystal=4000000)//Set frequency at 4Mhz
 
#use rs232( baud=9600, parity=N, xmit=PIN_C6, rcv=PIN_C7, bits=8, ERRORS) 
 
#include <C_LCD.h>//2x16 Character LCD driver
 
#define Time_out 200
 
int16 RS232_timeout=0;
 
int8 string_index=1;
 
int8 i=1;
 
char NFC_uid[20];
 
int1 Data_recieve_flag=0;
 
int1 Read_card_flag=1;
 
 
 
void main()
 
{
 
   
 
   lcd_init();//initialize 2x16 caracter LCD
 
   lcd_putc('\f');//Clear screen
 
   lcd_gotoxy(1,1);
 
   printf(lcd_putc,"RDM8800 NFC/RFID");     
 
   lcd_gotoxy(1,2);
 
   printf(lcd_putc,"     READER     ");
 
   delay_ms(1000);
 
   lcd_putc('\f');//Clear screen
 
   while(TRUE)
 
   {
 
    RS232_timeout++;
 
    if(Read_card_flag==1)//Permit read serial port
 
       if(kbhit())
 
         { 
 
          RS232_timeout=0; 
 
          NFC_uid[string_index]=getc();
 
          if(string_index==12) Data_recieve_flag=1;//recieve 12 character from RDM8800
 
             else string_index++;               
 
         }      
 
         
 
       if(Data_recieve_flag==1)//receive 12 character successfully
 
         {
 
         
 
          Read_card_flag=0;
 
          Data_recieve_flag=0;
 
          if(NFC_uid[11]==0x0D && NFC_uid[12]==0x0A)//If received stream is correct, with break line "0x0D 0x0A". 
 
            {           
 
             lcd_gotoxy(1,1);
 
             printf(lcd_putc,"Card UID number:");                
 
             delay_ms(1000);
 
             lcd_putc('\f');//Clear screen
 
             //////////// display 10 digit UID number on LCD ////////////
 
             for(i=1;i<=5;i++)
 
                printf(lcd_putc,"%c,",NFC_uid[i]);   
 
                
 
                lcd_gotoxy(1,2);
 
             for(i=6;i<=9;i++)
 
                 printf(lcd_putc,"%c,",NFC_uid[i]); 
 
                 
 
             printf(lcd_putc,"%c",NFC_uid[10]);   
 
             /////////////////////////////////////////////////////////////    
 
             delay_ms(5000);  
 
             lcd_putc('\f');//Clear screen
 
             
 
            }
 
            else ///////// if stream is not correct //////////
 
                {
 
                 lcd_putc('\f');//Clear screen
 
                 lcd_gotoxy(1,1);
 
                 printf(lcd_putc,"Data read error");    
 
                 delay_ms(1000);
 
                }           
 
         }
 
         
 
       if(RS232_timeout>Time_out)///// detect blank time between two stream
 
         {
 
          RS232_timeout=Time_out;
 
          string_index=1;
 
          Data_recieve_flag=0;
 
          lcd_gotoxy(1,1);
 
          printf(lcd_putc,"Checking for Tag");    
 
          Read_card_flag=1;
 
         }       
 
   }
 
} 
 
 | 	  
 
 
C_LCD.h
 
 
 	  | Code: | 	 		  
 
//C_LCD.h file
 
#define _lcd_h_
 
#include <math.h>
 
void lcd_init(void);             
 
byte lcd_read_byte(void);         
 
byte lcd_read_nibble(void);       
 
void lcd_send_byte(byte address, byte n);  
 
void lcd_send_nibble(byte n);   
 
void lcd_gotoxy(byte x, byte y);
 
char lcd_getc(byte x, byte y);    
 
void lcd_putc(char c);           
 
//Define LCD connection Pins
 
#define LCD_RS_PIN         PIN_D1   
 
#define LCD_RW_PIN         PIN_D2
 
#define LCD_ENABLE_PIN     PIN_D3
 
#define LCD_DATA4          PIN_D4
 
#define LCD_DATA5          PIN_D5
 
#define LCD_DATA6          PIN_D6
 
#define LCD_DATA7          PIN_D7 
 
 
#define lcd_output_enable(x)   output_bit(LCD_ENABLE_PIN, x)  
 
#define lcd_enable_tris()   output_drive(LCD_ENABLE_PIN)
 
 
#define lcd_output_rs(x)   output_bit(LCD_RS_PIN, x)  
 
#define lcd_rs_tris()      output_drive(LCD_RS_PIN)
 
 
#define lcd_output_rw(x)   output_bit(LCD_RW_PIN, x)
 
#define lcd_rw_tris()      output_drive(LCD_RW_PIN)
 
 
#define lcd_line_one   0x00   
 
#define lcd_line_two   0x40    
 
#define lcd_line_three   0x14
 
#define lcd_line_four   0x54
 
#define LCD_TYPE 0x02         
 
 
 
byte const LCD_INIT_STRING[4] = {0x28 | (LCD_TYPE << 2), 0x0C, 0x01, 0x06};
 
void lcd_init(void)   
 
{
 
 
byte i;
 
 
output_drive(LCD_DATA4);  
 
output_drive(LCD_DATA5);
 
output_drive(LCD_DATA6);
 
output_drive(LCD_DATA7);
 
 
lcd_enable_tris(); 
 
lcd_rs_tris();
 
lcd_rw_tris();
 
 
lcd_output_rs(0);      
 
lcd_output_rw(0);        
 
lcd_output_enable(0);   
 
 
delay_ms(15); 
 
 
for(i=1;i<=3;i++)       
 
   {               
 
   lcd_send_nibble(0x03);   
 
   delay_ms(5);       
 
   }                
 
                   
 
 
lcd_send_nibble(0x02);      
 
for(i=0;i<=3;i++)
 
   lcd_send_byte(0,LCD_INIT_STRING[i]); 
 
}                            
 
 
// ***************************************************
 
byte lcd_read_byte(void)   
 
{
 
byte low,high;
 
output_float(LCD_DATA4);  
 
output_float(LCD_DATA5);
 
output_float(LCD_DATA6);
 
output_float(LCD_DATA7);
 
 
lcd_output_rw(1);        
 
delay_cycles(1);        
 
lcd_output_enable(1);      
 
delay_cycles(1);         
 
high = lcd_read_nibble();  
 
lcd_output_enable(0);     
 
               
 
delay_cycles(1);        
 
lcd_output_enable(1);     
 
delay_cycles(1);         
 
low = lcd_read_nibble();   
 
lcd_output_enable(0);      
 
 
output_drive(LCD_DATA4);   
 
output_drive(LCD_DATA5);
 
output_drive(LCD_DATA6);
 
output_drive(LCD_DATA7);
 
 
return((high<<4) | low);   
 
}
 
 
// ***************************************************
 
byte lcd_read_nibble(void)   
 
{
 
 
byte n = 0x00;  
 
 
n |= input(LCD_DATA4);        
 
n |= input(LCD_DATA5) << 1;
 
n |= input(LCD_DATA6) << 2;
 
n |= input(LCD_DATA7) << 3;
 
 
return(n);   
 
}
 
 
// ***************************************************
 
void lcd_send_byte(byte address, byte n)   
 
{                                
 
 
lcd_output_rs(0);     
 
while(bit_test(lcd_read_byte(),7));  
 
lcd_output_rs(address);  
 
delay_cycles(1);    
 
lcd_output_rw(0);    
 
delay_cycles(1);     
 
lcd_output_enable(0);   
 
lcd_send_nibble(n >> 4);  
 
lcd_send_nibble(n & 0x0F);  
 
}
 
 
// ***************************************************
 
void lcd_send_nibble(byte n)  
 
{
 
 
output_bit(LCD_DATA4, bit_test(n, 0));  
 
output_bit(LCD_DATA5, bit_test(n, 1));
 
output_bit(LCD_DATA6, bit_test(n, 2));
 
output_bit(LCD_DATA7, bit_test(n, 3));
 
    
 
delay_cycles(1);     
 
lcd_output_enable(1);  
 
delay_us(2);         
 
lcd_output_enable(0);   
 
}
 
 
// ***************************************************
 
void lcd_gotoxy(byte x, byte y)  
 
{
 
 
byte address;
 
 
if(y==1)              
 
   address=lcd_line_one;     
 
else if(y==2)     
 
   address=lcd_line_two;     
 
else if(y==3)
 
   address=lcd_line_three;     
 
else if(y==4)
 
   address=lcd_line_four;   
 
 
address+=x-1;              
 
lcd_send_byte(0,0x80|address);  
 
}                     
 
 
// ***************************************************
 
char lcd_getc(byte x, byte y) 
 
{
 
 
char value;
 
 
lcd_gotoxy(x,y);           
 
while(bit_test(lcd_read_byte(),7));  
 
lcd_output_rs(1);       
 
value = lcd_read_byte();  
 
lcd_output_rs(0);        
 
 
return(value);    
 
}
 
 
// ***************************************************
 
void lcd_putc(char c)  
 
{
 
 
switch (c)
 
   {
 
   case '\f':    
 
      lcd_send_byte(0,0x01);  
 
      delay_ms(2);      
 
      break;
 
   case '\n':      
 
      lcd_gotoxy(1,0x02);     
 
      break;
 
    case '\b':      
 
      lcd_send_byte(0,0x10); 
 
      break;            
 
   default:       
 
      lcd_send_byte(1,c);    
 
      break;
 
   }
 
}      
 
// ***************************************************   
 
 | 	 
  | 
			 
		  |