久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標題:
單片機+RC522讀FM1208 CPU卡程序 定額消費帶PSAM卡操作12864顯示
[打印本頁]
作者:
84660310
時間:
2018-12-6 18:01
標題:
單片機+RC522讀FM1208 CPU卡程序 定額消費帶PSAM卡操作12864顯示
52單片機驅動rc522讀cpu卡資料包:
0.png
(11.68 KB, 下載次數: 59)
下載附件
2018-12-7 04:00 上傳
單片機源程序如下:
#include "reg52.h"
#include <string.h>
#include <intrins.h>
#include "main.h"
#include "RC522.H"
#include "12864.h"
#include "uart.h"
#include "FM1208.H"
#include "psam.h"
unsigned char Serial_Num[8]; //用戶卡序列號
unsigned char code S_KEY_1[8]={0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88}; //分散因子1(為自定義城市標識)
unsigned char code S_KEY_2[8]={0x88,0x77,0x66,0x55,0x44,0x33,0x22,0x11}; //分散因子2(為自定義各成員銀行標識)
//////////////////文件標識的定義/////////////////////////////////////////////////////////////////////////////////
//
//為統一方便管理閱讀代碼,我們在所有的文件名后面加個_Flag,表示就是該對應文件的標識//
//
unsigned char code CZKey_Flag={0x01}; //圈存密鑰標識為01
unsigned char code DPKey_Flag={0x00}; //消費密鑰標識為00
unsigned char code DF_ExKey_Flag = {0x00}; //DF下的外部密鑰標識00
unsigned char code DF_Inital_Key_Flag = {0x00}; //DF下的內部密鑰標識00
unsigned char code FM1208_DF_0015_Flag[]={0x00,0x15}; //公共應用基本數據文件標識0015
unsigned char code FM1208_DF_0016_Flag[]={0x00,0x16}; //持卡人基本信息數據的文件標識0016
////////////////////////////////////////////////////////////////////////
//文件標識
unsigned char code File_3F00[] ={0x3f,0x00}; //MF下的文件標識3F00
unsigned char code File_3F01[] ={0x3f,0x01}; //DF下的文件標識3F01
unsigned char code File_0016={0x16}; //終端機短文件標識
unsigned char Temporary_Key[8];
unsigned char xdata Challenge_Num[8]; //隨機數
unsigned char code DateTime[]={0x20,0x16,0x10,0x26,0x11,0x32,0x45}; //交易時間,如果板子帶有時鐘芯片,可以把實時時間寫入卡中。
unsigned char xdata NameBuf[20]; //臨時存放姓名
unsigned char xdata NameLen; //姓名長度
unsigned char code Purchase_Pay[4]={0x00,0x00,0x00,0x01}; //操作的金額 高位在前,16進制計算的,定額消費1元
unsigned int xdata PAY;
unsigned int xdata Pay_1 ;
unsigned char xdata POSNum[6]; //終端機編號 從SAM卡中讀取
unsigned char xdata g_cSNR[4];
unsigned char xdata DataBuf[MAXRLEN];
unsigned char xdata g_cReceBuf[MAXRLEN];
void NameToStr(char *s) //計算姓名的長度,及臨時保存姓名
{
char i;
NameLen=strlen(s);
for(i=0;i<NameLen;i++)
NameBuf[i]=s[i];
}
void CLRBuff()
{
memset(g_cReceBuf, 0x00, MAXRLEN); //清0
memset(DataBuf, 0x00, MAXRLEN);
}
void Request_loop()
{
s8 status,atq[2] ;
while(1)
{
status = PcdRequest(PICC_REQALL, atq);
if(status != MI_OK)
{
status = PcdRequest(PICC_REQALL, atq);
if(status != MI_OK)
break;
}
}
}
void main( )
{
unsigned int xdata st;
unsigned char xdata tt[2];
unsigned char xdata i;
unsigned char status;
InitializeSystem( );
DelayMs(200); //等待上電穩定
UART_Init(); //串口初始化
RC522_Init(); //RC522初始化 ,
initial_LCD(); //顯示屏初始化
if(PSAMInit(g_cReceBuf)) //PSAM卡初始化
{
UART_Send_Str("無PSAM卡,請插入PSAM卡!");
UART_Send_Enter();
while(1);
}
UART_Send_Str("PSAM卡復位成功!");
UART_Send_Enter();
Dis_Deduct_Charge(0); //12864顯示
PcdAntennaOff();
DelayMs(3);
PcdAntennaOn();
CLRBuff();
while ( 1 )
{
st =PcdRequest(PICC_REQALL, tt); //尋卡
if(st){continue;}
st =PcdAnticoll(g_cSNR);//防沖撞,
if(st){continue;}
st =PcdSelect(g_cSNR); //選擇卡片
if(st){continue;}
if (pro_reset(g_cReceBuf,tt)!=MI_OK) //用戶卡(CPU卡)復位,成功后才能往下操作//
{
CLRBuff();
continue;
}
UART_Send_Enter();
UART_Send_Enter();
UART_Send_Str("用戶卡復位成功!");
UART_Send_Enter();
UART_Send_Enter();
////////////////////////////////////////////////////////////////
CLRBuff();
st=Sam_Select_File(File_3F00, 2, 0,g_cReceBuf, 0x28 ); //選擇SAM卡中PBOC的3F00文件// 0x2E
if(st!=SAM_OK)
{
UART_Send_Str("SAM卡3F00文件打開錯誤:");
UART_Put_Num(g_cReceBuf,2); //顯示錯誤代碼
UART_Send_Enter();
CLRBuff();
Request_loop();
continue;
}
CLRBuff();
st=Sam_ReadBinary( File_0016,g_cReceBuf, 6 ); //讀取SAM卡里面的終端機編號//
if(st!=SAM_OK)
{
UART_Send_Str("SAM卡的終端機編號讀取錯誤:");
UART_Put_Num(g_cReceBuf,2); //顯示錯誤代碼
UART_Send_Enter();
CLRBuff();
Request_loop();
continue;
}
UART_Send_Str("終端機編號為:");
memcpy(POSNum, g_cReceBuf, 6);
UART_Put_Num(POSNum,6);
UART_Send_Enter();
CLRBuff();
st=Sam_Select_File(File_3F01, 2, 0,g_cReceBuf, 0x27 ); //選擇SAM卡中PBOC的3F01文件
if(st!=SAM_OK)
{
UART_Send_Str("SAM卡PBOC文件打開錯誤:");
UART_Put_Num(g_cReceBuf,2); //顯示錯誤代碼
UART_Send_Enter();
CLRBuff();
Request_loop();
continue;
}
UART_Send_Str("SAM卡PBOC文件打開成功!");
UART_Send_Enter();
UART_Send_Enter();
CLRBuff();
st=FM1208_SelectFile(File_3F01,g_cReceBuf,tt); //打開CPU卡中PBOC的3F01文件//
if(st!=0x9000)
{
if(st!=ST_ERR)
{
UART_Send_Str("用戶卡PBOC文件打開錯誤!");
UART_Send_Enter();
}
CLRBuff();
Request_loop();
continue;
}
UART_Send_Str(">>用戶卡PBOC文件打開成功<<");
UART_Send_Enter();
UART_Send_Enter();
CLRBuff();
st=FM1208_Read_Binary(FM1208_DF_0015_Flag[1],g_cReceBuf, 0x1E ); //讀取0015文件公共應用基本數據//
if(st!=0x9000)
{
if(st!=ST_ERR)
{
UART_Send_Str("公共應用基本文件讀取失敗:");
UART_Put_Num(g_cReceBuf,2);
UART_Send_Enter();
}
CLRBuff();
Request_loop();
continue;
}
UART_Send_Str(">>公共應用基本文件讀取成功<<");
UART_Send_Enter();
UART_Send_Enter();
memcpy(Serial_Num, &g_cReceBuf[12], 8); //拷入用戶卡序號
UART_Send_Str("用戶卡序號:");
UART_Put_Num(Serial_Num,8); //用戶卡序號
UART_Send_Enter();
UART_Send_Str("啟動日期:");
UART_Put_Num(&g_cReceBuf[20],4); //這里可做判斷一張卡的生命周期
UART_Send_Str("停用日期:");
UART_Put_Num(&g_cReceBuf[24],4);
UART_Send_Enter();
//////////////////////////////////////////////////////////////
//主要是用戶卡判斷終端的合法性,即是否是有人偽造的終端機
st=FM1208_GetChallenge(8,Challenge_Num); //從用戶卡取一組隨機數//
if(st!=0x9000)
{
if(st!=ST_ERR)
{
UART_Send_Str("用戶卡讀取隨機碼錯誤:");
UART_Put_Num(g_cReceBuf,2);
UART_Send_Enter();
}
CLRBuff();
Request_loop();
continue;
}
UART_Send_Str("取得隨機數");
UART_Put_Num(Challenge_Num,8);
UART_Send_Enter();
CLRBuff();
st=Init_for_descrypt(Serial_Num, 0x8, 0x27,DF_ExKey_Flag, g_cReceBuf); //用3DE初始化 1級分散產生過程密鑰 27--密鑰用途,為加密密鑰
if(st!=SAM_OK)
{
UART_Send_Str("SAM卡的3DES初始化失敗:");
UART_Put_Num(g_cReceBuf,2); //顯示錯誤代碼
UART_Send_Enter();
CLRBuff();
Request_loop();
continue;
}
CLRBuff();
st=Descrypt(Challenge_Num, 0x8, 0, g_cReceBuf, 0x8 ); //3DES算法 對剛才臨時保存的隨機數進行加密//
if(st!=SAM_OK)
{
UART_Send_Str("SAM卡的3DES計算錯誤:");
UART_Put_Num(g_cReceBuf,2); //顯示錯誤代碼
UART_Send_Enter();
CLRBuff();
Request_loop();
continue;
}
UART_Send_Str("外部認證的加密結果:");
UART_Put_Num(g_cReceBuf,8);
memcpy(Temporary_Key, g_cReceBuf, 8); //臨時保存加密結果
UART_Send_Enter();
CLRBuff();
st=FM1208_External_Authenticate(DF_ExKey_Flag,Temporary_Key,g_cReceBuf);
if(st!=0x9000)
{
if(st!=ST_ERR)
{
UART_Send_Str("終端POS機非法,外部認證錯誤:");
UART_Put_Num(g_cReceBuf,2);
UART_Send_Enter();
}
CLRBuff();
Request_loop();
continue;
}
UART_Send_Str("外部認證成功,終端POS機合法!");
UART_Send_Enter();
UART_Send_Enter();
////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////
//主要用于終端判斷卡的合法性,也就是說你這張用戶卡是否能在我的終端上使用
st=Get_challenge(Challenge_Num, 8); //從SAM卡里取一組隨機數//
if(st!=SAM_OK)
{
UART_Send_Str("SAM卡讀取隨機碼錯誤:");
UART_Put_Num(g_cReceBuf,2); //顯示錯誤代碼
UART_Send_Enter();
CLRBuff();
Request_loop();
continue;
}
CLRBuff();
st=FM1208_Inital_Authenticate(DF_Inital_Key_Flag, 8, Challenge_Num,g_cReceBuf); //用戶卡內部認證,加密該隨機數//
if(st!=0x9000)
{
UART_Send_Str("內部認證錯誤:");
UART_Put_Num(g_cReceBuf,2); //顯示錯誤代碼
UART_Send_Enter();
CLRBuff();
Request_loop();
continue;
}
memcpy(Temporary_Key, g_cReceBuf, 8); //臨時保存加密結果
CLRBuff();
st=Init_for_descrypt(Serial_Num, 0x8, 0x2C, DF_Inital_Key_Flag, g_cReceBuf); //用3DE初始化 1級分散產生過程密鑰 2C--密鑰用途,為解密密鑰
if(st!=SAM_OK)
{
UART_Send_Str("SAM卡的3DES初始化失敗:");
UART_Put_Num(g_cReceBuf,2); //顯示錯誤代碼
UART_Send_Enter();
CLRBuff();
Request_loop();
continue;
}
CLRBuff();
st=Descrypt(Temporary_Key, 0x8, 0, g_cReceBuf, 0x8 ); //3DES算法 對剛才臨時保存的加密了的數據進行解密//
if(st!=SAM_OK)
{
UART_Send_Str("SAM卡的3DES計算錯誤:");
UART_Put_Num(g_cReceBuf,2); //顯示錯誤代碼
UART_Send_Enter();
CLRBuff();
Request_loop();
continue;
}
UART_Send_Str("內部認證的解密結果:");
UART_Put_Num(g_cReceBuf,8);
UART_Send_Enter();
for(i=0;i<8;i++)
{
if(g_cReceBuf[i]!=Challenge_Num[i]) //這里判斷卡的合法性//
{
status=1;
break;
}
}
if(status==1)
{
status=0;
UART_Send_Str("非法卡!不能在本終端使用!");
UART_Send_Enter();
CLRBuff();
Request_loop();
continue;
}
UART_Send_Str("內部認證成功,用戶卡合法!");
UART_Send_Enter();
UART_Send_Enter();
////////////////////////////////////////////////////////////////////
CLRBuff();
st=FM1208_Read_Binary(FM1208_DF_0016_Flag[1],g_cReceBuf, 0x27 ); //讀取0016文件持卡人基本信息
if(st!=0x9000)
{
if(st!=ST_ERR)
{
UART_Send_Str("持卡人基本信息文件讀取失敗:");
UART_Put_Num(g_cReceBuf,2);
UART_Send_Enter();
}
CLRBuff();
Request_loop();
continue;
}
UART_Send_Str(">>持卡人基本信息文件讀取成功<<");
UART_Send_Enter();
UART_Send_Enter();
UART_Send_Str("卡類型標識:");
UART_Put_Num(&g_cReceBuf[0],1);
UART_Send_Enter();
UART_Send_Str("本行職工標識:");
UART_Put_Num(&g_cReceBuf[1],1);
UART_Send_Enter();
UART_Send_Str("持 卡 人 的姓名:");
UART_Send_Str(&g_cReceBuf[2]);
NameToStr(&g_cReceBuf[2]);
UART_Send_Enter();
UART_Send_Enter();
UART_Send_Str("持 卡 人 的證件類型:");
UART_Put_Num(&g_cReceBuf[38],1);
UART_Send_Enter();
UART_Send_Str("持 卡 人 的證件號碼:");
UART_Put_Num(&g_cReceBuf[22],16);
UART_Send_Enter();
CLRBuff();
DataBuf[0]=DPKey_Flag; //1個字節的消費密鑰標識
memcpy(&DataBuf[1], Purchase_Pay, 4); //4個字節的交易金額,即扣款金額
memcpy(&DataBuf[5], POSNum, 6); //6個字節的終端機編號
st=FM1208_Initalize_For_Purchase(EP, DataBuf,g_cReceBuf,tt); //消費初始化操作//
if(st!=0x9000)
{
if(st!=ST_ERR)
{
UART_Send_Str("初始化消費錯誤:");
UART_Put_Num(g_cReceBuf,tt[0]); //當返回9403時,此時檢查一下你的用戶卡里面的消費密鑰的標識號,是否對應?
UART_Send_Enter();
if(st==0x9401)
DisNotMoney(); //卡余額不足
DelayMs(2000);
Dis_Deduct_Charge(0);
}
CLRBuff();
Request_loop();
continue;
}
UART_Send_Str(">>消費初始化成功<<");
UART_Send_Enter();
UART_Send_Enter();
UART_Send_Str("電子錢包未消費前的余額:");
UART_Put_Num(g_cReceBuf,4);
UART_Send_Enter();
UART_Send_Str("電子錢 包 交 易序號:");
UART_Put_Num(&g_cReceBuf[4],2);
UART_Send_Enter();
UART_Send_Str(" 限 額:");
UART_Put_Num(&g_cReceBuf[6],3);
UART_Send_Enter();
UART_Send_Str("密鑰版本號:");
UART_Put_Num(&g_cReceBuf[9],1);
UART_Send_Enter();
UART_Send_Str("算法標識:");
UART_Put_Num(&g_cReceBuf[10],1);
UART_Send_Enter();
UART_Send_Str("偽隨機碼:");
UART_Put_Num(&g_cReceBuf[11],4);
UART_Send_Enter();
PAY=g_cReceBuf[2]<<8;
PAY|=g_cReceBuf[3];
Dis_Money(NameLen,NameBuf,PAY); //屏顯示消費前的余額
memcpy(DataBuf, &g_cReceBuf[11], 4); //拷偽隨機數
memcpy(&DataBuf[4], &g_cReceBuf[4], 2); //用戶卡交易序號
memcpy(&DataBuf[6], Purchase_Pay, 4); //交易金額
DataBuf[10]=0x06; //交易類型
memcpy(&DataBuf[11], DateTime, 7); //交易日期時間
DataBuf[18]=DPKey_Flag; //消費密鑰版本標識號
DataBuf[19]=0x00; //算法標識,3DES
memcpy(&DataBuf[20], Serial_Num, 8); //用戶卡序號
memcpy(&DataBuf[28], S_KEY_2, 8); //分散因子2(為各成員銀行標識)
memcpy(&DataBuf[36], S_KEY_1, 8); //分散因子1(為各城市標識)
st=Init_SAM_For_Purchase(DataBuf, 0x2C, g_cReceBuf); //MAC1計算初始化//
if(st!=SAM_OK)
{
UART_Send_Str("MAC1計算錯誤:"); //當返回9403時,此時檢查一下你的SAM卡里面的消費密鑰的版本標識號,是否對應?
UART_Put_Num(g_cReceBuf,0x02);
UART_Send_Enter();
CLRBuff();
Request_loop();
Dis_Deduct_Charge(0);
continue;
}
UART_Send_Str(">>MAC1計算初始化成功<<");
UART_Send_Enter();
UART_Send_Enter();
UART_Send_Str("終端交易序號:");
UART_Put_Num(g_cReceBuf,0x04);
UART_Send_Enter();
UART_Send_Str("返回的MAC1碼:");
UART_Put_Num(&g_cReceBuf[4],0x04);
UART_Send_Enter();
memcpy(DataBuf, g_cReceBuf, 4); //拷終端交易序號
memcpy(&DataBuf[4], DateTime, 7); //拷交易日期時間
memcpy(&DataBuf[11], &g_cReceBuf[4], 4); //拷MAC1
st=FM1208_Debit_For_Capp_Purchase(DataBuf,g_cReceBuf,tt); //消費命令//
if(st!=0x9000)
{
if(st!=ST_ERR)
{
UART_Send_Str("扣款失敗:");
UART_Put_Num(g_cReceBuf,tt[0]); //當返回9302時,此時檢查一下你的密鑰因子是否正確,包括用戶卡序列號,成員銀行及城市代碼,由于密鑰因子錯了,分散出的過程密鑰也是錯的,所以計算出的MAC也是錯的
UART_Send_Enter();
DisCardfail();
}
CLRBuff();
Request_loop();
Dis_Deduct_Charge(0);
continue;
}
UART_Send_Str("用戶卡返回的交易驗證TAC:");
UART_Put_Num(g_cReceBuf,4);
UART_Send_Enter();
UART_Send_Str("用戶卡返回的MAC1:");
UART_Put_Num(&g_cReceBuf[4],4);
UART_Send_Enter();
memcpy(DataBuf, &g_cReceBuf[4], 4); //拷MAC2,然后發送給PSAM卡進行校驗
st=Credit_SAM_For_Purchase(DataBuf, g_cReceBuf); //MAC2校驗//
if(st!=SAM_OK)
{
UART_Send_Str("校驗MAC2錯誤:");
UART_Put_Num(g_cReceBuf,2); //顯示錯誤代碼
UART_Send_Enter();
DisCardfail();
CLRBuff();
Request_loop();
Dis_Deduct_Charge(0);
continue;
}
UART_Send_Str("扣款MAC2校驗成功!");
UART_Send_Enter();
UART_Send_Enter();
st=FM1208_ReadNomey(EP ,g_cReceBuf); //讀充值后的余額//
……………………
…………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei提供下載:
CPU卡定額消費帶PSAM卡操作并顯示屏顯示.zip
(222.9 KB, 下載次數: 262)
2018-12-6 18:00 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
作者:
wj0755
時間:
2018-12-22 15:35
好的,看看 學習了
作者:
sn300
時間:
2018-12-30 15:38
正找CPU卡的資料來看看
作者:
xiaowu1716
時間:
2019-1-29 16:14
非常感謝!我一直尋找這個代碼,終于找到了,謝謝樓主的無私奉獻!666
作者:
wang-123
時間:
2019-4-22 18:31
已下載,內容很好
作者:
saj123456
時間:
2019-7-2 22:38
好資料謝謝分享
作者:
loveappletree
時間:
2019-7-11 10:39
謝謝,非常感謝
作者:
Raywang89
時間:
2019-7-24 16:26
非常好的資料,謝謝
作者:
liudi1990
時間:
2019-8-1 19:27
感謝大神分享
作者:
hlmpost
時間:
2019-8-17 12:00
fm1208白卡,rats,無回復?
作者:
隨風不留痕
時間:
2019-8-25 19:18
感謝分享,看下內容。
作者:
liy_278
時間:
2019-8-30 17:41
感謝分享
作者:
fl15614
時間:
2019-9-26 09:36
感謝樓主分享!學習了
作者:
plainsailing
時間:
2019-10-15 16:59
感謝樓主分享
作者:
bjghui
時間:
2019-11-24 15:16
感謝樓主分享!學習一下
作者:
zalelife
時間:
2020-2-19 18:20
不錯的代碼分享
作者:
fengyu200208
時間:
2025-1-15 20:00
感謝樓主分享,學習了。
歡迎光臨 (http://m.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
日韩一区二区在线视频
|
av一级在线
|
精品一二三区
|
激情综合五月天
|
激情久久久
|
欧洲精品一区
|
波多野结衣视频在线
|
永久黄网站色视频免费观看w
|
中文字幕欧美在线
|
欧美久久久久久久久久
|
亚洲日本在线观看
|
久久久久久中文字幕
|
国产一区在线播放
|
六月天婷婷
|
日韩伦理视频
|
久久久久免费视频
|
国产欧美日韩在线视频
|
欧美日韩在线精品
|
性做久久
|
人人爽人人爽人人爽
|
羞羞网站在线观看
|
国产欧美精品一区二区三区
|
久综合
|
五月色丁香
|
亚洲性生活片
|
激情婷婷综合
|
亚洲男人天堂网
|
日韩三级在线播放
|
日韩久久久
|
国产一级在线视频
|
天天干天天曰
|
97av在线视频
|
日韩在线中文
|
欧美在线不卡
|
成年人免费在线视频
|
国产黄色免费网站
|
久久久不卡
|
欧美一区免费
|
欧美啪啪网站
|
久久天天躁狠狠躁夜夜躁2014
|
色综合久久天天综合网
|