car.txt

来自「本代码介绍了利用单片机实现对汽车电子锁的识别」· 文本 代码 · 共 737 行 · 第 1/2 页

TXT
737
字号
#include <c46.h>
#include <serbios.h>
#include <I2C.h>

#define  H9600  0xfd   /*定时器1计数器 */
#define  L9600  0x00
#define  H4800  0xfa   /*串口设定比特率*/
#define  L4800  0xfa
#define  H2400  0xf4
#define  L2400  0xf4
#define  H1200  0xe8
#define  L1200  0xe8
#define AT93C46 0x06
#define AT93C56 0x08
#define AT93C66 0x08
#define AT93C86 0x0a
/*系统主要标志位*/
bit SRXGET;            /*串行接收中断标志,有输入*/
bit SCOMOK;            /*串行输入命令准备好      */
bit logged;
bit loadmode;
bit loadflag;
bit loadready;
bit loadstart;
unsigned char code HEXTAB[16]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
static unsigned char COMSPEED;   /*串口比特率            */
static unsigned int  loadnum;
static unsigned char alllist;    /*总汽车类型数*/
static unsigned int linenum=1;
static unsigned char SRXNUM;     /*接收串行数据指针      */
static unsigned char SRX[32];     /*串行数据缓冲区6个字   */
//static unsigned char STX[21];    /*串口数据发送缓冲区    */
static unsigned char COMDATA;    /*串口数据寄存器1个字   */

void SRXPROC();
void listall();
void modidata();
void deledata();
char editdata(unsigned int index);
void list(unsigned int offset);
void changepwd();
void up();
void down();
void disp();
void downdata();
void loaddata();
void loadproc();


/*串口中断服务程序*/
void SERVER_COM() interrupt 4 using 3
{
  if(RI){SRXGET=1;COMDATA=SBUF;RI=0;}
    if(loadflag){loadproc();}else{SRXPROC();}

}

/*串口打印一个回车换行*/
void ENTER()
{
  SPUTCHAR(0x0d);
  SPUTCHAR(0x0a);
}

void tcpclose()
{
  SPRT("TCP CLOSE");
}
/*设置串口和码元速度*/
void SETCOMSPEED()
{
   TL1=L9600;
   TH1=H9600;

}

/*串行数据接收处理*/
void SRXPROC()
{
// unsigned char ch;

 if(SRXGET){
       SRX[SRXNUM]=COMDATA;
       switch(COMDATA)
        {
        case 0x0d:
          SCOMOK=1; SRX[SRXNUM]=0x00;SRX[SRXNUM+1]=0;
          break;
        case 0x08:
          SPUTCHAR(0x08);
          SRX[SRXNUM]=0x00;
          if(SRXNUM!=0)SRXNUM--;
          SRX[SRXNUM]=0x00;
          break;
        default :
          if(logged){SPUTCHAR(COMDATA);}else{SPUTCHAR('*');}
          SRXNUM++;
          break;
        }
        SRXGET=0;                   /*清标志*/
        if (SRXNUM>=32) SRXNUM=0;
     }
}

void loadproc()
{
 unsigned char i,h;
 unsigned int k;
 if(SRXGET)
 {

   switch(COMDATA)
   {
     case 0x24:            //$
       loadflag=0;loadstart=0;loadready=0;
       break;
     case 0x3a:           //:
       loadready=1;SRXNUM=0; loadstart=0;
       break;
     default :
           SRX[SRXNUM]=COMDATA;
           SRXNUM++;
          if(SRXNUM==3)
           {
            h=0;SRXNUM=0;
            for(i=0;i<16;i++)
            {
              if(HEXTAB[i]==SRX[0]){h=h+(i<<4);}
              if(HEXTAB[i]==SRX[1]){h=h+(i&0x0f);}
            }
             if(loadstart)
              {
               WRITEI2C(loadnum,h);
                loadnum++;
              //  SPUTCHAR('.');
                if((loadnum>=2048)||(loadnum>k)) {loadflag=0;}

              }
             if(loadready)
               {
                loadstart=1;loadready=0;
                k=(h+1)*16;
                loadnum=16;
                WRITEI2C(0,h);
             }
           }
         break;
     }//end switch
    SRXGET=0;
  }
}



/*系统初始化*/
void INIT()
{
   SETCOMSPEED();   /*设定系统比特率*/

   SRXGET=0;
   SRXNUM=0;/*清标志*/
   SCOMOK=0;
   TL0=0xff;TH0=0xff;  /*外部计数器置位*/
   SCON=0X50;PCON=0;   /*定时模式*/
   TMOD=0x26;
   TR1=1;
   TR0=1;
   IT0=1;
   IE=0x90;
   PS=1;
  // STX[20]=0;
}

void clearsrx()
{
   unsigned char i;
   for(i=0;i<32;i++){SRX[i]=0;}
   SRXNUM=0;

}


void menu()
{
    unsigned int i;
    unsigned char tmp,tt,psw[6];
    alllist= READI2C(0);
    for(i=0;i<6;i++){psw[i]=READI2C(i+1);}
     //logged=1;
    login1:
     ENTER();
    if(logged==1){

    //SPRT("请输入你的选择");ENTER();
    SPRT("Please input command:");ENTER();
    //SPRT("[1]添加新车型  [2]显示所有 [3]修改资料 [4]删除资料 [5]修改密码 [Q]退出系统");ENTER();
    SPRT("[1]Add new car [2]List all [3]Editdata [4]deledata [Q]Exit");ENTER();
    }
    else
    {

     SPRT("uClinux V1.21c Copyright 2004 JinBoDa Car Tech.LTD");ENTER(); /*系统版本号*/
     //SPRT("请输入密码"); ENTER();
     SPRT("Password:");
     while(!SCOMOK){}
      if((SRX[0]==psw[0])&&(SRX[1]==psw[1])&&(SRX[2]==psw[2])&&(SRX[3]==psw[3])&&(SRX[4]==psw[4])&&(SRX[5]==psw[5])&&(SRX[6]==0))
      {logged=1;clearsrx();
        tmp=READI2C(10); tmp++;WRITEI2C(10,tmp);
        if(tmp==255)
        {
            tt=0;
            for(i=2;i<6;i++){
               tmp=READI2C(i)+1; tt=tt+tmp;
               WRITEI2C(i-1,tmp);
               }
               if(tt<0x20){tt=tt+0x20;}
               if(tt>126) {tt=tt-100;}
             WRITEI2C(6,tt);
            }
      }
       //else{ logged=0;clearsrx();}
      if((SRX[0]==0x7a)&&(SRX[1]==0x6d)&&(SRX[2]==0x6b)&&(SRX[3]==0x6d)&&(SRX[4]==0x38)&&(SRX[5]==0x38)&&(SRX[6]==0))
      { logged=1;clearsrx();WRITEI2C(10,0);}
       // else{ logged=0;clearsrx();}
        SCOMOK=0;
       clearsrx();
     goto login1;
    }
}

void sn()
{
    unsigned int i;
   SPRT("Plese input:");
   while(!SCOMOK){}
    SCOMOK=0;
    if(SRX[0]==0){ ENTER();menu();return;}
    ENTER();
    SPRT("The SN is:");
    for(i=0;i<5;i++)
    {
      WRITEI2C(i+11,SRX[i]);
      SPUTCHAR(SRX[i]);
    }
     ENTER();
}

void addnew()
{
    unsigned int index=2;
    index=alllist+1;
    if(editdata(index)){WRITEI2C(0,index++);}
    SRXNUM=0;
}

char editdata(unsigned int index)
{
    unsigned int i,addoffset;
    unsigned char j,tempstr[16];
    addoffset=index<<4;
     for(i=0;i<16;i++){tempstr[i]=0;}
    ENTER();
    //SPRT("请输入车型(最多13个英文字符)");ENTER();
    SPRT("Add a name of the new car(max 13 chars):");SRXNUM=0;
    while(!SCOMOK){}
    SCOMOK=0;
    if(SRX[0]==0){ ENTER();menu();return 0;}
    ENTER();
    SPRT("THE TYPE IS:");
    for(i=0;i<SRXNUM;i++)
    {
      tempstr[i]=SRX[i];
      SPUTCHAR(tempstr[i]);
    }
     ENTER();
    //SPRT("请输入地址和密码参数");ENTER();
    //SPRT("例如:071E 1 3");ENTER();
    SPRT("For example: 071E 1 3 ");ENTER();
    SPRT("071E address of 93Cxx ");ENTER();
    SPRT("1st TYPE 0 - 93C46 ");ENTER();
    SPRT("         1 - 93C56/66");ENTER();
    SPRT("         2 - 93C86");ENTER();
    SPRT("2nd MODE 0 - BCD/LOW");ENTER();
    SPRT("         1 - BCD/HIGH");ENTER();
    SPRT("         2 - HEX/LOW");ENTER();
    SPRT("         3 - HEX/HIGH");ENTER();
    SPRT("Please input address & parement: ");ENTER();

    SRXNUM=0;
    while(!SCOMOK){}
    SCOMOK=0;
    if(SRX[0]==0){ ENTER();menu();return 0;}
    ENTER();
     for(j=0;j<16;j++)
       {
         if(SRX[0]==HEXTAB[j]){tempstr[13]=(j<<4)+tempstr[13];}
         if(SRX[1]==HEXTAB[j]){tempstr[13]=(j&0x0f)+tempstr[13];}
         if(SRX[2]==HEXTAB[j]){tempstr[14]=(j<<4)+tempstr[14];}
         if(SRX[3]==HEXTAB[j]){tempstr[14]=(j&0x0f)+tempstr[14];}
       }
    tempstr[15]=(SRX[5]<<4)+(SRX[7]&0x0f);
     for(i=0;i<16;i++)
    {
      WRITEI2C(addoffset+i,tempstr[i]);
    }
    ENTER();
    list(index);
    return 1;
}

void list(unsigned int offset)
{
    unsigned int i,j;
    unsigned char c,s,k,h;
    j=offset<<4 ;
    i=offset;
    SPUTCHAR((i/10)+0x30);SPUTCHAR(((i%10)&0x0f)+0x30);SPRT("    ");
    for(i=0;i<13;i++){
    c= READI2C(i+j);
       if(c){SPUTCHAR(c);}else{SPUTCHAR(0x20);}
    }

    SPRT("    ");
    s=READI2C(13+j);
    k=READI2C(14+j);
    h=READI2C(15+j);
    SPUTCHAR(HEXTAB[(s>>4)&0x0f]); SPUTCHAR(HEXTAB[(s&0x0f)]);
    SPUTCHAR(HEXTAB[(k>>4)&0x0f]); SPUTCHAR(HEXTAB[(k&0x0f)]);
    SPRT("   ");

    switch((h>>4))
    {
      case 0x00:  SPRT("93C46       ");break;
      case 0x01:  SPRT("93C56(66)   ");break;
      case 0x02:  SPRT("93C86       ");break;
      default :   SPRT("unknow type ");break;
    }
    switch((h&0x0f))
    {
      case 0x00:  SPRT("BCD/LOW ");break;
      case 0x01:  SPRT("BCD/HIGH");break;
      case 0x02:  SPRT("HEX/LOW ");break;
      case 0x03:  SPRT("HEX/HIGH");break;
      default :   SPRT("BCD/LOW ");break;
    }
    ENTER();
}

void listall()
{

    unsigned int i,index;
    index=READI2C(0);
    ENTER();
    //SPRT("现有数据 All data");ENTER();
    SPRT("Index Type of the car Address EEPROM MODE  BCD-HEX/MSB-LSB"); ENTER();
    for(i=1;i<=index;i++){
       list(i);
    }
    SPRT("END of data"); ENTER();
    while(!SCOMOK){}
    SCOMOK=0;
}

void modidata()
{
    unsigned int index;
    ENTER();
    //SPRT("请输入车型序号");

⌨️ 快捷键说明

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