#include <iom16v.h>
#include <avrdef.h>
#define uchar unsigned char
#define uint unsigned int
#define fosc 6000000
#define baud 1200
#define dat164 PB1
#define scl164 PB2
#define ledpow PB0
#define keypow PB3
#define unlock PB4
#pragma data:code
const unsigned char tabopen[]={0xff,0XC8,0X86,0X8C,0XC0};
const unsigned char tabbyby[]={0xff,0x7f,0x7f,0x91,0x83};
const unsigned char tabcall[]={0xff,0xc7,0xc7,0x88,0xC6};
const unsigned char tab1[]={0xff,0xf7,0xfb,0xfd,0xfe,0Xf0,0xf0,0xf1,0xf3,0xf7,0xfF,0X00};
const unsigned char tab[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,0x7F,0xc7,0xbf};
const unsigned char tabsp[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x8c,0x92};
const unsigned char tabpk[]={0xff,0x86,0xa1,0xa3,0xc6};
const unsigned char tabset[]={0xff,0x7f,0xce,0x86,0x92};
const unsigned char taberr[]={0xff,0x7F,0xAF,0xAF,0x86};
const unsigned char tabcenter[]={0xff,0x7f,0xc8,0x86,0xc6};
const unsigned char tabof1[]={0xff,0XC0,0x7f,0x0E,0XC0};
const unsigned char tabon1[]={0xff,0xF9,0x7f,0X48,0XC0};
const unsigned char tabnew[]={0xff,0x7f,0xc1,0X86,0XC8};
const unsigned char tabagai[]={0xff,0x4f,0x88,0xC2,0x88};
const unsigned char tabssof[]={0xff,0x8e,0XC0,0x92,0x92};
const unsigned char tabsson[]={0xff,0XC8,0XC0,0x92,0x92};
const unsigned char tabgood[]={0xff,0xa1,0xc0,0xc0,0x90};
#pragma data:data
unsigned char spdisplay[6]; //对讲倒计时
unsigned char display1[6]; //待机显示
unsigned char display[6]; //显示缓存
unsigned char tabdat[8]; //标串口发送数据
unsigned char rxdat[8]; //标串口接收数据
unsigned char keynum[10]; //键值
unsigned char zhujima[8]; //主机地址码
unsigned char key,key1,s60b=60,timeout,d=0,spesc,syspkey,roomp,s8556;
unsigned int k,f,j,sb; //f:待机显示累加 k:按键数量
/*********************************模拟串口定义***********************************************/
#define GET_RX() (PIND & (1<<PIND3)) /* 接收电平值 */
#define SET_TX() (PORTD |= (1<<PORTD4)) /* 发送高电平 */
#define CLR_TX() (PORTD &= ~(1<<PORTD4)) /* 发送低电平 */
unsigned char rx_fifo[10]; /* 仿串口接收数据 */
unsigned char tx_fifo[10]; /* 仿串口发送数据 */
unsigned char rx_pos; /* 队列中最后接收数据位置 */
unsigned char read_pos; /* 队列中最后读取数据位置 */
unsigned char tx_pos; /* 队列中最后发送数据位置 */
unsigned char write_pos; /* 队列中最后写入数据位置 */
unsigned char rx_buf; /* 接收字节缓冲 */
unsigned char tx_buf; /* 发送字节缓冲 */
unsigned char rx_bit; /* 接收帧位计数 */
unsigned char tx_bit; /* 发送帧位计数volatile */
unsigned char turn;
/* 数据帧结构 frame */
flash enum xx_bit {BIT_0 = 0,BIT_1,BIT_2,BIT_3,BIT_4,BIT_5,BIT_6,BIT_7,BIT_STOP,BIT_IDLE,BIT_START,};
/**********************************模拟串口程序*********************************************/
/* 变量初始化 */
void var_init(void)
{
rx_pos = 0;
read_pos = 0;
tx_pos = 0;
write_pos = 0;
rx_bit = BIT_IDLE; /* 定义初始收发位为空闲位 */
tx_bit = BIT_IDLE;
turn = 0;
}
/* 配置定时器 */
void timer0_init(void)
{
TCCR0 = ((1<<CS00)|(1<<CS01)|(1<<WGM01)); /*//64分频 CTC模式 */
TIMSK = (1<<OCIE0); /* 比较匹配中断使能 */
OCR0 = 78; /* 比较值77、78,104,103(8M),定时器频率: 6.0MHz/((78+1)*64) =1186.7 Hz */
TCNT0 = 0;
}
/* 从接收队列读1字节 */
unsigned char rx_byte(void)
{
if(rx_pos!=0){return;}
if (++read_pos == 10)
read_pos = 0;
return rx_fifo[read_pos];
}
/* 向发送队列写1字节 */
void tx_byte(void)//(unsigned char data)
{
if (++write_pos == 10)
write_pos = 0;
tx_fifo[write_pos];// = data;
}
/* 定时器读周期处理函数 */
void rx_turn_isr(void)
{
switch (rx_bit) { /* 根据当前帧位执行相应操作 */
case BIT_IDLE:
if (!GET_RX()) /* 检测起始位, 以判断是否有数据待收 */
rx_bit = BIT_0;
break;
case BIT_0: /* 开始接收数据 */
case BIT_1:
case BIT_2:
case BIT_3:
case BIT_4:
case BIT_5:
case BIT_6:
case BIT_7:
if (GET_RX()) /* 根据端口电平, 写接收缓冲相应位 */
rx_buf |= (1 << rx_bit);
else
rx_buf &= ~(1 << rx_bit);
rx_bit++;
break;
case BIT_STOP:
if (GET_RX()) { /* 检测停止位, 出现帧错误则丢弃数据, 否则写入接收队列 */
if (++rx_pos == 10)
rx_pos = 0;
rx_fifo[rx_pos] = rx_buf;
}
rx_bit = BIT_IDLE;
break;
}
}
/* 定时器写周期处理函数 */
void tx_turn_isr(void)
{
switch (tx_bit) { /* 根据当前帧位执行相应操作 */
case BIT_START:
CLR_TX(); /* 输出起始位 */
tx_bit = BIT_0;
break;
case BIT_0: /* 开始发送数据 */
case BIT_1:
case BIT_2:
case BIT_3:
case BIT_4:
case BIT_5:
case BIT_6:
case BIT_7:
if (tx_buf & (1 << tx_bit)) /* 根据待发数据位信息, 控制发送端电平 */
SET_TX();
else
CLR_TX();
tx_bit++;
break;
case BIT_STOP:
case BIT_IDLE:
SET_TX();
if (tx_pos != write_pos) { /* 检测是否有待发数据, 无则发送空闲位 */
if (++tx_pos == 10)
tx_pos = 0;
//tx_buf = tx_fifo[tx_pos];
// tx_bit = BIT_START;
// turn=0;
// delay1(10);
// break;}
tx_buf = tx_fifo[tx_pos];
tx_bit = BIT_START;
} else {
tx_bit = BIT_IDLE;
}
break;
}
}
/* 定时器中断处理函数 */
#pragma interrupt_handler timer0_isr:20
void timer0_isr(void)
{
switch (turn) {
case 0: ///* 读周期 */
rx_turn_isr();
break;
case 1: /* 写周期 */
tx_turn_isr();
break;
}
}
/***********************************标串口配置****************************************/
void USART_Init(void) //串口初始化
{
UCSRB=(1<<RXEN)|(1<<TXEN)|(1<<RXCIE);//允许收发,打开接收中断
UBRRL=(fosc/16/(baud+1))%256; //设置波特率寄存器0xa0 ;
UBRRH=(fosc/16/(baud+1))/256; //0x01 ;
UCSRC=(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);//8位数据+1位STOP
}
void USART_Tx(uchar data) //发送采用查询方式
{TIMSK = ~(1<<OCIE0);
while(!(UCSRA&(1<<UDRE)));//上次发送有没有完成
UDR=data; //发送数据
NOP();
UCSRA |= (1<<6);
TIMSK = (1<<OCIE0);
}
#pragma interrupt_handler uart0_rx:12
void uart0_rx(void)
{ uint y;
TIMSK = ~(1<<OCIE0);
for(y=0;y<200;y++)
{
if(UCSRA&(1<<RXC))//有没有接收到数据
{
rxdat[d]=UDR;
d++;
if(rxdat[0]==0){d=0;}
if(d==8)
{d=0;
if(rxdat[0]+rxdat[1]+rxdat[2]+rxdat[3]+rxdat[4]+rxdat[5]+rxdat[6]!=rxdat[7])
{d=0;datrest();}
}
}
NOP();
NOP();
NOP();
}
d=0;
TIMSK = (1<<OCIE0);
}
/*************************************写内部eeprom配置************************************/
void write_eeprom(uint add,uchar dat)
{
while(EECR&(1<<EEWE)); //等待上一次写操作结束
EEAR=add;
EEDR=dat; //设置地址和数据寄存器
EECR|=(1<<EEMWE); //置位EEWME,硬件清零
EECR|=(1<<EEWE); //置位EEWE用来启动写操作,硬件清零
}
uchar read_eeprom(uint add)
{
while(EECR&(1<<EEWE)); //等待上一次写操作结束
EEAR=add;
EECR|=(1<<EERE); //置位EERE来启动读操作
return(EEDR);
}
/*********************************端口初始化**********************************************/
void port_init(void)
{
DDRA=0X00; //显示
PORTA=0X0F;
DDRB=0X1F; //164\ledpow\keypow\unlock
PORTB=0X07;
DDRD|=BIT(5); //蜂鸣器
PORTD&=~BIT(5);
DDRD &= ~BIT(3); /* PD3输入 仿串口 */
DDRD |= BIT(4); /* PD4输出 仿串口 */
PORTD |= (1<<PORTD4);
DDRB|=BIT(5)|BIT(4)|BIT(3);
DDRD|=BIT(7)|BIT(6);
PORTB&=~BIT(5)|BIT(4)|BIT(3);
PORTD&=~BIT(7)|BIT(6);
}
//**********************仿串延时约2MS********************************************
void delay1(uint ms)
{ uint i,jj;
for(i=0;i<ms;i++)
{for(jj=0;jj<12000;jj++);}
}
//**********************仿串延时约2MS********************************************
void delay2(uint ms)
{ uint i,jj;
for(i=0;i<ms;i++)
{for(jj=0;jj<10;jj++)
{xinshi();}}
}
void delay(uint ms)
{
uint i,jj;
for(i=0;i<ms;i++)
{for(jj=0;jj<750;jj++);}
}
//*************************************************164发送显示数据
void sendbyte(uchar displaybyte)
{ uchar i;
for(i=0;i<8;i++)
{
if(displaybyte&0x80)
{PORTB|=BIT(dat164);}
else
{PORTB&=~BIT(dat164);}
displaybyte <<= 1;
PORTB&=~BIT(scl164);
NOP();
NOP();
NOP();
PORTB|=BIT(scl164);
NOP();
NOP();
NOP();
}
}
//****************************************************串口接收缓冲初始化
void datrest(void)
{
uchar i;
for(i=0;i<8;i++)
{rxdat[i]=0;}
d=0;
}
//***************************************************仿串口接收缓冲初始化
void datrest1(void)
{ uchar i;
TIMSK=~(1<<OCIE0);
timer0_init();
var_init();
TIMSK = (1<<OCIE0);
for(i=0;i<10;i++)
{rx_fifo[i]=0x00;}
}
//****************************************************倒计时显示缓冲
void spyiwei(void)
{
spdisplay[4]=tabsp[11];
spdisplay[3]=tabsp[10];
spdisplay[2]=tabsp[s60b/10];
spdisplay[1]=tabsp[s60b%10];
}
//****************************************************待机显示
void xinshiw(void)
{
f++;
if(f<1000)
{
sendbyte(tab[16]);
sendbyte(tab[16]);
sendbyte(tab[16]);
sendbyte(tab[16]);
PORTB&=~BIT(ledpow);
delay(1);
PORTB|=BIT(ledpow);
}
else
{if(f>999&&f<2000)
{
PORTB|=BIT(ledpow);
delay(1);
}
else
{
f=0;
}
}
}
//******************************************************输入操作显示
void xinshi(void)
{ uchar x;
for(x=4;x>0;x--)
{
sendbyte(display[x]);}
PORTB&=~BIT(ledpow);
delay(1);
PORTB|=BIT(ledpow);
}
//—————————————————————————特定符号操作显示
void xinshi1(void)
{ uchar x;
for(x=4;x>0;x--)
{
sendbyte(display1[x]);}
PORTB&=~BIT(ledpow);
delay(1);
PORTB|=BIT(ledpow);
}
//*************************************************call字符显示数据发送
void call(void)
{
unsigned char x;
for(x=4;x>0;x--)
{
sendbyte(tabcall[x]);
}
PORTB&=~BIT(ledpow);
delay(1);
PORTB|=BIT(ledpow);
}
//************************************************** 60秒对讲倒计时显示数据发送
void sp60(void)
{ uchar x;
sb++;
for(x=4;x>0;x--)
{
spyiwei();
sendbyte(spdisplay[x]);
}
PORTB&=~BIT(ledpow);
delay(1);
PORTB|=BIT(ledpow);
if(sb==500)
{sb=0;
s60b--;
if(s60b==0){s60b=60;timeout=1;}
}
}
//******************************************************开锁显示数据发送
void open(void)
{ uchar x;
for(x=4;x>0;x--)
{
sendbyte(tabopen[x]);
}
PORTB|=BIT(4);
PORTB&=~BIT(ledpow);
delay(1);
PORTB|=BIT(ledpow);
}
//*********************************************************结束显示数据发送
void byby(void)
{ uchar x;
for(x=4;x>0;x--)
{
sendbyte(tabbyby[x]);
}
PORTB&=~BIT(ledpow);
delay(1);
PORTB|=BIT(ledpow);
}
//**********************************************************显示键值与数据移位
void xinshiyiwei(void)
{
display[4]=display[3];
display[3]=display[2];
display[2]=display[1];
display[1]=tab[key];
keynum[9]=keynum[8];
keynum[8]=keynum[7];
keynum[7]=keynum[6];
keynum[6]=keynum[5];
keynum[5]=keynum[4];
keynum[4]=keynum[3];
keynum[3]=keynum[2];
keynum[2]=keynum[1];
keynum[1]=keynum[0];
keynum[0]=key;
k++; //按键数
j=0; //时间累加清零
}
//********************************************************显示“————”与数据移位
void xinshiyiwei1(uchar tb)
{
display1[4]=display1[3];
display1[3]=display1[2];
display1[2]=display1[1];
display1[1]=tab[tb];
}
//************************************************出错"ERR"显示字符数据发送
void pkeyerr(void)
{
uchar x;
for(x=4;x>0;x--)
{
sendbyte(taberr[x]);
}
PORTB&=~BIT(ledpow);
delay(1);
PORTB|=BIT(ledpow);
}
//**********************************************CEN显示字条数据发送
void center(void)
{
uchar x;
for(x=4;x>0;x--)
{
sendbyte(tabcenter[x]);
}
PORTB&=~BIT(ledpow);
delay(1);
PORTB|=BIT(ledpow);
}
//************************************************出错"on.1"显示字符数据发送
void ON1(void)
{
uchar x;
for(x=4;x>0;x--)
{
sendbyte(tabon1[x]);
}
PORTB&=~BIT(ledpow);
delay(1);
PORTB|=BIT(ledpow);
}
//************************************************出错"of.1"显示字符数据发送
void OF0(void)
{
uchar x;
for(x=4;x>0;x--)
{
sendbyte(tabof1[x]);
}
PORTB&=~BIT(ledpow);
delay(1);
PORTB|=BIT(ledpow);
}
void new(void)
{
uchar x;
for(x=4;x>0;x--)
{
sendbyte(tabnew[x]);
}
PORTB&=~BIT(ledpow);
delay(1);
PORTB|=BIT(ledpow);
}
void agai(void)
{
uchar x;
for(x=4;x>0;x--)
{
sendbyte(tabagai[x]);
}
PORTB&=~BIT(ledpow);
delay(1);
PORTB|=BIT(ledpow);
}
void ssof(void)
{
uchar x;
for(x=4;x>0;x--)
{
sendbyte(tabssof[x]);
}
PORTB&=~BIT(ledpow);
delay(1);
PORTB|=BIT(ledpow);
}
void sson(void)
{
uchar x;
for(x=4;x>0;x--)
{
sendbyte(tabsson[x]);
}
PORTB&=~BIT(ledpow);
delay(1);
PORTB|=BIT(ledpow);
}
void good(void)
{
uchar x;
for(x=4;x>0;x--)
{
sendbyte(tabgood[x]);
}
PORTB&=~BIT(ledpow);
delay(1);
PORTB|=BIT(ledpow);
}
//***********************************************************显示缓冲初始化
void xinshiint(void)
{
display[1]=0x7f;
display[2]=0x7f;
display[3]=0x7f;
display[4]=0x7f;
}
//***********************************************************键盘扫描
uchar anjianon(void) //按键有无按下
{ uchar temp;
DDRA=0XFF;
PORTA=0X0f;
DDRA=0Xf0;
temp=PINA;
if(temp!=0x0f)
delay(1);
temp=PINA;
if(temp!=0x0f){DDRA=0XFF;return 1;}
else{DDRA=0XFF;return 0;}
}
void anjian(void) //键值查找
{ uchar temp,i=0Xf7,a;
if(anjianon())
{PORTD|=BIT(5);
delay(5);
PORTD&=~BIT(5);
if(anjianon())
{
do{
i=(i<<1|i>>7);
PORTA=i;
DDRA=0Xf0;
temp=PINA;
a=temp&0x0f;
}
while(a==0x0f);
switch(temp)
{
case(0X77):key=15;break;//f
case(0X7b):key=14;break;//e
case(0X7d):key=13;break;//d密码
case(0X7e):key=12;break;//c
case(0Xb7):key=11;break;//b#确认
case(0Xbb):key=9;break;//9
case(0Xbd):key=6;break;//6
case(0Xbe):key=3;break;//3
case(0Xd7):key=0;break;//0
case(0Xdb):key=8;break;//8
case(0Xdd):key=5;break;//5
case(0Xde):key=2;break;//2
case(0Xe7):key=10;break;//a取消
case(0Xeb):key=7;break;//7
case(0Xed):key=4;break;//4
case(0Xee):key=1;break;//1
}
}
while(anjianon())
{delay(100);}
xinshiyiwei();
xinshiyiwei1(18);
}
}
void anjian1(void) //键值查找
{ uchar temp,i=0Xf7,a;
if(anjianon())
{PORTD|=BIT(5);
delay(5);
PORTD&=~BIT(5);
if(anjianon())
{
do{
i=(i<<1|i>>7);
PORTA=i;
DDRA=0Xf0;
temp=PINA;
a=temp&0x0f;
}
while(a==0x0f);
switch(temp)
{
case(0Xe7):key1=10;break;//取消
case(0X7e):key1=12;break;//c
case(0Xb7):key1=11;break;//b
default: ; break;
}
}
}
}
//****************************************************************标串发送数据
void senddata(void)
{ uchar i,temp;
for(i=0;i<8;i++)
{temp=tabdat[i];
USART_Tx(temp);
}
}
//*******************************************************************发送仿串数据
void senddata1(void)
{ uchar i;
turn=1;
delay1(5);
for(i=10;i>0;i--)
{tx_byte();
delay1(1);}
}
//*****************************************************************呼叫管理中心数据格式
void sendcenter(uchar odd)
{ uchar i;
for(i=0;i<6;i++)
{read_eeprom(i+100);
zhujima[i]=EEDR;
}
tx_fifo[1]=odd;//呼叫码
tx_fifo[2]=0x00;
tx_fifo[3]=0x00;
tx_fifo[4]=0x00;
tx_fifo[5]=0x00;
tx_fifo[6]=zhujima[5]<<4|zhujima[4];
tx_fifo[7]=zhujima[3]<<4|zhujima[2];
tx_fifo[8]=zhujima[1]<<4|zhujima[0];
tx_fifo[9]=0x00;//zhujima[1]<<4|zhujima[0];
tx_fifo[0]=0xff&(tx_fifo[9]+tx_fifo[1]+tx_fifo[2]+tx_fifo[3]+tx_fifo[4]+tx_fifo[5]+tx_fifo[6]+tx_fifo[7]+tx_fifo[8]) ;
}
//*************************************************************************主机编码数据格式
//发:88 楼栋 单元 主副 00 00 00 00 00 加和 回:88 楼栋 单元 00 04 04 04 00 00 加和
void setmaster(void)
{
tx_fifo[1]=0x88; //命令码
tx_fifo[2]=keynum[5]<<4|keynum[4];
tx_fifo[3]=keynum[3]<<4|keynum[2];
tx_fifo[4]=keynum[1]<<4|keynum[0];
tx_fifo[5]=0x00;
tx_fifo[6]=0x00;
tx_fifo[7]=0x00;
tx_fifo[8]=0x00;
tx_fifo[9]=0x00;
tx_fifo[0]=0xff&(tx_fifo[9]+tx_fifo[1]+tx_fifo[2]+tx_fifo[3]+tx_fifo[4]+tx_fifo[5]+tx_fifo[6]+tx_fifo[7]+tx_fifo[8]) ;
}
//***********************************************************************楼外到楼内数据转换长度
void od_to_id(void)
{
tabdat[0]=tx_fifo[1];
tabdat[1]=tx_fifo[2];
tabdat[2]=tx_fifo[3];
tabdat[3]=tx_fifo[4];
tabdat[4]=tx_fifo[5];
tabdat[5]=tx_fifo[6];
tabdat[6]=tx_fifo[7];
tabdat[7]=0xff&(tabdat[0]+tabdat[1]+tabdat[2]+tabdat[3]+tabdat[4]+tabdat[5]+tabdat[6]);
}
//***********************************************************************楼内到楼外数据转换长度
void id_to_od(void)
{
tx_fifo[1]=tabdat[0]; //命令码
tx_fifo[2]=tabdat[1];
tx_fifo[3]=tabdat[2];
tx_fifo[4]=tabdat[3];
tx_fifo[5]=0x00; //互通时有不同
tx_fifo[6]=zhujima[5]<<4|zhujima[4];
tx_fifo[7]=zhujima[3]<<4|zhujima[2];
tx_fifo[8]=tabdat[5];
tx_fifo[9]=tabdat[6];
tx_fifo[0]=0xff&(tx_fifo[9]+tx_fifo[1]+tx_fifo[2]+tx_fifo[3]+tx_fifo[4]+tx_fifo[5]+tx_fifo[6]+tx_fifo[7]+tx_fifo[8]) ;
}
//***********************************************************呼叫分机数据格式
void sendcall(uchar oda)
{ uchar i;
for(i=0;i<6;i++)
{read_eeprom(i+100);
zhujima[i]=EEDR;
}
tabdat[0]=oda;
tabdat[1]=tabdat[4];
tabdat[2]=keynum[3]<<4|keynum[2];
tabdat[3]=keynum[1]<<4|keynum[0];
tabdat[4]=zhujima[5]<<4|zhujima[4];
tabdat[5]=0x00;//zhujima[3]<<4|zhujima[2];
tabdat[6]=zhujima[1]<<4|zhujima[0];
tabdat[7]=0xff&(tabdat[0]+tabdat[1]+tabdat[2]+tabdat[3]+tabdat[4]+tabdat[5]+tabdat[6]);
}
// *********************楼内通用送格式 命令码(??)+楼栋号+00+00+楼栋号+00+主副号+累加和
void sendclr(void)
{ uchar i;
for(i=0;i<6;i++)
{read_eeprom(i+100); //eeprom 地址100-105为主机地址码
zhujima[i]=EEDR;
}
tabdat[1]=tabdat[4];
tabdat[2]=0x00;
tabdat[3]=0x00;
tabdat[4]=zhujima[5]<<4|zhujima[4];
tabdat[5]=0x00;//zhujima[3]<<4|zhujima[2];
tabdat[6]=zhujima[1]<<4|zhujima[0];
tabdat[7]=0xff&(tabdat[0]+tabdat[1]+tabdat[2]+tabdat[3]+tabdat[4]+tabdat[5]+tabdat[6]);
}
//**********************************************************分机密码开锁数据格式
void roompass(void)
{ uchar i;
for(i=0;i<6;i++)
{read_eeprom(i+100);
zhujima[i]=EEDR;
}
tabdat[0]=0x19;
tabdat[1]=zhujima[5]<<4|zhujima[4];
tabdat[2]=keynum[7]<<4|keynum[6];
tabdat[3]=keynum[5]<<4|keynum[4];
tabdat[4]=keynum[3]<<4|keynum[2];
tabdat[5]=keynum[1]<<4|keynum[0];
tabdat[6]=0x00;
tabdat[7]=0xff&(tabdat[0]+tabdat[1]+tabdat[2]+tabdat[3]+tabdat[4]+tabdat[5]+tabdat[6]);
}
//***************************************************************8031门禁格式化数据格式
void car8031(void)
{ uchar i;
for(i=0;i<6;i++)
{read_eeprom(i+100);
zhujima[i]=EEDR;
}
tabdat[0]=0x48; //8031
tabdat[1]=zhujima[5]<<4|zhujima[4];
tabdat[2]=zhujima[3]<<4|zhujima[2];//keynum[7]<<4|keynum[6];
tabdat[3]=0x00;
tabdat[4]=keynum[5]<<4|keynum[4];
tabdat[5]=keynum[3]<<4|keynum[2];
tabdat[6]=keynum[1]<<4|keynum[0];
tabdat[7]=0xff&(tabdat[0]+tabdat[1]+tabdat[2]+tabdat[3]+tabdat[4]+tabdat[5]+tabdat[6]);
}
//***********************************************************************8054门禁批量注册数据格式
void car8054(void)
{
// tabdat[0]=0x46; //4a
tabdat[1]=0x00;
tabdat[2]=0x00;
tabdat[3]=0x00;
tabdat[4]=0x00;
// tabdat[5]=0x00; //01
tabdat[6]=0x00;
tabdat[7]=0xff&(tabdat[0]+tabdat[1]+tabdat[2]+tabdat[3]+tabdat[4]+tabdat[5]+tabdat[6]);
}
//***********************************************************************8051门禁单个注册数据格式
void car8051(void)
{
uchar i;
for(i=0;i<6;i++)
{read_eeprom(i+100);
zhujima[i]=EEDR;
}
// tabdat[0]=0x46; //8031
tabdat[1]=zhujima[5]<<4|zhujima[4];
tabdat[2]=keynum[5]<<4|keynum[4];
tabdat[3]=keynum[3]<<4|keynum[2];
tabdat[4]=keynum[1]<<4|keynum[0];
//tabdat[5]=0x00;
tabdat[6]=0x00;
tabdat[7]=0xff&(tabdat[0]+tabdat[1]+tabdat[2]+tabdat[3]+tabdat[4]+tabdat[5]+tabdat[6]);
}
//************************************************************************8051送卡号数据格式
void carnuber(void)
{
//tabdat[0]=0x46; //8031
//tabdat[1]=zhujima[5]<<4|zhujima[4];
tabdat[2]=keynum[9]<<4|keynum[8];
tabdat[3]=keynum[7]<<4|keynum[6];
tabdat[4]=keynum[5]<<4|keynum[4];
tabdat[5]=keynum[3]<<4|keynum[2];
tabdat[6]=keynum[1]<<4|keynum[0];
tabdat[7]=0xff&(tabdat[0]+tabdat[1]+tabdat[2]+tabdat[3]+tabdat[4]+tabdat[5]+tabdat[6]);
}
//**************************************分机*******************主机呼叫分机处理程序
void callroom(void)
{ uint w,t,m,mm;
{k=0;
//tabdat[0]=0x11; //呼叫命令
//tx_fifo[1]=0x11; //呼叫命令
sendcenter(0x11);
senddata1(); //呼叫
delay1(20);
sendcall(0x11);
senddata(); //呼叫
PORTB|=BIT(5);
PORTD|=BIT(6);
for(t=0;t<22;t++)
{
w=0;
do
{
w++;
if(t%2){call();}
else{xinshi();}
anjian1();
if(rxdat[0]==0x0a) //解码?
{
delay1(20);
for(mm=0;mm<30000;mm++)
{
PORTD|=BIT(7);
sp60(); //60s倒计算
if(timeout==1){s60b=60;return;}
if(rxdat[0]==0x22)
{rxdat[0]=0xff;for(m=0;m<1000;m++){open();if(rxdat[0]==0x06){for(m=0;m<500;m++){byby();}timeout=1;return;}}PORTB&=~BIT(4);} //开锁
if(rxdat[0]==0x06){for(m=0;m<500;m++){byby();}timeout=1;return;} //挂机datrest();
anjian();
if(key==12||key==10||key==11){key=0;sendcall(0x15);senddata();delay1(20); timeout=1;return;}
}
}
if(key1==12||key1==10||key1==11){key1=0;sendcall(0x15);senddata();delay1(20);timeout=1; return;} //取消退出
}
while(w!=1100);
}
timeout=1; return;
}
}
//*************************************管理机********************主机呼叫管理机处理程序
void callcenter(void)
{ uint w,t,m,mm,i;
k=0;
//tx_fifo[1]=0x11; //呼叫命令
sendcenter(0x11);
senddata1(); //呼叫
delay1(40);
turn=0;
w=0;
PORTB|=BIT(5);
PORTD|=BIT(6);
for(t=0;t<22;t++)
{
do
{
w++;
if(t%2){call();}
else{center();}
anjian1();
// delay(2);
for(i=0;i<10;i++)
{rx_byte();} //模拟串口收数
//if(rx_fifo[0]==rx_fifo[1]+rx_fifo[2]+rx_fifo[3]+rx_fifo[4]+rx_fifo[5]+rx_fifo[6]+rx_fifo[7]+rx_fifo[8]+rx_fifo[9])
//{
if(rx_fifo[1]==0x0a) //解码?
{ delay1(40);
for(mm=0;mm<30000;mm++)
{
PORTD|=BIT(7);
sp60(); //60s倒计算
if(timeout==1){s60b=60;return;}
if(rx_fifo[1]==0x22)
{rx_fifo[1]=0x0a;for(m=0;m<1000;m++){open(); if(rx_fifo[1]==0x06){for(m=0;m<500;m++){byby();}timeout=1;return;}}PORTB&=~BIT(4);} //开锁
if(rx_fifo[1]==0x06){for(m=0;m<500;m++){byby();}timeout=1;return;} //挂机datrest();
anjian1();
if(key1==12||key1==10||key1==11){key1=0;sendcenter(0x15);senddata1();delay1(40);datrest1();timeout=1;return;} //取消退出
}
}
// }
if(key1==12||key1==10||key1==11){key1=0;sendcenter(0x15);senddata1();delay1(40);datrest1(); timeout=1;;return;} //取消退出
}
while(w!=1000);
w=0;
}
}
//******************************************************楼内外数据空闲相互转发处理程序
void changdata(void)
{ uchar i;
turn=0;
delay1(40);
for(i=0;i<10;i++)
{rx_byte();} //模拟串口收数
if(rx_fifo[0]==rx_fifo[1]+rx_fifo[2]+rx_fifo[3]+rx_fifo[4]+rx_fifo[5]+rx_fifo[6]+rx_fifo[7]+rx_fifo[8]+rx_fifo[9])
{
if(rx_fifo[1]==0xff||rx_fifo[1]==0x00){;} //监视主机
else{od_to_id();senddata();delay1(40);}
}
if((tabdat[7])==(tabdat[0]+tabdat[1]+tabdat[2]+tabdat[3]+tabdat[4]+tabdat[5]+tabdat[6]))
if(tabdat[0]==0xff||rx_fifo[1]==0x00){;} //监视主机
else{id_to_od();senddata1();delay1(40);}
}
//******************************************************************密码开锁处理程序
void pkeyopen(void)
{ uint w,t,x,i,y;
uchar roompkey=0;
key=0;
k=0;
for(x=4;x>0;x--)
{
display1[x]=tabpk[x];
}
for(i=0;i<4;i++)
{read_eeprom(i+110); //EEPROM地址110-113储存公共密码
zhujima[i]=EEDR;
read_eeprom(i+120); //EEPROM地址110-113储存公共密码
zhujima[i+4]=EEDR;
}
for(w=0;w<10000;w++) //约10秒内输入密码
{
xinshi1();
anjian();
if(key==10||key==11||key==12){xinshiint();return;} //取消退出
if(key==14) //********************************************系统密码设置系统开/关
{k=0;
for(x=4;x>0;x--) {display1[x]=tabpk[x];}
do
{y++;
xinshi1();
anjian();
if((zhujima[4]==0xff)&&(zhujima[5]==0xff)&&(zhujima[6]==0xff)&&(zhujima[7]==0xff))//自动判定是否初始密码
{for(t=0;t<10;t++)
{w=0;
do
{w++;
if(t%2){ON1();}
else{OF0();}
anjian();
delay(1);
if(key==10||key==12){return;}
if(key==1){s8556=1;for(t=0;t<1000;t++){sson();}timeout=1;return;}
if(key==0){s8556=0;for(t=0;t<1000;t++){ssof();}timeout=1;return;}
}
while(w!=600);
}
timeout=1;return;
}
//for(x=4;x>0;x--){display1[x]=tabpk[x]; }//************************输入设置的系统密码
if(k==4)
{
if((zhujima[4]==keynum[0])&&(zhujima[5]==keynum[1])&&(zhujima[6]==keynum[2])&&(zhujima[7]==keynum[3]))
{ key=0xff; //清键值//
for(t=0;t<10;t++)
{w=0;
do
{w++;
if(t%2){ON1();}
else{OF0();}
anjian();
delay(1);
if(key==10||key==12){return;}
if(key==1){s8556=1;for(t=0;t<1000;t++){sson();}timeout=1;return;}
if(key==0){s8556=0;for(t=0;t<1000;t++){ssof();}timeout=1;return;}
}
while(w!=600);
}
timeout=1;return;
}
if((zhujima[4]!=keynum[0])||(zhujima[5]!=keynum[1])||(zhujima[6]!=keynum[2])||(zhujima[7]!=keynum[3]))
{for(t=0;t<1000;t++) {pkeyerr();}timeout=1;return;}
}
}
while(y<5000);
timeout=1;return;
}
if(k==4) //******************************************************公共密码开锁
{
do
{y++;
xinshi1();
anjian();
if((zhujima[0]==keynum[0])&&(zhujima[1]==keynum[1])&&(zhujima[2]==keynum[2])&&(zhujima[3]==keynum[3]))
{for(t=0;t<1000;t++){open();}timeout=1; return;}
}
while(k==4&&y<3000);
if(k==4){for(t=0;t<1000;t++){pkeyerr();}timeout=1;return;}
}
if((k==8)&&(roomp==1))//************************************************个人密码开锁
{roompass();
senddata();
xinshiyiwei1(16);
t=0;
do
{
t++;
if(t==1000){xinshiyiwei1(16);}
if(t==2000){xinshiyiwei1(16);}
if(t==3000){xinshiyiwei1(16);}
xinshi1();
if(rxdat[0]==0x1a){for(t=0;t<1000;t++){open();}timeout=1; return;}
}
while(t!=4000);
for(t=0;t<1000;t++)
{pkeyerr();}
timeout=1;
return;
}
if((k==8)&&(roomp==0)){for(t=0;t<1000;t++) {pkeyerr();}timeout=1;return;}
}
timeout=1;
}
//**************************************************************************系统功能设置程序
void systemset(void)
{uint w,x,t,i,ww,temp;
for(x=4;x>0;x--)
{
display1[x]=tabset[x];
}
k=0;
for(w=0;w<10000;w++)
{
xinshi1();
anjian();
if(key==10||key==11||key==12){return;} //取消退出
//***********************************************************************************主机编码
if((k==4)&&(keynum[0]==0)&&(keynum[1]==5)&&(keynum[2]==5)&&(keynum[3]==8)) //8550
{
k=0;
TIMSK=~(1<<OCIE0);
for(x=4;x>0;x--)
{
display[x]=tabset[x];
}
for(w=0;w<10000;w++)
{
anjian();
if(key==10||key==12){return;}
xinshi();
// delay(2);
if((k==6)&&(keynum[0]+keynum[1]+keynum[2]+keynum[3]+keynum[4]+keynum[5]!=0))
{for(i=0;i<6;i++){write_eeprom(i+100,keynum[i]);}
turn=1;
TIMSK=(1<<OCIE0);
delay1(5);
setmaster();
senddata1();
TIMSK=~(1<<OCIE0);
//datrest1();
turn=0;
ww=0;
delay1(1);
do{
ww++;
turn=0;
TIMSK=(1<<OCIE0);
anjian();
//delay2(8);
xinshi();
if(key==10||key==12){return;}
for(i=0;i<10;i++)
{rx_byte();} //模拟串口收数
if(rx_fifo[1]==0x04||rx_fifo[2]==0x04||rx_fifo[3]==0x04||rx_fifo[5]==0x04||rx_fifo[6]==0x04||rx_fifo[7]==0x04){for(t=0;t<1000;t++){byby();}datrest1();timeout=1;return;}
// datrest1();
}
while(ww!=3000&&rx_fifo[6]!=0x04);
// turn=1;
// TIMSK=(1<<OCIE0);
// delay1(5);
// tx_fifo[1]=rx_fifo[1];
// tx_fifo[2]=rx_fifo[2];
// tx_fifo[3]=rx_fifo[3];
// tx_fifo[4]=rx_fifo[4];
// tx_fifo[5]=rx_fifo[5];
// tx_fifo[6]=rx_fifo[6];
// tx_fifo[7]=rx_fifo[7];
// tx_fifo[8]=rx_fifo[8];
// tx_fifo[9]=rx_fifo[8];
// tx_fifo[0]=0xff&(tx_fifo[9]+tx_fifo[1]+tx_fifo[2]+tx_fifo[3]+tx_fifo[4]+tx_fifo[5]+tx_fifo[6]+tx_fifo[7]+tx_fifo[8]) ;
//senddata1();
for(t=0;t<1000;t++){pkeyerr();}
timeout=1;
return;
}
}
timeout=1;
return;
}
//******************************************************************************公共密码设置
if((k==4)&&(keynum[0]==5)&&(keynum[1]==5)&&(keynum[2]==5)&&(keynum[3]==8)) //8555
{
k=0;
for(x=4;x>0;x--)
{
display[x]=tabset[x];
}
for(w=0;w<10000;w++)
{
anjian();
if(key==10||key==12){return;}
xinshi();
// delay(5);
if(k==4)
{for(i=0;i<4;i++){write_eeprom(i+110,keynum[i]); }
for(t=0;t<1000;t++){good();}
timeout=1;
return;
}
}
timeout=1;
return;
}
//*****************************************************************************门禁格式化
if((k==4)&&(keynum[0]==1)&&(keynum[1]==3)&&(keynum[2]==0)&&(keynum[3]==8)) //8031
{
k=0;
for(x=4;x>0;x--)
{
display[x]=tabset[x];
}
for(w=0;w<10000;w++)
{
anjian();
if(key==10||key==12){return;}
xinshi();
// delay(5);
if(k==6)
{car8031();
senddata();
for(t=0;t<1000;t++){good();}
timeout=1;
return;
}
}
timeout=1;
return;
}
//*****************************************************************************门禁格式化
if((k==4)&&(keynum[0]==1)&&(keynum[1]==5)&&(keynum[2]==0)&&(keynum[3]==8)) //8051
{
k=0;
for(x=4;x>0;x--)
{
display[x]=tabset[x];
}
for(w=0;w<10000;w++)
{
anjian();
if(key==10||key==12){return;}
xinshi();
//delay(5);
// x=1;
if(k==6)
{ k=0;
tabdat[0]=0x46; //送卡位置
tabdat[1]=zhujima[5]<<4|zhujima[4];
tabdat[5]=0x00;
car8051();
senddata();
CLI();
delay1(20);
SEI();
tabdat[0]=0x4a;
tabdat[1]=zhujima[5]<<4|zhujima[4];
tabdat[5]=0x01;
car8051();
//senddata();
anjian();
if(key==10||key==12){return;}
for(w=0;w<12000;w++)
{
xinshi();
anjian();
if(key==10||key==12){return;}
if(k==10)
{k=0;
tabdat[0]=0x44; //送卡号
tabdat[1]=zhujima[5]<<4|zhujima[4];
carnuber();
senddata();
CLI();
delay1(20);
SEI();
tabdat[0]=0x4a;
//tabdat[1]=0x00;
carnuber();
//senddata();
for(t=0;t<1000;t++){good();}
timeout=1;
return;
}
}
}
}
timeout=1;
return;
}
//*****************************************************************************门禁批量注册
if((k==4)&&(keynum[0]==4)&&(keynum[1]==5)&&(keynum[2]==0)&&(keynum[3]==8)) //8054
{
k=0;
for(x=4;x>0;x--)
{
display[x]=tabset[x];
}
for(w=0;w<1000;w++)
{
anjian();
if(key==10||key==12){return;}
xinshi();
//delay1(5);
tabdat[0]=0x46;
tabdat[5]=0x00;
car8054();
senddata();
delay1(20);
tabdat[0]=0x4a;
tabdat[5]=0x01;
car8054();
//senddata();
for(t=0;t<1000;t++){good();}
timeout=1;
return;
}
}
//*****************************************************************************系统密码设置
if((k==4)&&(keynum[0]==6)&&(keynum[1]==5)&&(keynum[2]==5)&&(keynum[3]==8)) //8556
{
k=0;
for(i=0;i<4;i++)
{read_eeprom(i+120); //EEPROM地址120-123储存系统密码
zhujima[i]=EEDR;
}
for(w=0;w<10000;w++)
{
if((zhujima[0]==0xff)&&(zhujima[1]==0xff)&&(zhujima[2]==0xff)&&(zhujima[3]==0xff))
{
for(x=4;x>0;x--){display[x]=tabnew[x];}
//xinshi();
//for(t=0;t<800;t++){new();}
//xinshiyiwei1(16);
for(w=0;w<10000;w++)
{
anjian();
if(key==10||key==12){return;}
xinshi();
if(k==4)
{for(x=4;x>0;x--){display[x]=tabagai[x];}
k=0;
for(w=0;w<10000;w++)
{
anjian();
if(key==10||key==12){return;}
xinshi();
//for(x=4;x>0;x--){display[x]=tabset[x];}
if(k==4)
{if((keynum[0]==keynum[4])&&(keynum[0]==keynum[4])&&(keynum[0]==keynum[4])&&(keynum[0]==keynum[4]))
{for(i=0;i<4;i++){write_eeprom(i+120,keynum[i]);}
for(t=0;t<1000;t++){good();}
timeout=1;
return;}
}
}
}
}
}
}
if((zhujima[0]!=0xff)&&(zhujima[1]!=0xff)&&(zhujima[2]!=0xff)&&(zhujima[3]!=0xff))
{k=0;
for(x=4;x>0;x--) {display1[x]=tabpk[x];}
for(w=0;w<10000;w++)
{
anjian();
xinshi1();
if(key==10||key==11||key==12){xinshiint();return;} //取消退出
if(k==4)
{
if((zhujima[0]==keynum[0])&&(zhujima[1]==keynum[1])&&(zhujima[2]==keynum[2])&&(zhujima[3]==keynum[3]))
{k=0;
for(x=4;x>0;x--){display[x]=tabnew[x];}
for(w=0;w<10000;w++)
{
anjian();
if(key==10||key==12){return;}
xinshi();
if(k==4)
{for(x=4;x>0;x--){display[x]=tabagai[x];}
k=0;
for(w=0;w<10000;w++)
{
anjian();
if(key==10||key==12){return;}
xinshi();
if(k==4)
{if((keynum[0]==keynum[4])&&(keynum[0]==keynum[4])&&(keynum[0]==keynum[4])&&(keynum[0]==keynum[4]))
{for(i=0;i<4;i++){write_eeprom(i+120,keynum[i]); }
for(t=0;t<1000;t++){good();}
timeout=1;
return;
}
if((keynum[0]!=keynum[4])||(keynum[0]!=keynum[4])||(keynum[0]!=keynum[4])||(keynum[0]!=keynum[4]))
{for(t=0;t<1000;t++){pkeyerr();}timeout=1;return;}
}
}
}
}
}
if((zhujima[4]!=keynum[0])||(zhujima[5]!=keynum[1])||(zhujima[6]!=keynum[2])||(zhujima[7]!=keynum[3]))
{for(t=0;t<1000;t++) {pkeyerr();}timeout=1;return;}
}
}
}
}
if(k>4){for(t=0;t<1000;t++) {pkeyerr();}timeout=1;return;}
if((k==4)&&(keynum[0]==5)&&(keynum[1]==8)&&(keynum[2]==1)&&(keynum[3]==9)) //8054
{
k=0;
for(t=0;t<10;t++)
{w=0;
do
{w++;
if(t%2){ON1();}
else{OF0();}
anjian();
if(key==10||key==12){return;}
if(key==1){roomp=1;for(t=0;t<1000;t++){good();}timeout=1;return;}
if(key==0){roomp=0;for(t=0;t<1000;t++){good();}timeout=1;return;}
}
while(w!=1000);
}
timeout=1;
return;
}
/**************************************************************************************/
timeout=1;
}
}
//***************************************************************************按键处理程序
void anjiancunli(void)
{ uint t;
//xinshiint();
while(k!=0&&j<12000)
{
j++;
anjian();
if(key==14) //呼叫管理中心
{callcenter();
if(timeout=1)
{timeout=0;s60b=60;PORTB&=~BIT(4);PORTB&=~BIT(5);PORTD&=~BIT(6)|BIT(7);return;}}
if(key==10||key==11||key==12){tabdat[0]=0x15;sendclr();senddata();return;} //取消退出
if(key==13){pkeyopen();if(timeout==1){timeout=0;return;}} //密码开锁
if((k==4)&&((keynum[0]+keynum[1]+keynum[2]+keynum[3])!=0)) //呼叫分机
{callroom();
if(timeout=1)
{timeout=0;s60b=60;PORTB&=~BIT(4);PORTB&=~BIT(5);PORTD&=~BIT(6)|BIT(7);return;}}
if((k==4)&&((keynum[0]+keynum[1]+keynum[2]+keynum[3])==0)) //系统设置
{if(s8556==1){systemset();if(timeout==1){timeout=0;return;}}else{for(t=0;t<1000;t++){ssof();}return;}}
xinshi();
}
}
void main(void)
{ uint t;
port_init();
USART_Init();
timer0_init(); /* 配置定时器 */
var_init(); /* 仿串口初始化变量 */
//UCSRB = 0x00; //禁止串口中断
// TIMSK=~(1<<OCIE0); //禁止定时器0中断TIMSK = (1<<OCIE0)
SEI();
while(1)
{
j=0;
k=0;
xinshiint();
xinshiw();
anjian();
anjiancunli();
if(rxdat[0]==0x44){for(t=0;t<1000;t++){open();}}
//changdata();
}
}
|