کد:
#include <mega16.h>
// Alphanumeric LCD Module functions
#asm
.equ __lcd_port=0x1B ;PORTA
#endasm
#include <lcd.h>
#include <string.h>
#include <delay.h>
#include <stdio.h>
//------------------------------
#define door_open PORTD.6
#define alarm PORTD.7
#define yes_pin PINC.2
#define no_pin PINC.3
unsigned char s[15];
unsigned char s1[10];
unsigned char test[]="1400C0B82A";
unsigned char eeprom data_base[100];
unsigned char valid_id,i=0,j;
unsigned char yes_no_check;
bit start_flag=0,read_flag=0,up_down_flag=0,usart_flag=1;
//------------------------------------------------------
void show_eeprom(unsigned char block_number);
unsigned char search_eeprom(void);
void check_in(void);
void set_up(void);
unsigned char delet_eeprom(unsigned char block_number);
unsigned char write_eeprom(unsigned char block_number);
unsigned char yes_no();
//-------------------------------------------
interrupt [USART_RXC] void usart_rx_isr(void)
{
unsigned char usart_data;
usart_data=UDR;
if(usart_flag)
{
if (usart_data==0x02) start_flag=1;
if (start_flag&i<15)
{
s[i]=usart_data;
i++;
}
if (usart_data==0x03)
{
start_flag=0;
read_flag=1;
i=0;
}
}
}
//------------------------------------------
interrupt [EXT_INT0] void ext_int0_isr(void)
{
if(up_down_flag)
{
delay_us(200);
if(!PIND.2)
if(valid_id<9)
{
valid_id++;
show_eeprom(valid_id);
}
}
}
//-----------------------------------------
interrupt [EXT_INT1] void ext_int1_isr(void)
{
if(up_down_flag)
{
delay_us(200);
if(!PIND.3)
if(valid_id>0)
{
valid_id--;
show_eeprom(valid_id);
}
}
}
//-----------------------------------------
void main(void)
{
PORTA=0x00;
DDRA=0x00;
PORTB=0x00;
DDRB=0x00;
PORTC=0x03;
DDRC=0x00;
PORTD=0x8C;
DDRD=0xC0;
//---------------------------
GICR|=0xC0;
MCUCR=0x0A;
MCUCSR=0x00;
GIFR=0xC0;
TIMSK=0x00;
//---------------------------
UCSRA=0x00;
UCSRB=0x90;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x4D;
// LCD module initialization
lcd_init(16);
// Global enable interrupts
#asm("sei")
for(j=0;j<10;j++)
{
data_base[j+50]=test[j];
}
check_in();
while (1)
{
if(read_flag)
{
read_flag=0;
usart_flag=0;
//-----------------------------------------
switch(PINC&0x03)
{
//--------------------------Check in Mode
case 0:
for(j=0;j<10;j++)
{
s1[j]=s[j+1];
}
valid_id=search_eeprom();
if(valid_id>=0&valid_id<10)
{
door_open=1;
alarm=0;
lcd_clear();
lcd_putsf("Valid Card>NO.");
lcd_putchar(valid_id+0x30);
lcd_gotoxy(0,1);
for(j=0;j<10;j++)
{
lcd_putchar(s1[j]);
}
delay_ms(100);
alarm=1;
delay_ms(3000);
door_open=0;
check_in();
}
else
{
lcd_clear();
lcd_putsf("Invalid Card!");
delay_ms(2000);
check_in();
}
break;
//------------------------------Setup Mode
case 3:
for(j=0;j<10;j++)
{
s1[j]=s[j+1];
}
valid_id=search_eeprom();
if(valid_id>=0&valid_id<10)
{
//------------------Exist Card
lcd_clear();
lcd_putsf("Already Exist:");
lcd_gotoxy(0,1);
lcd_putsf("NO.");
lcd_putchar(valid_id+0x30);
lcd_putsf(" ");
for(j=0;j<10;j++)
{
lcd_putchar(s1[j]);
}
delay_ms(3000);
lcd_gotoxy(0,1);
lcd_putsf(" ");
lcd_gotoxy(0,1);
lcd_putsf("Delete it? Y/N");
yes_no_check=yes_no();
if(yes_no_check==1)
{
delet_eeprom(valid_id);
lcd_clear();
lcd_putsf("Block No: ");
lcd_putchar(valid_id+0x30);
lcd_gotoxy(0,1);
lcd_putsf("Delete Complete!");
delay_ms(3000);
set_up();
}
else if(yes_no_check==0)
{
lcd_clear();
lcd_putsf("No delete!");
delay_ms(2000);
set_up();
}
}
else
{
//--------------------New Card
lcd_clear();
lcd_putsf("New Card:");
lcd_gotoxy(0,1);
lcd_putsf("Save it? Y/N");
yes_no_check=yes_no();
if(yes_no_check==1)
{
lcd_clear();
lcd_putsf("Select Block:");
lcd_gotoxy(0,1);
lcd_putsf("Using UP/DOWN...");
delay_ms(2000);
up_down_flag=1;
valid_id=0;
show_eeprom(valid_id);
yes_no_check=yes_no();
up_down_flag=0;
if(yes_no_check==1)
{
if(write_eeprom(valid_id))
{
lcd_clear();
lcd_putsf("Block No: ");
lcd_putchar(valid_id+0x30);
lcd_gotoxy(0,1);
lcd_putsf("Save Complete!");
delay_ms(3000);
set_up();
}
}
else if(yes_no_check==0)
{
lcd_clear();
lcd_putsf("No save!");
delay_ms(2000);
set_up();
}
}
else if(yes_no_check==0)
{
lcd_clear();
lcd_putsf("No save!");
delay_ms(2000);
set_up();
}
}
break;
default:
//------------------Not Allow Mode
lcd_clear();
lcd_putsf("Not Allow!");
delay_ms(2000);
check_in();
}
}
usart_flag=1;
};
}
//-------------------------------------
unsigned char search_eeprom()
{
unsigned char k,p,ret_val;
bit test_flag;
for(p=0;p<10;p++)
{
ret_val=p;
test_flag=1;
for(k=0;k<10;k++)
if(s1[k]!=data_base[p*10+k])
{
ret_val=20;
test_flag=0;
}
if(test_flag==1)
break;
}
return(ret_val);
}
//-------------------------------------
void check_in(void)
{
lcd_clear();
lcd_putsf("Welcome:");
lcd_gotoxy(0,1);
lcd_putsf(">>> Check in <<<");
}
//-------------------------------------
void set_up(void)
{
lcd_clear();
lcd_putsf("Setup:");
lcd_gotoxy(0,1);
lcd_putsf(">>Insert Card<<");
}
//-------------------------------------
unsigned char yes_no(void)
{
unsigned char yes_no_ret=0;
while(yes_pin&no_pin)
{
delay_us(50);
}
if(!yes_pin&no_pin)
yes_no_ret=1;
return(yes_no_ret);
}
//-------------------------------------
unsigned char delet_eeprom(unsigned char block_number)
{
char i;
for(i=0;i<10;i++)
{
data_base[block_number*10+i]=0xFF;
}
return(1);
}
//-------------------------------------
unsigned char write_eeprom(unsigned char block_number)
{
char i;
for(i=0;i<10;i++)
{
data_base[block_number*10+i]=s1[i];
}
return(1);
}
//-------------------------------------
void show_eeprom(unsigned char block_number)
{
char i;
lcd_clear();
lcd_putsf("Block No>");
lcd_putchar(block_number+0x30);
lcd_gotoxy(0,1);
lcd_putsf("ID>");
for(i=0;i<10;i++)
{
lcd_putchar(data_base[block_number*10+i]);
}
}