⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 icc2.c

📁 嵌入式点菜系嵌入式点菜系统源码供参考c51c51统源码供参考嵌入式点菜系统源码供参考c51c51c51c51
💻 C
字号:
/*------------------------ 例程1:通用IC卡读写程序 -------------------------*/
/*说明:该例程的功能是对多种IC卡(包括SIM4418/28、SIM4432/42、ATMEL16K卡)进行  读、写以及比较密码的操作*/
#include "HNCC.H"

xdata unsigned char m,n,co;

void ver(xdata char);
char iver(xdata char a,xdata char b);

void main(void)
{
 xdata char ktype;
 xdata char x=1,y=1,a,b,c,d,k,kn,i=0,k1,k2,l;
 xdata char p[4],e[20],sys[3],v[10];
 xdata char o[256];

 /*清屏并显示首屏菜单*/
 cls();
 moveto(2,1);putstr("手持式IC卡读写器\n 读写卡程序V1.0");
 moveto(8,1);putstr("1.SIM4418/4428卡\n2.SIM4432/4442卡\n3.ATMEL    16k卡");
 /*等待按键,直到按下[1]、[2]、[3]其中一键,键值放变量ktype中*/
 do{
   ktype=key(0);
 }while((ktype!='1')&&(ktype!='2')&&(ktype!='3'));
 /*根据ktype的值设置卡类型并显示该类型*/
 do{
   cls();
   moveto(1,1);putstr("卡类型:");
   moveto(3,1);
   switch(ktype){
        case '1':
          putstr("西门子4418/28");
          cardtype(SIM441828);
          break;
        case '2':
          putstr("西门子4432/42");
          cardtype(SIM443242);
          break;
        case '3':
          putstr("ATMEL 16K");
          cardtype(ATMEL16K);
          break;
   }
   moveto(6,1);
   putstr("请选择:\n[1].读卡\n[2].写卡\n[3].比较密码\n[Enter].退出");
   k=key(0);
   /*按[1]键进行读卡操作*/
   if(k=='1')
   {
        cls();
        moveto(1,1);putstr("请输入页号:");
        moveto(7,1);
        if(ktype=='1')
          putstr("4418/28卡(0--3)");
        else if(ktype=='2')
          putstr("4432/42卡(0)");
        else if(ktype=='3')
          putstr("atm 16k卡(0--7)");
        do{
          moveto(2,13);
          k=key(1);
        }while((k<'0')||(k>'7'));

        cls();
        moveto(3,5);putstr("请插卡!");
        while(cardtest()); /*等待直到卡插入卡头*/
        delay(5);
        poweron();
        cls();
        moveto(3,3);putstr("正在读卡...");
        l=k-0x30;
        cardread(l,0,256,o); /*从卡上l页地址00H开始读256个字节数据到串o中*/
        
        /*将读到串o中的256字节数据显示出来,并处理翻屏*/
        i=0;
        do{
                cls();
                for(b=0;b<16;b++)
                {
                  ver(i);
                  moveto(x,y);
                  putch(m);putch(n);putch('H');
                  y+=4;
                  for(a=0;a<4;a++)
                  {
                    moveto(x,y);
                    ver(o[i]);
                    putch(' ');putch(m);putch(n);
                    i++;
                    y+=3;
                  }
                  x++;y=1;
                }
                do{
                  k=key(0);
                }while((k!=0x8e)&&(k!=0x8f)&&(k!=0x8d));
                if(k==0x8e)
                  i-=0x80;
                x=1;y=1;
        }while(k!=0x8d);
   }
   /*按下[2]键进行写卡操作*/
   else if(k=='2')
   {
        if(cardtest()) co=0;
        /*只有密码比较正确或卡型为ATEML16K卡才能写卡*/
        if((co=='k')||(ktype=='3'))
        {
                cls();
                moveto(1,1);putstr("请输入:");
                moveto(4,1);putstr("页号(0---7):");
                moveto(7,1);putstr("地址(00-FF):");
                do{
                  moveto(5,14);putch('_');
                  moveto(5,14);
                  k=key(1);
                }while((k<'0')||(k>'7'));
                do{
                  moveto(8,14);putch('_');
                  moveto(8,14);
                  k1=key(1);
                }while((k1<'0')||(k1>'Z'));
                do{
                  moveto(8,15);putch('_');
                  moveto(8,15);
                  k2=key(1);
                }while((k2<'0')||(k2>'Z'));

                cls();
                l=iver(k1,k2);
                cardread(k-0x30,l,10,e);
                i=iver(k1,k2);
                for(a=0;a<10;a++)
                {     
                  moveto(a+1,2);
                  ver(i+a);
                  putch(m);putch(n);putch('H');putch(' ');
                  ver(e[a]);
                  putch(m);putch(n);putch(' ');
                }
                for(a=0;a<10;a++)
                {
                  do{
                    moveto(a+1,10);putch('_');moveto(a+1,10);
                    k1=key(1);
                    if(k1==0x8d) break;
                  }while((k1<'0')||(k1>'Z'));
                  if(k1==0x8d) break;
                  do{
                    moveto(a+1,11);putch('_');moveto(a+1,11);
                    k2=key(1);
                  }while((k2<'0')||(k2>'Z'));
                  e[a]=iver(k1,k2);
                }

                cardwrit(k-0x30,i,10,e);
                cls();
                moveto(3,3);
                putstr("完成写卡操作!");
        }
        else
        {
          cls();
          moveto(6,4);putstr("未比较密码!");
          bell(10);
        }
        key(0);
   }
   /*按下[3]键时进行密码比较操作*/
   else if(k=='3')
   {
        cls();
        moveto(3,5);putstr("请插卡!");
        while(cardtest());
        poweron();
        cls();
        moveto(1,1);putstr("请输入密码:");
        moveto(4,7);keys(v);
        if(ktype=='1')
          c=cardcomp(4,v);
        else if(ktype=='2')
          c=cardcomp(6,v);
        else
          goto compend;
        cls();
        moveto(3,5);
        if(!c)
        {
          putstr("密码正确!");
          co='k';
        }
        else
        {
          putstr("密码错误!");
          co=0;
          bell(10);
        }
      compend:
        key(0);
   }
   else if(k==0x8d)
        break;
 }while(1);
 poweroff();
}

/*将一个8位十六进制数转换为两个ASCII码,放入m,n.如:(0x12)-->(0x31,0x32)*/
void ver(xdata char a)
{
 char i;
 i=a;
 a>>=4;
 a&=0x0f;
 if(a>9) a+=0x7;
 a+=0x30;
 m=a;
 i&=0x0f;
 if(i>9) i+=0x7;
 i+=0x30;
 n=i;
}

/*将两个ASCII码转换为一个8位十六进制数.如:(0x41,0x42)-->(0xAB)*/
char iver(xdata char a,xdata char b)
{
 if(a>'9') a-=0x7;
 a-=0x30;
 a<<=4;
 if(b>'9') b-=0x7;
 b-=0x30;
 return(a+b);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -