📄 ic carddlg.cpp
字号:
// IC CardDlg.cpp : implementation file
//
#include "stdafx.h"
#include "IC Card.h"
#include "IC CardDlg.h"
#include "CIo.h"
#include "lcdreg.h"
#include "Gpio.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CICCardDlg dialog
CICCardDlg::CICCardDlg(CWnd* pParent /*=NULL*/)
: CDialog(CICCardDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CICCardDlg)
writeaddress = _T("");
writedata = _T("");
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CICCardDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CICCardDlg)
DDX_Text(pDX, IDC_EDIT1, writeaddress);
DDX_Text(pDX, IDC_EDIT3, writedata);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CICCardDlg, CDialog)
//{{AFX_MSG_MAP(CICCardDlg)
ON_BN_CLICKED(IDC_BUTTON1, Onwrite)
ON_BN_CLICKED(IDC_BUTTON2, Onread)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CICCardDlg message handlers
BOOL CICCardDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
CenterWindow(GetDesktopWindow()); // center to the hpc screen
bInitGpioReg();//初始化引脚
LcdOn();//点亮LCD
SetTimer(1,2000,NULL);
test=3;
SetTimer(KEY_TIMER,KEY_DELAY,NULL);//开始监控按键
// TODO: Add extra initialization here
return TRUE; // return TRUE unless you set the focus to a control
}
void CICCardDlg::Onwrite()
{
// TODO: Add your control notification handler code here
// ICCardPowerOn();//ARM9 的GPIO引脚置高给IC卡供电
UpdateData(TRUE);
int len = writeaddress.GetLength();//取得写入地址输入字符长度
char *psendbuf=new char[len];
for(int i=0;i<len;i++)
psendbuf[i]=(char)writeaddress.GetAt(i);
ICCard_data[0] = psendbuf[i];
ICCard_Write(0,1,8);
// ICCardPowerOff();//ARM9 的GPIO引脚置低给IC卡断电
MessageBox(_T("Write data into IC card succesufully!"));
}
void CICCardDlg::Onread()
{
// TODO: Add your control notification handler code here
CWnd* pWnd;
CICCardDlg* pDlg=(CICCardDlg* )pWnd;
CEdit * pRecvStrEdit= (CEdit* )pDlg->GetDlgItem(IDC_EDIT4);
CString strRecv = ICCard_data[0];
pRecvStrEdit->SetWindowText(strRecv);
// ICCardPowerOn();//ARM9 的GPIO引脚置高给IC卡供电
ICCard_Read(0,1);
// ICCardPowerOff();//ARM9 的GPIO引脚置低给IC卡断电
}
/*******************************************************\
| 函数名 ICCardPowerOn |
| 函数功能 IC卡上电 |
| 参数 无 |
| 返回值 无 |
\*******************************************************/
//void ICCardPowerOn()
//{
// PC&= 0xFB; //将第2位置0 //电路上可以直接连电源
//}
/*******************************************************\
| 函数名 ICCardPowerOff |
| 函数功能 IC卡下电 |
| 参数 无 |
| 返回值 无 |
\*******************************************************/
//void ICCardPowerOff()
//{
// PC|= 0x04; //第2位置1
//}
/*******************************************************\
| 函数名 ICCard_Write |
| 函数功能 向ICCard的offset处写入length个字节 |
| 参数 offset : IC卡内扁移地址 |
| length : 写入数据长度 |
| PageLen : IC卡页数据长度 |
| 返回值 无 |
\*******************************************************/
void CICCardDlg::ICCard_Write( unsigned int offset,
unsigned int length,
unsigned char PageLen)
{
unsigned int pagenum,basepage;
unsigned char j,firstlen;
//chang_4052(3);
basepage = offset/PageLen;//首字节所在页面号
if((offset%PageLen+length)>PageLen)//数据跨区
{
pagenum=(length-(PageLen-(offset%PageLen)))/PageLen+1;
firstlen=PageLen-(offset%PageLen);
if((length-(PageLen-(offset%PageLen)))%PageLen) pagenum++;
}
else//数据不跨区,仅需发送一页。
{
pagenum = 1;
firstlen = length;
}
//发送第一页
ICCard_Start();
ICCard_OutB(0xA0+(unsigned char)((offset>>8)*2));
ICCard_OutB((unsigned char)(offset));
for (j = 0;j < firstlen;j++)
// ICCard_OutB(XBYTE[j]);
ICCard_OutB(ICCard_data[j]);
ICCard_Stop();
// delay_1ms(10);
Sleep(10);
//如果超过2页,发送中间页
for( pointer = 2 ; pointer < pagenum ; pointer++)
{
ICCard_Start();
ICCard_OutB(0xA0+((((unsigned char)(((basepage+pointer-1)*PageLen)>>8))*2)&0x0e));
ICCard_OutB((unsigned char)((basepage+pointer-1)*PageLen));
for (j = 0;j < PageLen;j++)
{
// ICCard_OutB(XBYTE[firstlen+((pointer-2)*PageLen)+j]);
ICCard_OutB(ICCard_data[firstlen+((pointer-2)*PageLen)+j]);
}
ICCard_Stop();
Sleep(3);
}
//如果不止一页,发送最后一页
if(pagenum>1)
{
ICCard_Start();
ICCard_OutB(0xA0+(unsigned char)((((basepage+pagenum-1)*PageLen)>>8)*2));
ICCard_OutB((unsigned char)((basepage+pagenum-1)*PageLen));
for (j = 0;j < length-firstlen-(pagenum-2)*PageLen;j++)
{
ICCard_OutB(ICCard_data[firstlen+((pagenum-2)*PageLen)+j]);
}
ICCard_Stop();
Sleep(10);
}
}
/*******************************************************\
| 函数名 _CardSetClock |
| 函数功能 设置IC卡CLOCK |
| 参数 Level : 待设置的IC卡CLOCK电平 |
| 返回值 无 |
\*******************************************************/
void CICCardDlg::_CardSetClock(unsigned char Level)
{
if(Level==0)
{
mycio.GetGPF20();}
if(Level==1)
{
mycio.GetGPF2();}
}
/*******************************************************\
| 函数名 _CardPutIO |
| 函数功能 设置IC卡IO |
| 参数 IOData : 待设置的IC卡IO电平 |
| 返回值 无 |
\*******************************************************/
void CICCardDlg::_CardPutIO(unsigned char IOData)
{
if(IOData==0)
{
mycio.GetGPF30();}
if(IOData==1)
{
mycio.GetGPF3();}
}
/*******************************************************\
| 函数名 _CardReadIO |
| 函数功能 读取IC卡IO |
| 参数 无 |
| 返回值 读取的IC卡IO |
\*******************************************************/
unsigned char CICCardDlg::_CardReadIO()
{int g;
g=mycio.GetGPF33();
return g;
}
/*******************************************************\
| 函数名 AT24_Pulse |
| 函数功能 给IC卡一个时钟周期 |
| 参数 无 |
| 返回值 无 |
\*******************************************************/
void CICCardDlg::ICCard_Pulse()
{
_CardSetClock(1);
_CardSetClock(0);
}
/*******************************************************\
| 函数名 AT24_Start |
| 函数功能 给IC卡开始信号 |
| 参数 无 |
| 返回值 无 |
\*******************************************************/
void CICCardDlg::ICCard_Start()
{
_CardPutIO(1); _CardSetClock(1);
_CardPutIO(0); _CardSetClock(0);
}
/*******************************************************\
| 函数名 ICCard_Stop |
| 函数功能 给IC卡停止信号 |
| 参数 无 |
| 返回值 无 |
\*******************************************************/
void CICCardDlg::ICCard_Stop()
{
_CardPutIO(0); _CardSetClock(1);
_CardPutIO(1); _CardSetClock(0);
}
/*******************************************************\
| 函数名 ICCard_OutB |
| 函数功能 向IC卡发送一个字节 |
| 参数 无 |
| 返回值 无 |
\*******************************************************/
void CICCardDlg::ICCard_OutB(unsigned char OutData)
{
unsigned char i;
for (i = 0;i < 8;i++)
{
if ( (OutData & 0x80) == 0x80 ) _CardPutIO(1); else _CardPutIO(0);
ICCard_Pulse(); OutData = OutData << 1;
}
_CardPutIO(1); ICCard_Pulse();
}
/*******************************************************\
| 函数名 ICCard_InB |
| 函数功能 从IC卡接受一个字节 |
| 参数 无 |
| 返回值 无 |
\*******************************************************/
unsigned char CICCardDlg::ICCard_InB()
{
unsigned char i,InData = 0;
for (i = 0;i < 8;i++)
{
InData = InData << 1;
_CardSetClock(1);
InData = InData + _CardReadIO();
_CardSetClock(0);
}
return InData;
}
/*******************************************************\
| 函数名 ICCard_Read |
| 函数功能 从IC卡的offset处读出length个字节 |
| 参数 offset : IC卡内偏移地址 |
| length : 读出数据长度 |
| 返回值 无 |
\*******************************************************/
void CICCardDlg::ICCard_Read(unsigned int offset,unsigned int length)
{
// chang_4052(3);
ICCard_Start();
ICCard_OutB(0xA0+((((unsigned char)(offset>>8))*2)&0x0e));
ICCard_OutB((unsigned char)offset);
ICCard_Start();
ICCard_OutB(0xA1+((((unsigned char)(offset>>8))*2)&0x0e));
for (pointer = 0 ; pointer < length ; pointer++)
{
ICCard_data[pointer] = ICCard_InB();
_CardPutIO(0);
ICCard_Pulse();
_CardPutIO(1);
}
ICCard_Stop();
for (pointer = 0 ; pointer < 32; pointer++)
{
ICCard_Pulse();
}}
void CICCardDlg::OnTimer(UINT nIDEvent)
{
if (nIDEvent==KEY_TIMER)//处理按键输入
{
if (keypress==0)
{
KillTimer(KEY_TIMER);
static long myflagnum=0;//用于跟踪调试
if (mycio.GetGPF0()==1)//IC卡写开始按键,1个字节
{
MessageBox(_T("Write data into IC card succesufully!"));
keypress=1;
ICCard_data[0] = 0x05;
ICCard_Write(0,1,8);
}
else if (mycio.GetGPF1()==1)//Key4
{
keypress=2;
}
// else if (mycio.GetGPF3()==1)//Key1
// {
// keypress=3;
// }
// else if (mycio.GetGPF2()==1)//Key2
// {
// keypress=4;
//
// }
else if (mycio.GetGPG0()==1)//IC卡读开始按键,1个字节
{
keypress=5;
MessageBox(_T("Read data into IC card succesufully!"));
CWnd* pWnd;
CICCardDlg* pDlg=(CICCardDlg* )pWnd;
CEdit * pRecvStrEdit= (CEdit* )pDlg->GetDlgItem(IDC_EDIT4);
CString strRecv = ICCard_data[0];
pRecvStrEdit->SetWindowText(strRecv);
// ICCardPowerOn();//ARM9 的GPIO引脚置高给IC卡供电
ICCard_Read(0,1);
// ICCardPowerOff();//ARM9 的GPIO引脚置低给IC卡断电
}
SetTimer(KEY_TIMER,KEY_DELAY,NULL);//开始监控按键
}//if (keypress==0)
else
{
if ((keypress==1)&&(mycio.GetGPF0()==0))
{
keypress=0;
}
// if ((keypress==2)&&(mycio.GetGPF1()==0))
// {
// keypress=0;
// }
// if ((keypress==3)&&(mycio.GetGPF3()==0))
// {
// keypress=0;
// }
// if ((keypress==4)&&(mycio.GetGPF2()==0))
// {
// keypress=0;
// }
if ((keypress==5)&&(mycio.GetGPG0()==0))
{
keypress=0;
}
}
}
CDialog::OnTimer(nIDEvent);
}
BOOL CICCardDlg::bInitGpioReg()
{
mycio.bInitGpioReg();//调用IO类中的初始化函数
mylcd.bInitLcdReg();//调用LCD类中的初始化函数
return TRUE;
}
void CICCardDlg::LcdOn()
{
//mycio.ClsPOWEREN();//点亮LCD
mylcd.LcdOn();
}
void CICCardDlg::LcdOff()
{
//mycio.SetPOWEREN();//关闭LCD
mylcd.LcdOff();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -