/**********读主存储器**************/

void ReadMainMemory(uchar addr,uchar *p,uchar N)

{Command(0x30,addr,0xff);

do{*p=ReceiveData();

p++;}while(--N);

}

/**********读保护存储器***********/

void ReadProtectMemory(uchar *p)

{uchar i=4;

Command(0x34,0xff,0xff);

do{*p=ReceiveData();

p++;}while(i--);

}

/************写主存储器************/

void WriteMainMemory(uchar Address,uchar Data)

{Command(0x38,Address,Data);

Process();

}

/**************写保护存储器**********/

void WriteProtectMemory(uchar Address,uchar Data)

{Command(0x3c,Address,Data);

Process();

}

/**************读安全存储器************/

void ReadSafeMemory(uchar *p)

{uchar i;

Command(0x31,0xff,0xff);

for(i=0;i<4;i++)

{*p=ReceiveData();

p++;}

}

/*************写安全存储器***************/

void WriteSafeMemory(uchar Address,uchar Data)

{Command(0x39,Address,Data);//Address=0,1,2,3

Process();

}

/**************校验密码*******************/

uchar VerifyPassword(uchar *p)

{uchar temp[4];//暂存4字节保护密码;

uchar i;

ReadSafeMemory(temp);//读安全代码以取得错误计数器

if((temp[0]&0x07)!=0)

{if((temp[0]&0x07)==0x07)  i=0x06;

if((temp[0]&0x07)==0x06)  i=0x04;

if((temp[0]&0x07)==0x04)  i=0x00;

WriteSafeMemory(0,i);

for(i=1;i<4;i++,p++)

{Command(0x33,i,*p);

Process();}

WriteSafeMemory(0,0xff);

ReadSafeMemory(temp);

if((temp[0]&0x07)==0x07) return(0x1);

}

return(0);

}

//*************SLE4442函数结束*****************//

//*************数据变换**********//

void Change(uchar *Source,uchar *Destination,uchar N)

{uchar i,temp;

for(i=0;i

{temp=Source[i];

Destination[i]=temp>>4;

Destination[2*i+1]=temp&0x0f;}

}

//***********密码错误报警***********************//

void Buzzle_Password(void)

{uchar i;

for(i=0;i<2;i++)

{Voice(0);

DelayMs(1000);

Voice(1);

DelayMs(1000);}

}

//**********非法卡错误报警*************************//

void Buzzle_Card(void)

{uchar i;

for(i=0;i<2;i++)

{Voice(0);

DelayMs(3000);}

}

//*************余额不足报警**********************//

void Buzzle_Money(void)

{uchar i;

for(i=0;i<1;i++)

{Buzzle_Password();

Buzzle_Card();}

}

//*********************读卡函数********************//

//说明:

//函数使用的数组参数用来存放读出的余额值;

//返回值信息:

//0:卡坏!

//1:非法卡(特征值不正确)

//2:非法卡(特征值正确,帐号不正确)

//3:读卡成功!

uchar Read_Card(uchar *p)

{uchar i,tag=0,temp[4];

ReadSafeMemory(temp);

if(temp[0]==0x07)

{ReadMainMemory(32,p,14);//读主存储器14字节:32-35特征码;36-3A帐号;3B-3F余额

if(p[0]==0x00&&p[1]==0x0f&&p[2]==0xf0&&p[3]==0xff)//特征码:0x00,0x0f,0xf0,0xff

{for(i=0;i<10;i++)

if((p[i+4]>=0&&p[i+4]<=9)) tag=tag+1;

if(tag!=10) return(2);

else return(3);

}

else

return(1);

}

else return(0);

}

//*********************卡初始化函数********************//

//说明:

//函数使用的数组参数用来存放写入的的ID值;

//返回值信息:

//2:初始化失败!

//3:初始化成功!

uchar Initial_Card(uchar *p)

{uchar Psw[3]={0xff,0xff,0xff};

uchar i,j,temp=0;

uchar tp[20];

// ResetIC(ICcode);//IC卡复位,读出复位后的厂家信息代码A2131091;

j=VerifyPassword(Psw);

WriteMainMemory(32,0x00);//写特征码:

WriteMainMemory(33,0x0f);

WriteMainMemory(34,0xf0);

WriteMainMemory(35,0xff);

for(i=0;i<5;i++)//写帐号

WriteMainMemory(36+i,p[i]);//从32+i地址开始写5字节帐号;

for(i=0;i<5;i++)

WriteMainMemory(41+i,0);//从32+i地址开始写5字节初始化金额0000.0

j=Read_Card(tp);

if(j==3)

{for(i=0;i<10;i++)

if(p[i]==tp[i+4]) temp=temp+1;

}

if(temp==10)  return(3);

else return(2);

}

//***************卡修复函数********************//

//说明:

//返回值信息:

//0:修复失败!

//1:修复成功!

uchar Repair_Card(void)

{uchar Psw[3]={0xff,0xff,0xff};

uchar i,j,temp;

i=VerifyPassword(Psw);

return(i);

}

//********************加卡函数***********//

void Add_Card(uchar *p)

{uchar i;

uchar temp[14];

i=Read_Card(temp);

if(i==3)

{temp[13]=temp[13]+p[4];

if(temp[13]>9) {temp[13]=temp[13]-10;temp[12]=temp[12]+1;}

temp[12]=temp[12]+p[3];

if(temp[12]>9) {temp[12]=temp[12]-10;temp[11]=temp[11]+1;}

temp[11]=temp[11]+p[2];

if(temp[11]>9) {temp[11]=temp[11]-10;temp[10]=temp[10]+1;}

temp[10]=temp[10]+p[1];

if(temp[10]>9) {temp[10]=temp[10]-10;temp[9]=temp[9]+1;}

WriteMainMemory(41,temp[9]);

WriteMainMemory(42,temp[10]);

WriteMainMemory(43,temp[11]);

WriteMainMemory(44,temp[12]);

WriteMainMemory(45,temp[13]);

}

}

//********************减卡函数***********//

void Sub_Card(uchar *p)

{uchar i,B_Flag;

uchar temp[14];

i=Read_Card(temp);

if((i==3)&&(!(temp[9]

{if(temp[13]

else temp[13]=temp[13]-p[4];

//以上处理小数点右边的数字;

if(B_Flag==1)

{if(temp[12]==0) {temp[12]=9;B_Flag=0;}

else temp[12]=temp[12]-1;}

//以上对存在借位情况时对小数点左边第一位进行预处理;

if(temp[12]

else temp[12]=temp[12]-p[3];

//以上处理小数点小数点左边第一位数字;

if(B_Flag==1)

{if(temp[11]==0) {temp[11]=9;B_Flag=0;}

else temp[11]=temp[11]-1;}

//以上对存在借位情况时对小数点左边第二位进行预处理;

if(temp[11]

else temp[11]=temp[11]-p[2];

//以上处理小数点小数点左边第二位数字;

if(B_Flag==1)

{if(temp[10]==0) {temp[10]=9;B_Flag=0;}

else temp[10]=temp[10]-1;}

//以上对存在借位情况时对小数点左边第三位进行预处理;

if(temp[10]

else temp[10]=temp[10]-p[1];

//以上处理小数点小数点左边第三位数字;

if(B_Flag==1)

{if(temp[9]==0) {temp[9]=0;B_Flag=0;}

else temp[9]=temp[9]-1;}

//以上对存在借位情况时对小数点左边第二位进行预处理;

temp[9]=temp[9]-p[0];

//以上处理小数点小数点左边第二位数字;

WriteMainMemory(41,temp[9]);

WriteMainMemory(42,temp[10]);

WriteMainMemory(43,temp[11]);

WriteMainMemory(44,temp[12]);

WriteMainMemory(45,temp[13]);

}

}

//*****************数码管显示函数********************//

void Display(uchar *p)

{uchar sel,i;

sel=0x01;

for(i=0;i<6;i++)

{PORTA=table[p[i]];

PORTB=sel;

DelayMs(2);

sel=sel<<1;}

}

//****************键盘扫描函数***********************//

uchar Key_Scan(void)

{uchar sccode,recode;

PORTC=0xf0;

if((PINC&0xf0)!=0xf0)

{DelayMs(10);

if((PINC&0xf0)!=0xf0)

{sccode=0xfe;

while(sccode&0x10!=0x00)

{PORTC=sccode; //对第一行键盘测试

if((PINC&0xf0)!=0xf0)

{recode=(PINC&0xf0)|0x0f;

return((~sccode)+(~recode));}

else

sccode=(sccode<<1)|0x01;

}

}

}

return(0x00);

}

//******************按键处理函数*******************//

void Key_Process(uchar *p)

{uchar temp,value;

temp=Key_Scan();

switch(temp)

{case 0x11:value=9;Num_Flag=1;break;

case 0x21:value=8;Num_Flag=1;break;

case 0x41:value=7;Num_Flag=1;break;

case 0x12:value=6;Num_Flag=1;break;

case 0x22:value=5;Num_Flag=1;break;

case 0x42:value=4;Num_Flag=1;break;

case 0x14:value=3;Num_Flag=1;break;

case 0x24:value=2;Num_Flag=1;break;

case 0x44:value=1;Num_Flag=1;break;

case 0x18:value=0;Num_Flag=1;break;

case 0x28:Point_Flag=1;break;

case 0x82:Add_Flag=1;Sub_Flag=0;Key_Flag=1;break;

case 0x84:Sub_Flag=1;Add_Flag=0;Key_Flag=1;break;

case 0x48:Repair_Flag=1;Key_Flag=1;break;

case 0x81:Init_Flag=1;Key_Flag=1;break;

case 0x88:Enter_Flag=1;Key_Flag=0;break;

default:     NOP();

}

if(Num_Flag==1){p[4]=p[3];p[3]=p[2];p[2]=p[1];p[1]=value;Num_Flag=0;}

if(Point_Flag==1){p[0]=value;Point_Flag=0;}

if(Add_Flag==1) {Add_Flag=1;Sub_Flag=0;}

if(Sub_Flag==1) {Sub_Flag=1;Add_Flag=0;}

if(Init_Flag==1) {Init_Flag=1;}

if(Repair_Flag==1) {Repair_Card();Repair_Flag=0;}

if(Enter_Flag==1)

{if(Add_Flag==1) {Add_Card(p);Enter_Flag=0;Add_Flag=0;}

if(Sub_Flag==1) {Sub_Card(p);Enter_Flag=0;Sub_Flag=0;}

if(Init_Flag==1) {Initial_Card(p);Init_Flag=0;}}

}

//***************中断处理********************//

//**********定时器2:16ms中断显示一次*******//

#pragma interrupt_handler TIMER1_INT:9

void TIMER1_INT(void)

{uchar temp[5],i;

for(i=0;i<5;i++)

temp[i]=ICcontent[9+i];

if(IC_Flag==0) Display(EEEEE);

if(IC_Flag==1) Display(FFFFF);

if(IC_Flag==3)

{if(Key_Flag==1)//显示此次操作金额;

{Money[1]|=0x80;//显示时加上小数点;

Display(Money);}

else          //显示卡内余额;

{temp[4]|=0x80;

Display(temp);}

}

}

//*************系统初始化*************//

void Initial_System(void)

{//系统初始化

//SPL=0x5f;//AT90S8535的堆栈指针指向最高RAM地址;

//SPH=0x02;

//IO口初始化;

DDRA=0xff; //A口输出高电平

PORTA=0xff;

DDRB=0xff; //B口输出低电平

PORTB=0x00;

DDRC=0x0f; //C口高四位输入(不带上拉电阻)低四位输出0

PORTC=0xf0;

DDRD=0xff; //D口输出低电平

PORTD=0x00;

//中断系统初始化(定时器1中断)

SREG=SREG|0x80; //I(SREG^7)全局中断使能置位

TIMSK=TIMSK|0x40;//TOIE1(TIMSK^2)T/C1溢出中断使能置位

TIFR=TIFR|0x40;//TOV1(TIFR^2)T/C1溢出中断标志位写"1"清0

//定时器初始化

TCCR1B=TCCR1B|0x20;//定时器时钟分频=CLK/8 (1uS计数)

TCNT1H=0xc1;//需要计数16000=0x3E80次,

TCNT1L=0x7f;//计数初值0xff-0x3e80=0xc17f;

//显示系统初始化

IC_Flag=0;//如果IC卡没有上电,则显示的是8.8.8.8.,否则显示IC卡的内容

}

void main(void)

{uchar i,j;

Initial_System();

while(IC_Flag==1)

{DelayMs(5);

ResetIC(ICcode);

i=Read_Card(ICcontent);

if(i==0) {IC_Flag=0; Buzzle_Password();}    //显示EEEE,提示卡坏

if((i==1)|(i==2)) {IC_Flag=1;Buzzle_Card();} //显示FFFF,提示非法卡

if(i==3)

{if(ICcontent[12]<5)

{IC_Flag=3;Buzzle_Money();}

else

{do Key_Process(Money);

while(Enter_Flag!=0);

Enter_Flag=0;}

}

}

}

ic卡c语言程序,sle4442程序(ic卡程序,C语 - 控制/MCU - 电子发烧友网相关推荐

  1. 单片机 c语言 d,单片机89C51与A/D转换器MAX - 控制/MCU - 电子发烧友网

    单片机89C51与A/D转换器MAX195的接口设计 MAX195是16位逐次逼近方式的ADC.它将高精度.高速度.低电源功耗(消耗电流仅10μA)的关闭方式等性能结合在一起.内部校准电路对线性度与偏 ...

  2. 单片机c语言报错_asm啥意思,SPMC75系列单片机地C和ASM( - 控制/MCU - 电子发烧友网...

    SPMC75系列单片机地C和ASM(汇编)混合编程的应用 本文主要介绍凌阳16位变频控制单片机SPMC75系列单片机地C和ASM(汇编)混合编程的应用. 关键词:SPMC75 嵌入式汇编 1 引言 支 ...

  3. 单片C语言程序设计,用C语言编程操作SPMC75系列单片 - 控制/MCU - 电子发烧友网

    用C语言编程操作SPMC75系列单片机内部Flash的方法 SPMC75系列单片机的内部程序存储器采用Flash,其中有一部分Flash在程序自由运行模式下可以由程序擦除.写入,本文主要介绍采用C语言 ...

  4. 单片机c语言字符,单片机C语言(一) - 控制/MCU - 电子发烧友网

    第三课.C51数据类型 每写一个程序,总离不开数据的应用,在学习 c51 语言的过程中掌握理解数据类型也是 很关键的.先看表 3-1,表中列出了 KEIL uVision2 单片机c语言编译器所支持的 ...

  5. 单片机 fir数字滤波c语言,单片机实时处理的简单FIR滤波器设计 - 控制/MCU - 电子发烧友网...

    近年来,心脏病的发病率不断上升,为了使病人能够随时随地得到诊治,科研人员研制了多种便携式移动心电监护设备.在研制便携式心电监护设备时,既要考虑使 用者携带及使用方便,又要保证采集到高质量的心电信号.解 ...

  6. can总线linux程序,CAN通信卡的Linux设备驱动程序 - 嵌入式操作系统 - 电子发烧友网...

    CAN通信卡的Linux设备驱动程序设计实现 目前,许多工业现场如电力系统.化工系统等大量使用控制器局部网(CAN--Controller Area Network)现场总线网络,CAN通信卡作为计算 ...

  7. spi通信c语言发送32字节数据,AVR单片机SPI通讯实例程序 (C - ARM - 电子发烧友网

    AVR单片机SPI通讯实例程序 (C语言源代码) 一个SPI的实例,通过SPI实现两机通讯, 采用中断方式实现双全工通讯. 本例用两MEGA8515实现,连接为: MISO----MISO MOSI- ...

  8. 语音编码 c语言,语音编解码算法G.723.1在DSP - 嵌入式新闻 - 电子发烧友网

    1 引言 G.723.1是删组织于1996年推出的一种低码率的语音编码算法标准,也是目前该组织颁布的语音压缩标准中码率最低的一种标准.G.723.1主要用于对语音及其它多媒体声音信号的压缩,目前在一些 ...

  9. c语言产生一m序列,其特征多相式:1+x^3+x^5,M序列伪随机码在测距回答概率控制中的 - FPGA/ASIC技术 - 电子发烧友网...

    M序列伪随机码在测距回答概率控制中的应用 测距器(Distance Measuring Equipment)系统分为机载询问器和地面应答器两部分.其测距原理为二次雷达测距原理.系统工作时,由机载询问器 ...

  10. cd4013编程c语言,cd4013中文资料汇总(引脚图及功能_工作原理及方式_功能结构_参 - 电气技术 - 电子发烧友网...

    CD4013是CMOS双D触发器,内部集成了两个性能相同,引脚独立(电源共用)的D触发器,采用14引脚双列直插塑料封装,是目前设计开发电子电路的一种常用器件,它的使用相当灵活方便且易掌握,受到许多电子 ...

最新文章

  1. maven打jar包,导入本地jar
  2. F7-Vue1.0与2.0不兼容列表
  3. Java多线程编程模式实战指南(三):Two-phase Termination模式--转载
  4. 欢乐纪中某B组赛【2019.1.20】
  5. 分成互质组 (信息学奥赛一本通-T1221)
  6. 公平锁非公平锁和可重入锁(递归锁)
  7. MaterialDesign之NavigationView和DrawerLayout实现侧滑菜单栏
  8. ConcurrentHashMap 和 Collections.synchronizedMap(map) 比较
  9. 如何将zipoutputstream返回_嫦娥五号返回器要“跳”一下再回地球!这一“跳”大有讲究...
  10. 2022年考研计算机组成原理_5 中央处理器
  11. 指纹和人脸识别 AI 总结
  12. Silverlight4_Tools安装异常
  13. 年仅 28 岁就宣布从字节跳动退休?
  14. labelimg标注yolo格式Bug
  15. In me the tiger sniffs the rose.
  16. 一根网线搞定树莓派可视化界面
  17. kindEditor 富文本编辑器 使用介绍
  18. “字节跳动-文远知行杯”广东工业大学第十四届程序设计竞赛 1,2,3,4,5,7,8,9,10
  19. HBase Master is initializing的错误可能
  20. CodeGear给卖了

热门文章

  1. PandoraBox潘多拉无线桥接(中继)使用方法和无法使用解决----小米mini小米3路由
  2. 格雷码和二进制码的互相转换
  3. 林子雨_大数据技术原理与应用课后习题
  4. 山东大学软件学院项目实训-创新实训-山大软院网络攻防靶场实验平台(一)
  5. 医院管理系统服务器,医院管理的十大运行系统!
  6. C++银行管理系统源代码
  7. 【数据分析自学】二、Excel基础知识
  8. 图像去噪序列——BM3D图像去噪模型实现
  9. 英文词根词典简化笔记
  10. Euraka使用入门