📄 read125k.c~
字号:
/*********************************************
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 + -