⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 read125k.c~

📁 125K IC卡读卡器读头源码
💻 C~
📖 第 1 页 / 共 3 页
字号:
/*********************************************
CodeWizardAVR V1.23.9b Standard
Date    : 2006-10-16
Chip type           : ATmega8L
Program type        : Application
Clock frequency     : 8.000000 MHz
Memory model        : Small
External SRAM size  : 0
Data Stack size     : 256
*********************************************/
#include <mega8.h>
#include <stdio.h> 
#include "bit_op.h" 
#include "delay.h" 
#define X_MODE 1
#define Y_MODE 2
#define Z_MODE 3   
#define ON	   1
#define OFF	   0
#define PB0    0
#define PB1    1
 
#define PB3    3 
#define PB5	   5
#define PD4    4
#define PD3    3
#define PD2    2
#define PD5	   5
#define PD6    6
#define PD7	   7 

void 	beep(char count);  
void 	led(char count);
void 	wiegand_decoder_26(void); 
void 	send_wiegand0(void);
void 	send_wiegand1(void);
void 	initalize(void);
void 	key_scan(void); 
void 	read_uid(void); 
void 	key_process(void);
void 	beep_long(char count);

extern void 	Send_IdCode(void);  
extern void 	Get_My_Informat(void);  
extern void 	Set_My_Id(void);
extern void 	Get_My_Id(void);
extern void 	Check_First_Set1(void); 
extern char 	CheckBCC(void);
extern void 	DoBCC(unsigned char *str, unsigned char len );
extern void 	Send_Error_Public(unsigned char ErrorCode);
extern void 	CheckShorCommand(void);
extern void  	CheckLongCommand(void);
extern void 	Recv_process(void); 
unsigned char 	read_head(void); 

unsigned char cmd_word;
bit 	cmd_flag; 

char 	check_bit[5];
char 	key_buf[8];
char 	main_status;
char 	key_status; 
char 	key_result; 
char 	cmd_status;
char 	key_history_result;
char 	key_value;
char 	count;  
char 	data_buf[13];
char 	data_buf1[56];                             
bit 	command_flag;
bit 	err_flag;   
bit   	ok_flag;
bit 	card_ok;    
bit 	id_flag;
bit		change_by_uart;
char	send_status;
char 	send_order;
char  	receive_status; 
char 	weigen_out;           
char	out_485;      
char 	key_len;  
char 	command_count;
char 	key_word_len; 
char 	enable_key;

char	send_96h;

unsigned char head_status;
unsigned char	id_check;
unsigned int 	time_count;

extern  char	BCC_HI;
extern  char  	BCC_LOW;
extern  char 	re_len;   
extern  char 	Recv_buf[20];
extern  char 	Send_buf[20];
char 	eeprom	*ptrto_eeprom;
unsigned int sec;   
unsigned int run_count;
unsigned int stop_count;
unsigned int sec1; 
//================================
flash unsigned char parity_table[]=
{
	0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0,
	1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1,
	1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1,
	0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0,

	1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1,
	0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0,
	0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0,
	1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1,

	1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1,
	0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0,
	0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0,
	1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1,

	0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0,
	1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1,
	1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1,
	0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0 
};
//========================================
#define RXB8 1
#define TXB8 0
#define UPE 2
#define OVR 3
#define FE 4
#define UDRE 5
#define RXC 7

#define FRAMING_ERROR (1<<FE)
#define PARITY_ERROR (1<<UPE)
#define DATA_OVERRUN (1<<OVR)
#define DATA_REGISTER_EMPTY (1<<UDRE)
#define RX_COMPLETE (1<<RXC)

// USART Receiver buffer
#define RX_BUFFER_SIZE 8
char rx_buffer[RX_BUFFER_SIZE];
unsigned char rx_wr_index,rx_rd_index,rx_counter;
// This flag is set on USART Receiver buffer overflow
bit rx_buffer_overflow;

// USART Receiver interrupt service routine
//===========================================
//头55 aa 01 01  修改ID 			ID号   尾 55 AA 
//头55 AA 01 02  修改出厂序列号     序列号 尾 55 AA 
//头55 AA 01 03  修改韦根输出格式   1-4    尾 55 AA 
//头55 AA 01 04  485/韦根使能//9600 1-3    尾 55 AA 
//头55 AA 01 05  键盘是否使能       0-1    尾 55 AA 
//头55 AA 01 06  授权号码功能       8位    尾 55 AA 
//头55 AA 01 07                     1位    尾 55 AA 
//头55 AA 01 08  恢复出厂状态       1位    尾 55 AA 
//===========================================
#pragma savereg-
interrupt [USART_RXC] void uart_rx_isr(void)
{
	char status,data,i;
	#asm
    push r26
    push r27
    push r30
    push r31
    in   r26,sreg
    push r26
	#endasm
	status=UCSRA;
	data=UDR;        
	switch(receive_status)
	{
	case 0:
		if((data ==0X09)){re_len=0;Recv_buf[re_len++]=data;receive_status++;}
		else if(data==0x55){receive_status=10;}
		else receive_status=0;
		break;
	case 1:
		if(data =='H'){Recv_buf[re_len++]=data;receive_status++;}
		else{receive_status=0;}
		break;
	case 2://ID号,同本机器ID号匹配后本机则响应
		//if(data >= 0x30 && data< 0x39)
		{
			Recv_buf[re_len++]=data;		
			receive_status++;
		}
		//else
		//{
		//	receive_status=0;
		//}
		break;
	case 3:
		if(data=='B' ||data=='F'||data=='Z')
		{
			if(Recv_buf[2] ==(id_check+'0'))//这里调过去就OK
			{
				Recv_buf[re_len++]=data;
				receive_status++;
			}
			else
			{
				receive_status=0;			
			}	
		}
		else if(data=='C'||data=='D')
		{
			Recv_buf[re_len++]=data;
			receive_status++;
		}
		else
		{	receive_status=0;
		}        
		break;
	case 4://B命令和G命令不接收数据
		Recv_buf[re_len++]=data;
		if(data==0x0D)
		{
			command_count++;
			re_len--;
			command_flag=1;
			receive_status=0;
			delay_ms(1);
		}
		break;
    case 10:
    	if(data==0xaa){receive_status++;}
    	else{receive_status=0;}
    	break;                 
	case 11:
		if(data==0x01){receive_status++;}
		else {receive_status=0;}
		break;
	case 12:
		if(data==0x01){receive_status=20;key_len=0;}
		else if(data==0x02){receive_status=30;key_len=0;}
		else if(data==0x03){receive_status=40;key_len=0;}
		else if(data==0x04){receive_status=50;key_len=0;}
		else if(data==0x05){receive_status=60;key_len=0;}
		else if(data==0x06){receive_status=70;key_len=0;}
		else if(data==0x07){receive_status=80;key_len=0;}
		else if(data==0x08){receive_status=90;key_len=0;}
		else {receive_status=0;}
		break;
	//修改id号				
	case 20:
		//if(data>=0 && data<10)
		{
			key_buf[0]=data;
			receive_status++;
		}
		//else receive_status=0;
		break;
	case 21:
		if(data==0x55) receive_status++;
		else receive_status=0;
		break;
	case 22:
		if(data==0xaa)
		{
			cmd_flag=1;
			cmd_word=1;			
		}
		receive_status=0;
		break;		
	//修改出厂序列号		
	case 30:
		key_buf[key_len++]=data; 	
		if(key_len==8){receive_status++;}
		break;
	case 31:
		if(data == 0x55){receive_status++;}
		else{receive_status=0;}
		break;
	case 32:
		if(data == 0xaa)
		{
			receive_status=0; 
			cmd_flag=1;
			cmd_word=2;
		}
		receive_status=0;
		break;			
	//韦根输出格式
	case 40:
	    if(data==1||data==2||data==3||data==4)
	    {
			key_buf[0]=data;
			receive_status++;
	    }
	    else receive_status=0;
		break;
	case 41:
		if(data==0x55) receive_status++;
		else receive_status=0;
		break;
	case 42:
		if(data==0xaa)
		{
			cmd_flag=1;
			cmd_word=3;
		}
		receive_status=0;
		break;					
	//韦根 485使能选择	
	case 50:
	    if(data==1||data==2||data==3)
	    {
			key_buf[0]=data;
			receive_status++;
	    }
	    else receive_status=0;
	    break;
	case 51:	    
		if(data==0x55)receive_status++;
		else receive_status=0;
		break;  
	case 52:
		if(data==0xaa)
		{
			cmd_flag=1;
			cmd_word=4;			
		}
		receive_status=0;
		break;		
	//键盘是否使能  
	case 60:
	    if(data==0||data==1)
	    {
			key_buf[0]=data;
			receive_status++;
	    }
	    else receive_status=0;
	    break;
	case 61:	    
		if(data==0x55)receive_status++;
		else receive_status=0;
		break;  
	case 62:
		if(data==0xaa)
		{
			cmd_flag=1;
			cmd_word=5;			
		}
		receive_status=0;
		break;
	//授权号码	 
	case 70:
		key_buf[key_len++]=data; 	
		if(key_len==8){receive_status++;}
		break;
	case 71:
		if(data == 0x55){receive_status++;}
		else{receive_status=0;}
		break;
	case 72:
		if(data == 0xaa)
		{
			cmd_flag=1;
			cmd_word=6;
		}
		receive_status=0;
		break;
	//修改一个韦根输出以验证EEPROM丢失
	case 80:
		key_buf[0]=data; 	
		receive_status++;
		break;
	case 81:
		if(data == 0x55){receive_status++;}
		else{receive_status=0;}
		break;
	case 82:
		if(data == 0xaa)
		{
			cmd_flag=1;
			cmd_word=7;
		}
		receive_status=0;
		break;                        
	case 90:
		key_buf[0]=data; 	
		receive_status++;
		break;		
	case 91:
		if(data == 0x55){receive_status++;}
		else{receive_status=0;}
		break;
	case 92:
		if(data == 0xaa)
		{
			cmd_flag=1;
			cmd_word=8;
		}
		receive_status=0;
		break;
	default:
		break;				
	}
	#asm
    pop  r26
    out  sreg,r26
    pop  r31
    pop  r30
    pop  r27
    pop  r26
	#endasm
}
#pragma savereg+

#ifndef _DEBUG_TERMINAL_IO_
// Get a character from the USART Receiver buffer
#define _ALTERNATE_GETCHAR_
#pragma used+
char getchar(void)
{
	char data;
	while (rx_counter==0);
	data=rx_buffer[rx_rd_index];
	if (++rx_rd_index == RX_BUFFER_SIZE) rx_rd_index=0;
	#asm("cli")
	--rx_counter;
	#asm("sei")
	return data;
}
#pragma used-
#endif

// USART Transmitter buffer
#define TX_BUFFER_SIZE 8
char tx_buffer[TX_BUFFER_SIZE];
unsigned char tx_wr_index,tx_rd_index,tx_counter;

// USART Transmitter interrupt service routine
#pragma savereg-
interrupt [USART_TXC] void uart_tx_isr(void)
{
	#asm
    push r26
    push r27
    push r30
    push r31
    in   r26,sreg
    push r26
	#endasm
	if (tx_counter)
   	{
   		--tx_counter;
   		UDR=tx_buffer[tx_rd_index];
   		if (++tx_rd_index == TX_BUFFER_SIZE) tx_rd_index=0;
   	}
	#asm
    pop  r26
    out  sreg,r26
    pop  r31
    pop  r30
    pop  r27
    pop  r26
	#endasm
}
#pragma savereg+

#ifndef _DEBUG_TERMINAL_IO_
// Write a character to the USART Transmitter buffer
#define _ALTERNATE_PUTCHAR_
#pragma used+
void putchar(char c)
{
	while (tx_counter == TX_BUFFER_SIZE);
	#asm("cli")
	if (tx_counter || ((UCSRA & DATA_REGISTER_EMPTY)==0))
   	{
   		tx_buffer[tx_wr_index]=c;
   		if (++tx_wr_index == TX_BUFFER_SIZE) tx_wr_index=0;
   		++tx_counter;
   	}
	else
   	UDR=c;
	#asm("sei")
}
#pragma used-
#endif

void main(void)
{
	char i,j;
	unsigned int err_time;
	#asm( "cli" )
	cmd_flag=0;
	cmd_word=0;
	err_time=0;
	time_count=0; 
	change_by_uart=0; 
	main_status=0;
	key_status=0;    
	run_count=0;
	stop_count=0;
	send_status=0;
	send_order=0;   
	cmd_status=0;
	receive_status=0;
	card_ok=0;
	count=0;     
	command_count=0;
 	head_status=0;
	initalize(); 
	key_status=0;
	clr(PORTD,4);
	
	id_flag=0;
	ptrto_eeprom = CHECK_ADDR;
	if(*ptrto_eeprom != 1){*ptrto_eeprom=1;id_flag=1;}
	ptrto_eeprom++;	
	if(*ptrto_eeprom != 2){*ptrto_eeprom=2;id_flag=1;}
	ptrto_eeprom++;	
	if(*ptrto_eeprom != 3){*ptrto_eeprom=3;id_flag=1;}
	ptrto_eeprom++;	
	if(*ptrto_eeprom != 4){*ptrto_eeprom=4;id_flag=1;}
	//如果EEPROM异常,那么恢复一些参数
	//1。出厂序列号
	//2。韦根输出格式,1-26 2-34 3-34 4-44
	//3。485输出使能   1-使能 0-禁能
	//4。系统密码恢复为 1234
	if(id_flag)
	{
		ptrto_eeprom = ID_ADDR; //默认序列号8个1
		for(i=0;i<8;i++) *ptrto_eeprom++ = '1';
		
		ptrto_eeprom = MY_ADDR;	//默认地址为1
		*ptrto_eeprom = 1;
		ptrto_eeprom = MY_ADDR_C;
		*ptrto_eeprom = 1;
 		
		ptrto_eeprom=addr_weigen;
		*ptrto_eeprom=1;        //默认韦根26
		ptrto_eeprom=addr_weigen_C;
		*ptrto_eeprom=1;        

		ptrto_eeprom=addr_485E;
		*ptrto_eeprom=2;		//默认为韦根输出 
		ptrto_eeprom=addr_485E_C;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -