📄 hhh.txt
字号:
//******************************************************
wd24(unsigned char dd)//写意字节
{
unsigned char a;
for(a=0;a<8;a++)
{
if(((dd>>(7-a)) & 0x01)==1)PORTB.0=1;
else PORTB.0=0;
delay_us(20);
scl=1;
delay_us(50);
scl=0;
delay_us(20);
}
}
//************************************
//************************************
unsigned char watack()//////接收应答
{
unsigned int errtime=0;
DDRB.0=0;
PORTB.0=1;
while(!(errtime>20))
{
errtime++;
scl=1;
if(sda==0)
{
delay_us(30);
scl=0;
PORTB.0=0;
DDRB.0=1;
delay_us(50);
return 1;
}
else
if(errtime>60)
{
delay_us(30);
scl=0;
PORTB.0=0;
DDRB.0=1;
delay_us(50);
return 1;
}
}
}
//**********************************************
//**********************************************
void notack(void) //发送非应答 //
{
PORTB.0=1;
delay_us(50);
scl=1;
delay_us(50);
scl=0;
delay_us(30);
}
//**********************************************
//**********************************************
unsigned char readi2c(unsigned int c )//////读地址为c的数据
{
unsigned int address;
unsigned char i, dd;
DDRB.1=1;
DDRB.0=1;
PORTB.0=1;
PORTB.1=1;
address=c;
dd=((address&0x7ff)/256)<<1;
s24();
wd24(0xa0|dd);
watack();
wd24(address);
watack();
s24();
wd24(0xa1|dd);
watack();
i=rd24();
notack();
p24();
return i;
}
//**********************************************
//**********************************************
void writei2c(unsigned int x, unsigned char y)////////////写数据
{
unsigned char m;
unsigned int address;
DDRB.1=1;
DDRB.0=1;
PORTB.1=1;
PORTB.0=1;
address=x;
m=((address&0x7ff)/256)<<1;
s24();
wd24(0xa0|m);
watack();
wd24(address);
watack();
wd24(y);
watack();
p24();
delay_ms(5);
}
///****************************************
//******************************************
//sd1320 的操作函数////////////
void clock_out(unsigned char dd)////时钟输出时序
{
unsigned char a;
DDRB.2=1;
for(a=0;a<8;a++)
{
if(((dd>>a)& 0x01)==1)PORTB.2=1;
else PORTB.2=0;
delay_us(300);SD_CLK=1;
delay_us(300);SD_CLK=0;
delay_us(300);
}
}
//*********************************************************
//*********************************************************
unsigned char clock_in(void) ////时钟输入时序
{
unsigned char a,b;
b=0;
DDRB.2=0; PORTB.2=1;
for(a=0;a<8;a++)
{
if(SD_DAT==1)b+=1<<a;
SD_CLK=1;delay_us(350);SD_CLK=0;delay_us(350);
}
return b;
}
//***********************************************************
//***********************************************************
unsigned char read_clock(unsigned char ord) ///读信息
{
unsigned char dd=0;
SD_CLK=0;
SD_RST=0;
delay_us(350);
SD_RST=1;
delay_us(350);
clock_out(ord);
dd=clock_in();
SD_RST=0;
SD_CLK=1;
return(dd);
}
//*****************************************************
//*****************************************************
void write_clock(unsigned char ord,unsigned char dd) //写信息
{
SD_CLK=0;
SD_RST=0;
delay_us(350);
SD_RST=1;
delay_us(350);
clock_out(ord);
clock_out(dd);
delay_us(350);
SD_RST=0;
SD_CLK=1;
}
//***************************************
unsigned char DecimalToBCD(unsigned char DEC_Byte) //16-10:0X0C - OX12
{
return (DEC_Byte/10)*16+DEC_Byte%10;
}
unsigned char BCDToDecimal(unsigned char BCD_Byte) //10-16:0X12 - 0X0C
{
return (BCD_Byte>>4)*10+(BCD_Byte&0x0f);
}
//读时间函数******************************
unsigned char ReadTime(unsigned char time)
{
// unsigned char i;
// i=read_clock(time);
// i=BCDToDecimal(i); ////////////////////////时间进制转换//
// return i;
return BCDToDecimal(read_clock(time));
}
//*****************************************************
//*****************************************************
////////写时间
void WriteTime(unsigned char TimeType, unsigned char time)
{
time=DecimalToBCD(time); ////////////////////////时间进制转换//
// putchar(time);
write_clock(TimeType,time);
}
//*************************************
//************************************
/////写命令
void WriteCon(unsigned char bt)
{
write_clock(WRITE_CON,bt);
}
//*****************************
//*****************************
///设置时间
void SetTime(unsigned char *Rtime)
{
DDRB.3=1;
DDRB.4=1;
WriteCon(0x00);
WriteTime(WRITE_TIME_YEAR,Rtime[0]);
WriteTime(WRITE_TIME_MON, Rtime[1]);
WriteTime(WRITE_TIME_DAY, Rtime[2]);
WriteTime(WRITE_TIME_HR , Rtime[3]);
WriteTime(WRITE_TIME_MIN, Rtime[4]);
WriteTime(WRITE_TIME_SEC, 0x10);
}
//*********************************
//*********************************
////读取当前时间
void GetTime(unsigned char *Rtime)
{
DDRB.3=1;
DDRB.4=1;
Rtime[0]= ReadTime(READ_TIME_YEAR);
Rtime[1]= ReadTime(READ_TIME_MON);
Rtime[2]= ReadTime(READ_TIME_DAY);
Rtime[3]= ReadTime(READ_TIME_HR );
Rtime[4]= ReadTime(READ_TIME_MIN );
Rtime[5]= ReadTime(READ_TIME_SEC );
}
//******************************
//******************************
void LockOpen()//开锁
{
PW=1;
M1=1;
mep=1;
gai=0;
LED_BLUE=0;
LED_RED=1;
delay_ms(150);
mep=0;
delay_ms(200);
PW=0;
M1=0;
}
//*****************************
//*****************************
void LockClose()////关锁
{
PW=1;
M2=1;
gai=1;
delay_ms(350);
PW=0;
M2=0;
LED_BLUE=1;
}
//*****************************
unsigned char cptime(unsigned char *t1,unsigned char *t2) //T1>T2 返回1 ==2
{
if(t2[0]>t1[0])return 0; //年
if(t2[0]<t1[0])return 1;
if(t2[0]==t1[0])
{
if(t2[1]<t1[1])return 1; //月
if(t2[1]>t1[1])return 0;
if(t2[1]==t1[1])
{
if(t2[2]<t1[2])return 1; //日
if(t2[2]>t1[2])return 0;
if(t2[2]==t1[2])
{
if(t2[3]<t1[3])return 1; //时
if(t2[3]>t1[3])return 0;
if(t2[3]==t1[3])
{
if(t2[4]<t1[4])return 1; //分
if(t2[4]>t1[4])return 0;
if(t2[4]==t1[4])return 2; //相等返回2
}
}
}
}
}
////////*************************
unsigned char EndTime(unsigned char dd)//////判断挂失时间 //dd为卡类型,用来判断该卡挂失时间的存放地址
{
unsigned char pp[6]; //,tt[6]
unsigned char a,b,d; // c,
d=(dd-3)*5+31; //存挂失时间的 地址
for (a=0;a<5;a++) pp[a]=readi2c(d+a); //读 挂失时间
if (bit_guas==1) // 写入挂失时间
{ b=cptime(pp,tm1);
if(b==0) // 就是卡里开始时间比上次挂失时间 大
{
for (a=0;a<5;a++)writei2c(d+a,buf1[5+a]); //把新的挂失时间记录下来
}
if(b==1) return 0; //挂失卡,没现存的大,就是过期卡片
if(b==2) return 1; //相等
return 0;
}
//tm1 大于 PP返回 1
if( cptime(tm1,pp)==1 ) return 1; //卡里开始时间大于等于 现存时间 合法卡 返回1为合法
return 0;
}
//*****************************时间的比较函数
//********************************************
unsigned char Timecp( unsigned char *p) ///卡里时间比 现在时间小 =0 说明卡过期
{
unsigned char cr[6];
GetTime(cr);
// putchar(cr[0]); putchar(cr[1]); putchar(cr[2]); putchar(cr[3]); putchar(cr[4]);putchar(cr[5]);
// putchar(0xaa);
// putchar(p[0]); putchar(p[1]); putchar(p[2]); putchar(p[3]); putchar(p[4]);
// if((p[0]>0x99)||(p[1]>0x12)||(p[1]>0x24)||(p[2]>0x60)||(p[3]>0x60))return 0; //10进制
if(cr[0]>p[0])return 0;
if(cr[0]<p[0])return 1; //年
if(cr[0]==p[0])
{
if(cr[1]<p[1])return 1;
if(cr[1]>p[1])return 0; //月
if(cr[1]==p[1])
{
if(cr[2]<p[2])return 1;
if(cr[2]>p[2])return 0; //日
if(cr[2]==p[2])
{
if(cr[3]<p[3])return 1;
if(cr[3]>p[3])return 0; //时
if(cr[3]==p[3])
{
if(cr[4]<=p[4])return 1; //分
else return 0;
}
}
}
}
}
//*********************************************************
//**********************************************************记录信息 开门记录
void jilu(unsigned char a,unsigned char b,unsigned char c)
{
unsigned char i;
unsigned int j;
unsigned char time[7];
GetTime(time);
i=readi2c(27);
j=i;
i++;
if(i>=250)i=0;
writei2c(27,i); //记录数
writei2c(100+j*7,a);
writei2c(101+j*7,b);
writei2c(102+j*7,c);
writei2c(103+j*7,time[1]);
writei2c(104+j*7,time[2]);
writei2c(105+j*7,time[3]);
writei2c(106+j*7,time[4]);
// writei2c(106+j*5,time[6]);
}
//***************************
//******************************
///////////关闭所有端口以便睡眠
void SystemStop()
{
a=b=c=0;
SREG|=0x80;
DDRB=0;
PORTB=0x40;
DDRC=0;
PORTC=0x20; // 40
DDRD=0;
PORTD=0x20;
PCIFR=0x02; //引脚电平变化唤醒
}
//*********************************
//*********************************
////////读手持机的信息
unsigned char GetData()
{
unsigned int c,n;
unsigned char m;
unsigned int b;
unsigned char mb,bm1;
DDRD.3=1;
PORTD.3=0;
c=0;b=0;
mb=0;
bm1=1;
while(PINB.5==1)
{
c++;
if(c>=30000){c=0;b++;if(b>=5)return 255;}
}
c=0;
for(m=0;m<8;m++)
{
while(PINB.5==0)
{
c++;
if(c>=10000) return 255;
}
n=0;
while(PINB.5==1) {n++; if(n>=1000) return mb;}
if(n>400)mb+=1<<m;
}
for(m=0;m<8;m++)
{
while(PINB.5==0)
{
c++;
if(c>=10000) return 255;
}
n=0;
while(PINB.5==1){n++;if(n>=1000)return bm1;}
if(n>400)bm1+=1<<m;
}
if(mb==bm1) return mb; //Beetmap(10);
return 255;
}
//************************************
//************************************
void write_bit3(unsigned char x)
{
if(x==1)
{
//p_U2270B_CFE=1;
PwmRun();
delay_us(1000);
//p_U2270B_CFE=0;
PwmStop();
delay_us(300);
}
else if(x==0)
{
//p_U2270B_CFE=1;
PwmRun();
delay_us(400);
//p_U2270B_CFE=0;
PwmStop();
delay_us(300);
}
}
//************************************
unsigned char mm;
//向手持机发送信息
//*************************************************
void Write_block(unsigned char p)
{
unsigned char m;
// nopthe=1;
for(m=0;m<8;m++)
{
if(((p>>m)%2)==1)write_bit3(1);
else write_bit3(0);
}
for(m=0;m<8;m++)
{
if(((p>>m)%2)==1)write_bit3(1);
else write_bit3(0);
}
// nopthe=0;
}
//*******************************
//*******************************************
//*******************************************
///////电源电压的a/d转换并低压报警10声
void Dinayuanchx()
{
unsigned char a;
DIDR0=0x00; //
ADMUX=0xe6; //
ADCSRA=0xc4;
delay_us(5);
while(!(ADCSRA==0x94))delay_us(10);
ADCSRA=0;
a=ADCH;
if(a>=240){DIDR0=0;ADCSRA=0;ADMUX=0; return ;}
else {DIDR0=0;ADCSRA=0;ADMUX=0;Beetmap(10);}
}
//*******************************************
decrypt() //解密
{ unsigned char temp;
buf1[0]=buf2[0]>>4; //卡类型
buf1[1]=((buf2[0]&0x01)<<4)+(buf2[1]>>5); //区域号
buf1[2]=((buf2[1]&0x1f)<<2)+(buf2[2]>>6); //栋
buf1[3]=((buf2[2]&0x3f)<<1)+(buf2[3]>>7); //层
buf1[4]=buf2[3]&0x7f; //室
buf1[5]=buf2[4]>>2; //开始年
buf1[6]=((buf2[4]&0x03)<<2)+(buf2[5]>>6); //开始月
buf1[7]=((buf2[5]&0x3f)>>1); //开始日
buf1[8]=((buf2[5]&0x01)<<4)+(buf2[6]>>4); //开始时
buf1[9]=((buf2[6]&0x0f)<<2)+(buf2[7]>>6); //开始分
buf1[10]=buf2[7]&0x7f; //开始秒
buf1[11]=buf2[8]>>2; //结束年
buf1[12]=((buf2[8]&0x03)<<2)+(buf2[9]>>6); //开始月
buf1[13]=((buf2[9]&0x3f)>>1); //开始日
buf1[14]=((buf2[9]&0x01)<<4)+(buf2[10]>>4); //开始时
buf1[15]=((buf2[10]&0x0f)<<2)+(buf2[11]>>6); //开始分
buf1[16]=buf2[11]&0x7f; //开始秒
buf1[17]=buf2[12]; //代理商编号H
buf1[18]=buf2[13]&0xf0; //代理商编号L
buf1[19]=buf2[13]&0x0f; //客户代号H
buf1[20]=buf2[14]; //客户代号L
buf1[21]=buf2[15]; //8位CRC验证
buf1[22]=buf2[5]; //卡号1
buf1[23]=buf2[6]; //卡号2
buf1[24]=buf2[7]; //卡号3
temp=buf2[0]<<4;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -