历史上的今天
返回首页

历史上的今天

今天是:2025年01月09日(星期四)

正在发生

2018年01月09日 | IC卡控制程序

2018-01-09 来源:eefocus

//-----------------------函数声明,变量定义-------------------------------------------- 
//-----------------------函数声明,变量定义-------------------------------------------------------- 
#include  

#include  
#include  
#define uchar unsigned char  
#define uint  unsigned int   
#define    OFF 1 
#define ON    0 
#define True 1 
#define    False 0 
#define RMM_COMM 0x30    //读主存命令字 
#define WMM_COMM 0x38    //写主存命令字 
#define VER_COMM 0x33    //校验密码 
#define RSM_COMM 0x31    //读密码存储区 
#define WSM_COMM 0x39    //写密码存储区 
#define RPM_COMM 0x34    //读保护存储区 
#define WPM_COMM 0x3c    //写保护存储区 
//---------------------------------------------------------------------------- 
//------------------------------------------------------------------------------------ 
//             定义IC卡接口 
sbit IC_RST =P1^0;         // 将p1.0口设定为复位管脚 
sbit IC_CLK =P1^1;        // 用p1.1口模拟时钟口 
sbit IC_IO =P1^2;            // 将p1.2口模拟数据口 
sbit watch_PW =P1^3;        // 将p1.3口作为电源监控,watch_PW=0,设备有损坏 
sbit CT_PW =P1^4;         // 将p1.4口作为电源控制,CT_PW=0接通电源,CT_PW=1断开电源 
sbit IC_INT0 =P3^2;        // P3.2用于检测有无卡插入,检测到低电平,说明有卡插入 
//------------------------------------------------------------------------------------ 
uchar Read_Buffer[16]; 
bit     IC_In_Flag; 
bit        IC_Read_Flag; 
//------------------------------------------------------------------------------------ 
//4442卡底层程序的外部函数声明 
//------------------------------------------------------------------------------------ 
void ReaDMAinMem(uchar addr,uchar idata *pt,uchar count); //读IC卡主存 
void WriteMainMem(uchar addr,uchar idata *pt);        //写IC卡主存 
void ReadProtectMem(uchar idata *pt);                 //读保护存储器 
void ProtectByte(uchar CardAdd,uchar idata *pt);      //保护一字节,注意待保 
//护的字节是已经写入过的,地址只能在保护存储区内 
void SendComm(uchar a,uchar b,uchar c);                      //发送命令 
void ReadMode(uchar idata *pt,uchar count); 
void ProcessMode(void); 
void ResetCard(void); 
void BreakOperate(void); 
void StartComm(void); 
void StopComm(void); 
uchar ReadByte(void); 
void WriteByte(uchar ch); 
void Delay10us(void); 
void Delay5us(void); 
void init(); 
//-------------------------------------------------------------------------------- 
// 函数名称: ResetCard 
// 函数功能: 卡复位子程序 
//------------------------------------------------------------------------------- 
void ResetCard(void) 

    uchar temp; 
    Delay5us();     
    IC_RST = 0;         
    IC_CLK = 0;      
    IC_IO  = 1;     
    Delay5us();       
    IC_RST = 1; 
    Delay5us(); 
    IC_CLK = 1; 
    Delay10us(); 
    Delay10us(); 
    Delay10us(); 
    Delay10us(); 
    IC_CLK = 0; 
    Delay5us(); 
    IC_RST = 0; 
    Delay10us();        
    temp = ReadByte(); 
    temp = ReadByte(); 
    temp = ReadByte(); 
    temp = ReadByte();   
    IC_CLK = 0;          
    Delay5us();         
    IC_IO  = 1;          
    _nop_();            
    IC_CLK = 0;          
    Delay5us(); 
    } 
//------------------------------------------------------------------------------------- 
// 函数名称: BreakOperate 
// 函数功能: 停止操作 
//----------------------------------------------------------------------------------- 
void BreakOperate(void) 

     IC_CLK = 0; 
     IC_RST = 0; 
     IC_IO  = 0; 
     Delay5us(); 
     IC_RST = 1; 
     IC_IO  = 1; 
     Delay5us(); 
     IC_RST = 0; 
     Delay5us(); 
     CT_PW = 1; 

//------------------------------------------------------------------------------------ 
// 函数名称: StartComm() 
// 函数功能: 启动I2C总线子程序 
//----------------------------------------------------------------------------------- 
void StartComm(void) 

    IC_CLK = 0; 
    IC_IO  = 1; 
    Delay5us(); 
    IC_CLK = 1; 
    Delay5us(); 
    IC_IO  = 0; 
    Delay5us(); 

//------------------------------------------------------------------------------- 
// 函数名称: StopComm() 
// 函数功能: 停止I2C总线数据传送子程序 
//----------------------------------------------------------------------------- 
void StopComm(void) 

    IC_CLK = 0; 
    IC_IO  = 0; 
    Delay5us(); 
    IC_CLK = 1;        //CLK: H 
    Delay5us(); 
    IC_IO  = 1;        //IO : H 
    Delay10us(); 

//----------------------------------------------------------------------------------- 
// 函数名称: ReadByte 
// 返回接收的数据 
// 函数功能: 接收一字节子程序 
//----------------------------------------------------------------------------------- 
uchar ReadByte(void) 

    uchar i,ch; 
    ch = 0; 
    for (i = 8; i > 0; i--) 
    { 
        IC_CLK = 0; 
        ch = ch >> 1;           //从低位读起  
        if((uchar)IC_IO) 
            ch |= 0x80; 
        Delay5us(); 
        IC_CLK = 1; 
        Delay5us(); 
    } 
    return ch; 

//---------------------------------------------------------------------------------- 
// 函数名称: WriteByte 
// 入口参数: ch 
// 函数功能: 发送一个字节 
//------------------------------------------------------------------------------------ 
void WriteByte(uchar ch) 

    uchar i; 
    for(i = 8; i > 0; i--) 
    { 
        IC_CLK = 0; 
        IC_IO = (bit)(ch & 0x01);      
        Delay5us(); 
        IC_CLK = 1; 
        Delay10us(); 
        ch = ch >> 1;                 //右移一位 
    } 

//------------------------------------------------------------------------------------- 
// 函数名称: ReadMode 
// 入口参数: pt地址指针,指向接收缓冲区,count要接收的数据个数 
// 函数功能: 接收n位数据子程序 
//---------------------------------------------------------------------------------- 
void ReadMode(uchar idata *pt,uchar count) 

    IC_CLK=0; 
    Delay5us(); 
    do 
    { 
        *pt = ReadByte();    //读入一个字节 
        pt++;                //指针加一 
    }while(--count);         //计数器减一,判断 

//------------------------------------------------------------------------ 
// 延时10us子程序,根据系统时钟需要调整 
//------------------------------------------------------------------------ 
void Delay10us(void) 

    _nop_(); 
    _nop_(); 
    _nop_(); 
    _nop_(); 
    _nop_(); 
    _nop_(); 

//------------------------------------------------------------------------ 
// 延时5us子程序,根据系统时钟需要调整 
//------------------------------------------------------------------------ 
void Delay5us(void) 

    _nop_(); 
    _nop_(); 
    _nop_(); 

//------------------------------------------------------------------------ 
// 初始化子程序//------------------------------------------------------------------------ 
void init() 

    IC_INT0 = 1; 
    IC_Read_Flag = True; 

//--------------------------------------------------------------------------------- 
// 函数名称: ReadMainMem() 
// 入口参数:  addr: IC存储区地址; 
//            pt: 地址指针,指向接收缓冲区; 
//            count: 接收数据的个数 
// 函数功能: 读存储区 
//----------------------------------------------------------------------------------- 
void ReadMainMem(uchar addr,uchar idata *pt,uchar count) 

    SendComm(RMM_COMM,addr,0xff); 
    ReadMode(pt,count); 
    BreakOperate(); 
    IC_Read_Flag = False; 

//----------------------------------------------------------------------------- 
// 函数名称: SendComm() 
// 入口参数:  a: 命令字; 
//            b: 地址; 
//            c: 数据 
// 函数功能: 发送一个完整的命令 
//------------------------------------------------------------------------------- 
void SendComm(uchar a,uchar b,uchar c) 

    StartComm();          //开始发送命令 
    WriteByte(a);          //a: 发命令字 
    WriteByte(b);          //b: 发地址 
    WriteByte(c);          //c: 发数据 
    StopComm();           //结束发送命令 


main() 

    init(); 
    if((IC_INT0 == 0)&&(IC_Read_Flag == 1) == 1)   //有卡插入,并且有读标记 
    { 
        CT_PW = 0;                                    //上电 
        Delay10us(); 
        if(IC_Read_Flag == True) 
        { 
            ResetCard();                // 
            ReadMainMem(0xEF,&Read_Buffer[0],16); 
            BreakOperate(); 
            Delay10us(); 
            ResetCard(); 
        } 
        Delay10us(); 
        CT_PW = 1; 
    } 


推荐阅读

史海拾趣

成都振芯/国腾(CORPRO)公司的发展小趣事

2010年,CORPRO在深交所创业板成功上市,成为当时国内“卫星导航第一股”。这一里程碑事件不仅提升了CORPRO的品牌知名度和市场影响力,也为公司后续的发展提供了更为广阔的资金来源和市场空间。上市后,CORPRO继续加大研发投入,推动技术创新和产品升级。

Fairview Microwave Inc公司的发展小趣事

Fairview Microwave Inc公司成立于1992年,最初只是一个由几位工程师组成的小团队,他们致力于开发高质量的射频和微波组件。在当时,微波技术正逐渐在通信、雷达和卫星通信等领域得到广泛应用,但市场上缺乏高性能、可靠的组件供应商。Fairview Microwave看到了这个市场空白,决定从适配器、连接器和衰减器等基础组件入手,凭借精湛的技术和不断的创新,逐渐在行业内树立了良好的口碑。

国盛科技(BOCHEN)公司的发展小趣事

国盛科技在发展过程中获得了多项认证与荣誉。例如,公司获得了知识产权管理体系认证证书,荣登《人民代表报》全国两会特刊,成为“中国质量万里行促进会”会员并获得“收录企业”荣誉称号等。这些认证与荣誉的获得,充分证明了国盛科技在电子行业的领先地位和企业实力的不断提升。

DB Unlimited公司的发展小趣事

DB Unlimited公司最初只是一个生产基础音频组件的小型企业。随着技术的不断发展和市场的变化,公司意识到单纯的组件生产已经无法满足客户的需求。于是,DB Unlimited开始转型,致力于提供完整的音频解决方案。通过不断研发和创新,公司成功开发出了一系列高性能的音频产品,并凭借其卓越的品质和性能,赢得了客户的广泛认可。

Auctor Corp公司的发展小趣事

Auctor Corp公司深知品质是企业生存和发展的关键。因此,公司从原材料采购、生产流程控制到产品出厂检验,每一个环节都严格把控品质。同时,公司还建立了完善的品质管理体系,通过持续改进和优化生产流程,确保产品质量的稳定性和可靠性。这种对品质的执着追求,使得Auctor Corp的产品在市场上赢得了良好的口碑。

ENOCEAN公司的发展小趣事

2010年,EnOcean公司成功成为国际标准组织ISO/IEC的成员。这一里程碑事件标志着EnOcean的技术和产品在全球范围内得到了广泛认可。通过参与制定无线传感网络的国际标准,EnOcean进一步巩固了其在行业内的领先地位,为推广其无线无源传输技术奠定了坚实基础。

问答坊 | AI 解惑

面像识别技术简介

面像识别技术包含面像检测、面像跟踪与面像比对等课题。面像检测是指在动态的场景与复杂的背景中,判断是否存在面像并分离出面像。面像跟踪指对被检测到的面像进行动态目标跟踪。面像比对则是对被检测到的面像进行身份确认或在面像库中进行目标搜索 ...…

查看全部问答>

(转贴)网络化监控存储之中心存储

网络化存储之中心存储 在网络视频监控系统中,部署得更多的是中心存储。前端设备采集监控点图像并编码压缩处理成数字监控码流,然后通过网络传送到中心业务平台,由中心业务平台将码流分发给网络录像单元进行集中存储。 在很多大型的视频监控联网应 ...…

查看全部问答>

LPC1114不能下载问题解决

之前放蛮久的板子突然不能下载了 ,原来是驱动损坏,而就算卸载是重新安装他还是会调用原先的驱动,论文忙完了今天在公司的偷偷搞了会 (*^__^*) 嘻嘻……又好了(我们公司不是搞单片机这类的) 我就相信我不会挂硬件的…

查看全部问答>

如何在PB中设置wince系统占用内存大小

wince初始设置系统占用的内存太小,如何将它改大一点,并在硬启动后仍有效?…

查看全部问答>

昂达主板好不好?

我配置的电脑,主板和显卡都是昂达的,不知道昂达好不好?…

查看全部问答>

一些资料

一些430的资料哦…

查看全部问答>

基于eZ430-RF2500的无线隧道监测系统

基于eZ430-RF2500的无线隧道监测系统…

查看全部问答>

stm8lsi时钟起不来啊怎么配置

   CLK_ICKR=0x08; /* Configure clock prescaler */ CLK_CKDIVR = 0x01; /*分频时钟源 */ /* To select external source by automtic switch */ CLK_ICKR |= 0x10; /* 使能转化 */ CLK_SWR = 0xD2; /* 时 ...…

查看全部问答>

各位已经拿到STM32F2芯片的都是从哪里拿到的样片?

                                 各位已经拿到STM32F2芯片的都是从哪里拿到的样片?…

查看全部问答>

msp430f149 的ADC12

同志们用msp430f149  的ADC12测量的电压值准确不? 我设置的是使用内部AVCC   怎么感觉像是2.5V    然后我用外部的输入AVCC电压值才比较准确 (还是有点误差) 谁知道怎么回事吗?…

查看全部问答>