📄 t5557.c
字号:
if(t2_max < a.W/*)&&(a.W < t2_max)*/)//1P
{
b.W>>=2;//先左移再赋值
b.B.L+=0xc0;
i++;
}
else if(t1_min < a.B.L/*)&&(a.B.L < t1_max)*/)//0.5p
{
b.W>>=1;
b.B.L+=0x80;
}
else {TR0=0;TH0=TL0=0;goto read_error;}
i++;
while(!p_U2270B_OutPut);//上升
TR0=0;a.B.H=TH0;a.B.L=TL0;TH0=TL0=0;TR0=1;
if(t2_min < a.W/*)&&(a.W < t2_max)*/)//1P
{
b.W>>=2;
i++;
}
else if(t1_min < a.B.L/*a.W)&&(a.B.L < t1_max)*/)//0.5P
//else if(!(a.W==0))
{
b.W>>=1;
//temp+=0x00;
//led_light1=0;led_light=1;delay_2(40000);
}
else {TR0=0;TH0=TL0=0;goto read_error;}
i++;
}
//取出奇位
DATA=b.B.L;
BIT13=BIT7;BIT12=BIT5;BIT11=BIT3;BIT10=BIT1;
DATA=b.B.H;
BIT17=BIT7;BIT16=BIT5;BIT15=BIT3;BIT14=BIT1;
bankdata[j]=DATA1;
}
read_ok=1;EA=ES=1;//读卡完成了
read_error:_nop_();
}
}
/***************************************************/
void f_writecard(uchar x)//写卡
{
p_U2270B_CFE=1;
delay_2(232); //>2.5ms
//psw=0 standard write
if (x==write_command0)//写密码:初始化密码
{
uchar i;
uchar data *data p;
p=cominceptbuff;
p_U2270B_CFE=0;delay_2(31);//start gap>330us
write_bit(1);//写操作码1:10
write_bit(0);//写操作码0
write_bit(0);//写锁定位0
for(i=0;i<35;i++)
{
write_bit(1);//写数据位1
}
p_U2270B_CFE=1;
led_light1=0;led_light=1;delay_2(40000);//测试使用
//write_block(cominceptbuff[4],p);
p_U2270B_CFE=1;
bankdata[20]=cominceptbuff[0];//密码存入
bankdata[21]=cominceptbuff[1];
bankdata[22]=cominceptbuff[2];
bankdata[23]=cominceptbuff[3];
}
else if (x==write_command1)//配置卡参数:初始化
{
uchar data *data p;
p=cominceptbuff;
write_bit(1);//写操作码1:10
write_bit(0);//写操作码0
write_bit(0);//写锁定位0
write_block(cominceptbuff[4],p);
p_U2270B_CFE=1;
}
//psw=1 pssword mode
else if(x==write_command2)//
{
uchar data*data p;
p=bankdata[24];
write_bit(1);//写操作码1:10
write_bit(0);//写操作码0
write_password(p);//发口令
write_bit(0);//写锁定位0
p=cominceptbuff;
write_block(cominceptbuff[4],p);//写数据
}
else if(x==write_command3)//aor
{
//cominceptbuff[1]操作码10 X xxxxxB
uchar data *data p;
p=cominceptbuff;
write_bit(1);//10
write_bit(0);
write_password(p);//密码
p_U2270B_CFE=1;//此时数据不停的循环传出
}
else //停止操作码
{
write_bit(1);//11
write_bit(1);
p_U2270B_CFE=1;
}
p_U2270B_CFE=1;
delay_2(560);//5.6ms
}
/************************************/
void f_clearpassword()//清除密码
{
uchar data *data p;
uchar i,x;
p=&bankdata[24];//原密码
p_U2270B_CFE=0;delay_2(18);//start gap>150us
//操作码10:10xxxxxxB
write_bit(1);
write_bit(0);
for(x=0;x<4;x++)//发原密码
{
DATA=*(p++);
for(i=0;i<8;i++)
{
write_bit(BIT0);
DATA>>=1;
}
}
write_bit(0);//锁定位0:0
p=&cominceptbuff[0];
write_block(0x00,p);//写新配置参数:pwd=0
//密码无效:即清除密码
DATA=0x00;//停止操作码00000000B
for(i=0;i<2;i++)
{
write_bit(BIT7);
DATA<<=1;
}
p_U2270B_CFE=1;
delay_2(560);//5.6ms
}
/********************************
*/
void f_changepassword()//修改密码
{
uchar data *data p;
uchar i,x,addr;
addr=0x07;//block7
p=&Nkey_a[0];//原密码
DATA=0x80;//操作码10:10xxxxxxB
for(i=0;i<2;i++)
{
write_bit(BIT7);
DATA<<=1;
}
for(x=0;x<4;x++)//发原密码
{
DATA=*(p++);
for(i=0;i<8;i++)
{
write_bit(BIT7);
DATA>>=1;
}
}
write_bit(0);//锁定位0:0
p=&cominceptbuff[0];
write_block(0x07,p);//写新密码
p_U2270B_CFE=1;
bankdata[24]=cominceptbuff[0];//密码存入
bankdata[25]=cominceptbuff[1];
bankdata[26]=cominceptbuff[2];
bankdata[27]=cominceptbuff[3];
//
DATA=0x00;//停止操作码00000000B
for(i=0;i<2;i++)
{
write_bit(BIT7);
DATA<<=1;
}
p_U2270B_CFE=1;
delay_2(560);//5.6ms
}
/************T0***************/
/***************************子函数**********************************
*/
void write_bit(bit x)//写一位
{
if(x)
{
p_U2270B_CFE=1;delay_2(32);//448*11.0592/120=42延时448us
p_U2270B_CFE=0;delay_2(28);//280*11.0592/120=26写1
}
else
{
p_U2270B_CFE=1;delay_2(92);//192*11.0592/120=18
p_U2270B_CFE=0;delay_2(28);//280*11.0592/120=26写0
}
}
/*******************写一个block*******************/
void write_block(uchar addr,uchar data *data p)
{
uchar i,j;
for(i=0;i<4;i++)//block0数据
{
DATA=*(p++);
for(j=0;j<8;j++)
{
write_bit(BIT0);
DATA>>=1;
}
}
DATA=addr<<=5;//0地址
for(i=0;i<3;i++)
{
write_bit(BIT7);
DATA<<=1;
}
}
/************************************************
*/
void write_password(uchar data *data p)
{
uchar i,j;
for(i=0;i<4;i++)//
{
DATA=*(p++);
for(j=0;j<8;j++)
{
write_bit(BIT0);
DATA>>=1;
}
}
}
/*************************中断函数**********************************
*/
void com (void) interrupt 4 using 1//串口中断,才用中断方式通讯向量地址 0x23h
{
uchar buff;
if (TI)
{
TI=0; //发送中断标志位
//sendjishu++;
if (++sendjishu==9)//使用sendjishu之前改变sendjishu
{
sendjishu=0; //
REN=1;//允许接收
}
else
{
SBUF=comsendbuff[sendjishu];
}
}
else if(RI)
{
buff=SBUF;
RI=0;
switch (jieshoujishu)
{
case 0: if (buff!=0xff) jieshoujishu=0;
else jieshoujishu=1;break;
case 1: if (buff!=0xff) jieshoujishu=0;
else jieshoujishu=2;break;
case 2: if (buff==0xff) jieshoujishu=0;
else jieshoujishu=3;command=buff;break;
case 3: if (buff==0xff) jieshoujishu=0;
else jieshoujishu=4;command1=buff;break;
default: if(jieshoujishu<10)
{
cominceptbuff[jieshoujishu-4]=buff;
jieshoujishu++;
if(jieshoujishu==10) goto com;
}
else
{
com: com_ov=1;
jieshoujishu=0;
REN=0;//不允许收,发使能
}break;
}
}
RI=TI=0;
EA=1; //kai zhongduan
}
/*外中断0******************************************************/
void int0() interrupt 0 using 1
{
}
/*外中断1-----------------------------------------------------*/
void int1() interrupt 2 using 1
{
}
/*定时器0----------25ms---------------------------------------*/
void time0() interrupt 1 using 1
{
}
/*定时器1----------波特率-------------------------------------*/
void time1() interrupt 3 using 1
{
}
/*******************end***********************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -