?? duxiem1ka.c
字號:
for(i=0;i<4;i++)rxbuff[6]^=rxbuff[i];
if(rxbuff[2]==0)
if(rxbuff[4]==rxbuff[6])
CardStatus=0x01;
}
/*--------------------------------------------------------------------
FUNCTION: Read_Card,讀指定塊數(shù)據(jù)
INPUT: uchar BlockNo,uchar *CardDataBuf
OUTPUT: 16byte CardData,1byte CardStatus
--------------------------------------------------------------------*/
/**************************************************
四、 讀指定塊數(shù)據(jù)
;command:3C 04 01 66 00(絕對塊號) 00 BCC 0D
**************************************************/
void Read_Card(uchar BlockNo_,uchar *CardDataBuf_)
{ uchar i;
uchar txbuff[8];
uchar rxbuff[22];
CardStatus=0;
txbuff[0]=0x3C;
txbuff[1]=0x04;
txbuff[2]=0x01;
txbuff[3]=0x66;
txbuff[4]=BlockNo_;
txbuff[5]=0x00;
txbuff[6]=0;
for(i=0;i<6;i++)txbuff[6]^=txbuff[i];
txbuff[7]=0x0D;
for(i=0;i<8;i++)
{
UART_PutByte(txbuff[i]);
}
//;--------------------------------------------------------------------
//; Right: 3C 12 00 DATA0~DATA15 BCC 0D
//; Error: 3C 01 FF(錯(cuò)誤返回代碼) BCC 0D
//;--------------------------------------------------------------------
//;;;;;;
for(i=0;i<21;i++)
{
rxbuff[i]=UART_GetByte();
if(rxbuff[0]!=0x3C)i=0;
if(rxbuff[i]==0x0D)break;
}
rxbuff[21]=0;
for(i=0;i<19;i++)
rxbuff[21]^=rxbuff[i];
if(rxbuff[19]==rxbuff[21])
if(rxbuff[1]==0x12) //成功取卡中的值
{ CardStatus=0x01;
for(i=0;i<16;i++)
*CardDataBuf_++=rxbuff[3+i]; //取卡數(shù)據(jù)
}
}
/*--------------------------------------------------------------------
FUNCTION: Write_Card,向指定塊寫數(shù)據(jù)
INPUT: uchar BlockNo,uchar *CardDataBuf
OUTPUT: 1byte CardStatus
--------------------------------------------------------------------*/
/**************************************************
五、 向指定塊寫數(shù)據(jù)
command:3C 13 01 67 00(絕對塊號) DATA0~DATA15 BCC 0D
***************************************************/
void Write_Card(uchar BlockNo_,uchar *CardDataBuf_)
{
uchar i;
uchar txbuff[23];
uchar rxbuff[7];
//i=BlockNo_;
//i=*CardDataBuf_;
CardStatus=0;
txbuff[0]=0x3C;
txbuff[1]=0x13;
txbuff[2]=0x01;
txbuff[3]=0x67;
txbuff[4]=BlockNo_;
txbuff[4]=BlockNo_; //block
for(i=0;i<16;i++)
txbuff[5+i]=*CardDataBuf_++; //待寫數(shù)據(jù)
txbuff[21]=0;
for(i=0;i<21;i++)
txbuff[21]^=txbuff[i]; //BCC
txbuff[22]=0x0D;
for(i=0;i<23;i++)
{
UART_PutByte(txbuff[i]);
}
//;--------------------------------------------------------------------
//;Write_Card return
//; Right: 3C 02 00 00 BCC 0D
//; Error: 3C 01 FF(錯(cuò)誤返回代碼) BCC 0D
//;--------------------------------------------------------------------
//;;;;;;
for(i=0;i<7;i++)
{
rxbuff[i]=UART_GetByte();
// if(rxbuff[0]!=0x3C)i=0;
if(rxbuff[i]==0x0D)break;
}
rxbuff[6]=0;
for(i=0;i<4;i++)
rxbuff[6]^=rxbuff[i];
if(rxbuff[6]==rxbuff[4])
CardStatus=0x01;
}
//==Write_Card end==
/*--------------------------------------------------------------------
FUNCTION: TurnOff_Card,關(guān)卡
INPUT:
OUTPUT: CardStatus
--------------------------------------------------------------------*/
/**************************************************
八、 關(guān)卡,關(guān)掉的M1卡片,這個(gè)命令不僅僅是關(guān)卡,還讓讀卡電路恢復(fù)到主動(dòng)尋卡狀態(tài)
command:3C 04 01 68 00 00 51 0D
**************************************************/
void TurnOff_Card(void)
{ uchar i;
uchar txbuff[8];
uchar rxbuff[7];
CardStatus=0;
txbuff[0]=0x3C;
txbuff[1]=0x04;
txbuff[2]=0x01;
txbuff[3]=0x68;
txbuff[4]=0x00;
txbuff[5]=0x00;
txbuff[6]=0x51;
txbuff[7]=0x0D;
for(i=0;i<8;i++)
UART_PutByte(txbuff[i]);
//;--------------------------------------------------------------------
//; Right: 3C 02 00 00 3E 0D
//; Error: 3C 01 FF (錯(cuò)誤返回代碼)BCC 0D
//;--------------------------------------------------------------------
//;;;;;;
for(i=0;i<6;i++)
{
rxbuff[i]=UART_GetByte();
if(rxbuff[0]!=0x3C)i=0;
if(rxbuff[i]==0x0D)break;
}
rxbuff[7]=0;
for(i=0;i<4;i++)rxbuff[7]^=rxbuff[i];
if(rxbuff[7]==rxbuff[4])CardStatus=0x01;
}
/*--------------------------------------------------------------------
FUNCTION: SetRes,如果該step失敗,將tmpResult中該步對應(yīng)位調(diào)整為0,操作成功則不做改變
INPUT: CardStatus(step succed equal 0x01)
OUTPUT: tmpResult
--------------------------------------------------------------------*/
void SetRes(uchar RES,uchar NUM)
{
uchar temp1,temp2;
if(RES==0) //如果SETP操作失敗(完成標(biāo)記字節(jié)為零),調(diào)整tmpResult中對應(yīng)該位為0態(tài)
{
temp1=0xFF>>NUM;
temp2=0xFF<<9-NUM;
temp1=temp1|temp2;
tmpResult=temp1&tmpResult;
}
}
/*--------------------------------------------------------------------
FUNCTION: display() ;操作成功步對應(yīng)位綠燈亮;操作失敗步對應(yīng)位紅燈亮
INPUT: tmpResult
OUTPUT: P1 AND P3.5 OR P3.7
--------------------------------------------------------------------*/
void display(uchar DispData)
{ P1=DispData; //操作成功步對應(yīng)位亮
GREEN_LINE=0; //綠燈亮
delay10ms(20);
GREEN_LINE=1; //綠燈滅
P1=~DispData&0xfc; //操作失敗步對應(yīng)位亮
RED_LINE=0; //紅燈亮
delay10ms(30);
RED_LINE=1; //紅燈滅
}
/*--------------------------------------------------------------------
FUNCTION: led_cyc_on()
INPUT:
OUTPUT:
--------------------------------------------------------------------*/
//void led_cyc_on(void)
//{
// uchar i,Ddata=0x80;
// P1=0x00;
// GREEN_LINE =1;
// RED_LINE=1;
// delay10ms(10);
// GREEN_LINE=0;
// for(i=0;i<8;i++)
// {
//
// P1=_cror_(Ddata,i);
// delay10ms(10);
// }
/* GREEN_LINE=1;
RED_LINE=0;
Ddata=0x01;
for(i=0;i<8;i++)
{
P1=_crol_(Ddata,i);
delay10ms(20);
}*/
// GREEN_LINE =1;
// RED_LINE=1;
//}
//**************************************************
void wangdianshezhi(uchar *CardNo)
{
uchar CardBlockNo,i;
//uchar data CardNo[4];
uchar CardDataBuf[16];
uchar data CardBlockKey[6];
uchar BlockKeyAorB=0;//A套密碼
for(i=0;i<6;i++) CardBlockKey[i]=0xff;
//for(i=0;i<4;i++) CardNo[i]=i+1;
//讀塊4
jixudukuai4:
CardBlockNo=0x04;
Psd_Verify(CardBlockKey,BlockKeyAorB,CardBlockNo,CardNo);
if (CardStatus)
{
CardBlockNo=0x04;
Read_Card(CardBlockNo,CardDataBuf);
//for (i=0;i<16;i++)
//sen(CardDataBuf[i]);
//sen(CardDataBuf[0]);
//sen(CardDataBuf[1]);
};
if (CardStatus)
{
writertc(wangdiangaodizhi,CardDataBuf[0]);
writertc(wangdiandidizhi,CardDataBuf[1]);
// sen(readrtc(wangdiangaodizhi));
// sen(readrtc(wangdiandidizhi));
}
else
goto jixudukuai4;
}
void wangdianpanduan(uchar *CardNo)
{
uchar BlockNo,CardBlockNo,i;
//uchar data CardNo[4];
uchar CardDataBuf[16];
uchar data CardBlockKey[6];
uchar BlockKeyAorB=0;//A套密碼
bit douweiling;
for(i=0;i<6;i++) CardBlockKey[i]=0xff;
//for(i=0;i<4;i++) CardNo[i]=i+1;
//讀取第4塊
CardBlockNo=0x04;
Psd_Verify(CardBlockKey,BlockKeyAorB,CardBlockNo,CardNo);
Read_Card(CardBlockNo,CardDataBuf);
//如果是注冊用戶則讀取第C塊
if (CardDataBuf[0]==readrtc(wangdiangaodizhi) && CardDataBuf[1]==readrtc(wangdiandidizhi)) //如果是啟動(dòng)卡
{
//讀取第C塊
CardBlockNo=0x0c;
Psd_Verify(CardBlockKey,BlockKeyAorB,CardBlockNo,CardNo);
Read_Card(CardBlockNo,CardDataBuf);
//如果內(nèi)容為16個(gè) 0 則 寫數(shù)據(jù) ,播放可以通過聲音
douweiling=1;
for(i=0;i<16;i++)
{
if ( CardDataBuf[i]!=0)
douweiling=0;
};
if (douweiling==1)
{
//如果內(nèi)容為16個(gè) 0 則 寫數(shù)據(jù) ,播放可以通過聲音
BlockNo=0x0c;
CardDataBuf[2]=readrtc(0x08); //月
CardDataBuf[3]=readrtc(0x07); //日
CardDataBuf[4]=readrtc(0x04); //時(shí)
CardDataBuf[5]=readrtc(0x02); //分
CardDataBuf[6]=0x00; //00
CardDataBuf[7]=0x10; //10
CardDataBuf[15]=0x02; //02
Write_Card(BlockNo,CardDataBuf);
Read_Card(CardBlockNo,CardDataBuf);
for (i=0;i<16;i++)
sen(CardDataBuf[i]);
sen(0x30);
};
//如果內(nèi)容不為 0 則 嘀 嘀 嘀 響3聲;
if (douweiling==0)
{
//如果內(nèi)容不為 0 則 嘀 嘀 嘀 響3聲;
// CardBlockNo=0x0c;
// Psd_Verify(CardBlockKey,BlockKeyAorB,CardBlockNo,CardNo);
// for(i=0;i<16;i++)
// CardDataBuf[i]=0x00;
// Write_Card(CardBlockNo,CardDataBuf);
//for(i=0;i<16;i++)
// CardDataBuf[i]=0x03;
// Read_Card(CardBlockNo,CardDataBuf);
// for (i=0;i<16;i++)
// sen(CardDataBuf[i]);
sen(0x33);
};
}
else //如果是非注冊用戶 則響 5 聲;
{
//響 5 聲
sen(0x35);
};
}
//************************************************8
void main(void)
{
uchar i,j,zhilingma;
uchar data CardNo[4],CardBlockKey[6];
uchar idata CardDataBuf[16];
bit qidongzhuangtai;
uchar CardBlockNo=02; //默認(rèn)塊06(0-63)
uchar BlockKeyAorB=0;//A套密碼
uchar shezhiriqishijian[6];
uchar xtshijian[6];
Init_UART();
PCON = 0x00; //SMOD=0
TMOD = 0x20; //Timer1:Mode2
TH1 = 0xfd; //9600Baud, 11.059M
TL1 = 0xfd;
SCON = 0x50; //mode 1,8bit UART ,SM2=0,REN=1
TR1 = 1;
for(i=0;i<6;i++) CardBlockKey[i]=0xff;
for(i=0;i<4;i++) CardNo[i]=i+1;
beep=0;
//writertc(qidongzhuangtaidizhi,0x30);
//判斷是否進(jìn)行過啟動(dòng)操作
sen(0x30);
//while(1);
// GREEN_LINE=0; //green led on
// delay10ms(50);
// GREEN_LINE=1; //led off
// RED_LINE=0; //red led on
// delay10ms(50);
// RED_LINE=1; //led off
// display(tmpResult);
// led_cyc_on();
while(1)
{
start:
RI=0;
zhilingma=0;
sen(0xfd);
while(!RI);
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -