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

📄 0706.c

📁 一个用单片机控制TC35I发短信的例子
💻 C
📖 第 1 页 / 共 2 页
字号:
  SelectRam();
  for(xp_ram=0;xp_ram<0x7fff;xp_ram++)
  {
    cp_str=pc_str;
    xp_ram1=xp_ram;
    while(*cp_str)
    {
     if(*xp_ram1!=*cp_str)
     {
         same=0;
         break;
     }
     else
     {
        same=1;
        cp_str++;
        xp_ram1++;
        _nop_();
     }
    }
     if(same)
            break;

   }
  return(xp_ram);
}

uchar GetMsgLength(uchar xdata *xp_msg)       //取出短信中的文字长度
{
  uchar data i;
  uchar data j;
  xp_msg+=ADDR_SMS_LENGTH;
  i=*xp_msg++;
  j=*xp_msg++;
  if((i>='A')&&(i<='F'))
  {
     i=i-0x37;
  }
  else
  if((i>='0')&&(i<='9'))
  {
     i=i-0x30;
  }
  if((j>='A')&&(j<='F'))
  {
     j=j-0x37;
  }
  else
  if((j>='0')&&(j<='9'))
  {
     j=j-0x30;
  }
  i=(i<<4)|j;
  return(i);
}

uchar InvertMsg(uchar xdata *xp_msg,uchar length)      // 将16进制显示方式的数据转换为真正16进制
{
  uchar data i;
  uchar data k;
  uint data j;
  uchar xdata *xp_source;
  uchar xdata *xp_target;
  xp_source=xp_msg+ADDR_SMS_UD;
  xp_target=xp_source;
  for(j=0;j<length;j++)
  {
     i=*xp_source++;
     if((i>='A')&&(i<='F'))
     {
         i=i-0x37;
     }
     else
     if((i>='0')&&(i<='9'))
     {
            i=i-0x30;
     }
     k=i;
     i=*xp_source++;
     if((i>='A')&&(i<='F'))
     {
         i=i-0x37;
     }
     else
     if((i>='0')&&(i<='9'))
     {
            i=i-0x30;
     }
     k=k<<4;
     k=k|i;
     *xp_target++=k;
  }
  *xp_target++=0xff;
  *xp_target++=0xff;
  *xp_target++=0xff;
  *xp_target++=0xff;
}

uchar IsSmsBuffer(uchar xdata *xp_smsbuffer)
{
  uchar  xdata *xp_ram;
  uchar  code   *cp_str;
  uchar  xdata  *xp_ram1;
  uchar  code  pc_str[]="\r\n+CMGR:";
  uchar  code  end_str[]="\r\n";
  bit    same;
  for(xp_ram=xp_smsbuffer;xp_ram<0x7fff;xp_ram++)
  {
    cp_str=pc_str;
    xp_ram1=xp_ram;
    while(*cp_str)
    {
     if(*xp_ram1!=*cp_str)
     {
         same=0;
         break;
     }
     else
     {
        same=1;
        cp_str++;
        xp_ram1++;
        _nop_();
     }
    }
     if(same)
     {

            break;
     }
   }
   if(same)
   {
       while(1)
       {
          if((*xp_ram1=='\r')&&(*(xp_ram1+1)=='\n'))
          {
                     xp_ram1++;
                     xp_ram1++;
                     break;
          }
          else
          {
             if(xp_ram1<xp_ram+0x12)
             {
                xp_ram1++;
             }
             else
             {
                xp_ram1=0;
                break;
             }
          }

       }

   }
   else
   {
      xp_ram1=0;
   }
   
  return(xp_ram1);
}

void ProcessBuffer()
{
   uchar xdata *xp_ram;
   uint xdata  *xp_unicode;
   uint xdata  *xp_hzk;
   uchar  bak;
   uint hzk;
   uchar i;
   uchar k;
   uint j;
   uint   unicode;
   P1&=0XF8;
   SelectRam();
   k=IsSmsBuffer(0);
   i=GetMsgLength(k);
  // gsmsms.UD_LENGTH=i;
   InvertMsg(k,i);
   xp_unicode=ADDR_SMS_UD;
   xp_hzk=0x200;
   i=i/2;
   for(j=0; j<i;j++)
   {
      unicode=*xp_unicode;
      bak=P1;
      SelectRom();
      hzk=HZK_UNICODE(unicode,1);
      P1=bak;
      *xp_hzk=hzk;
      xp_unicode++;
      xp_hzk++;

   }
   SaveWord(0x200,0);
   CreateFnt16();
   _nop_();

}


void main()
{
   //   SaveWord(0x00);
   //   ReadSy();
      init();
    //  Init_RTC();


    //  ResetTime();
   //   CreateFnt16();

      EN=1;         // LED显示板上OE
      Select374();
      SCAN_REG=CTRL_R;

      xp_rbuffer=RBUF_START;

  //    AT_Command("AT+CPMS=MT");
 //     xp_rbuffer=RBUF_START;
      EA=1;
      AT_Command("AT+CMGR=9");
      while(1)
     {

          if(serial_flag)
          {
            if(timeout>10000)
            {
                serial_flag=0;
                SelectRam();
                A16=0;
               *xp_rbuffer++=0x55;
               *xp_rbuffer++=0xaa;
               *xp_rbuffer++=0x55;
               *xp_rbuffer++=0xaa;
               xp_rbuffer=RBUF_START;
               receiveflag=1;
            }
            else
            {
                timeout++;
            }
          }

            if(receiveflag)
            {
               EA=0;
               EN=0;
               Select374();
               SCAN_REG=CTRL_R;
               ProcessBuffer();
               receiveflag=0;
               EN=1;
               Select374();
               SCAN_REG=CTRL_R;
               EA=1;
            }

            _nop_();

     }

}
void  intex0() interrupt 0
{
  uchar  i;
  uchar bak;
  CLK_EN=1;
  bak=P1;

  SelectRTC();
  i=SECOND;
  timemem[15]=i&0X0F;
  timemem[14]=(i&0xf0)>>4;
  i=MINUTE;
  timemem[13]=i&0X0F;
  timemem[12]=(i&0xf0)>>4;
  i=HOUR;
  timemem[11]=i&0X0F;
  timemem[10]=(i&0xf0)>>4;
  i=WEEK;
  timemem[9]=i&0X0F;
  timemem[8]=(i&0xf0)>>4;
  i=DATE;
  timemem[7]=i&0X0F;
  timemem[6]=(i&0xf0)>>4;
  i=MONTH;
  timemem[5]=i&0X0F;
  timemem[4]=(i&0xf0)>>4;
  i=YEAR;
  timemem[3]=i&0X0F;
  timemem[2]=(i&0xf0)>>4;
  i=CENTURY;
  timemem[1]=i&0X0F;
  timemem[0]=(i&0xf0)>>4;


  _nop_();
  i=REG_C;

  P1=bak;
  CLK_EN=0;
}


void serial()  interrupt 4
{
  uchar i;
  serial_flag=1;
  bak=P1;
  i=SBUF;
  RI=0;
  SelectRam();
  A16=0;
  timeout=0;
  *xp_rbuffer++=i;
  P1=bak;
 _nop_();

}


void  intt0()  interrupt  1
   {
     uchar xdata *px1;
    ulint  row1;
    volatile uchar temp;
    uchar  i;
    uchar page;

    uchar  dot;
    union
         {
          uchar  byte[4];
          unsigned long int  dword;
          uint  word[2];
         }  word;
    row1=reg_row;
    word.dword=row1*0x1000;

    A16=1;
    SelectRam();
    CLK_EN=0;
    if(step==1)
    {
         px1=word.word[1]+312;
         for(dot=0;dot<8;dot++)
         {
              temp=*px1++;
         }
       for(i=0;i<4;i++)
      {
         px1=(word.word[1])+timemem[i]*8;
         for(dot=0;dot<8;dot++)
         {
              temp=*px1++;
         }
      }
         px1=word.word[1]+208;           // year
         for(dot=0;dot<16;dot++)
         {
              temp=*px1++;
         }

      for(i=4;i<6;i++)
      {
         px1=(word.word[1])+timemem[i]*8;
         for(dot=0;dot<8;dot++)
         {
              temp=*px1++;
         }
      }
         px1=word.word[1]+192;           // month
         for(dot=0;dot<16;dot++)
         {
              temp=*px1++;
         }

      for(i=6;i<8;i++)
      {
         px1=(word.word[1])+timemem[i]*8;
         for(dot=0;dot<8;dot++)
         {
              temp=*px1++;
         }
      }
         px1=word.word[1]+176;           // date
         for(dot=0;dot<16;dot++)
         {
              temp=*px1++;
         }
         px1=word.word[1]+312;
         for(dot=0;dot<8;dot++)
         {
              temp=*px1++;
         }
         if(delaycount++>10000)
         {
            step=2;
            delaycount=0;
         }

    }
    else
    if(step==2)
    {


         px1=word.word[1]+272;     // 星
         for(dot=0;dot<16;dot++)
         {
              temp=*px1++;
         }
         px1=word.word[1]+288;     // 期
         for(dot=0;dot<16;dot++)
         {
              temp=*px1++;
         }

         px1=word.word[1]+80+timemem[9]*16;
         for(dot=0;dot<16;dot++)
         {
              temp=*px1++;
         }
         px1=word.word[1]+312;      //space
         for(dot=0;dot<8;dot++)
         {
              temp=*px1++;
         }
         px1=word.word[1]+312;      //space
         for(dot=0;dot<8;dot++)
         {
              temp=*px1++;
         }
       for(i=10;i<12;i++)               //hour
      {
         px1=(word.word[1])+timemem[i]*8;
         for(dot=0;dot<8;dot++)
         {
              temp=*px1++;
         }
      }
         px1=word.word[1]+304;      //:
         for(dot=0;dot<8;dot++)
         {
              temp=*px1++;
         }
       for(i=12;i<14;i++)               //minute
      {
         px1=(word.word[1])+timemem[i]*8;
         for(dot=0;dot<8;dot++)
         {
              temp=*px1++;
         }
      }
         px1=word.word[1]+304;      //:
         for(dot=0;dot<8;dot++)
         {
              temp=*px1++;
         }
       for(i=14;i<16;i++)               //minute
      {
         px1=(word.word[1])+timemem[i]*8;
         for(dot=0;dot<8;dot++)
         {
              temp=*px1++;
         }
      }
         if(delaycount++>10000)
         {
            step=0;
            delaycount=0;
            pt_col=START_PT;
         }


    }
    else
    if(step==3)
    {

       px1=(word.word[1])+320;
       for(dot=0;dot<128;dot++)
       {
                       temp=*px1++;
       }
    }
    else
    if(step==0)
    {

       px1=(word.word[1])+pt_col;
       for(dot=0;dot<160;dot++)
       {
                       temp=*px1++;
       }
    }

    CLK_EN=1;
    Select374();
    STB=0;    // 595 锁存
    SCAN_REG=CTRL_R;
    STB=1;
    SCAN_REG=CTRL_R;
    i=CTRL_R&0Xf0;
    CTRL_R=i|reg_row;    // 行扫描 输出
    SCAN_REG=CTRL_R;
    reg_row++;       // 下一行
    if(reg_row&0x10)
    {
               reg_row=0;     // 扫完16行回到第1行
               if(pt_col<4096-448)
               {
                       pt_col++;
               }
               else
               {
                      pt_col=START_PT;
                      step=1;
                      delaycount=0;

               }
    }
    CLK_EN=1;
    SelectInport();
    i=ReadInport;
     if(i!=0xff)                      // 当按键按下时
     {
         h_delay_count=0;            // 高电平时间计数器清0
         if(l_delay_count<L_DELAY)    //当低电平的时间小于设定值时继续延时
         {
            l_delay_count++;
         }
         else                       // 当低电平延时时间达到设定值时 按键有效
         {
             if(CountEnable)
             {
                CountEnable=0;
                if(step==3)
                {
                   step=0;
                }
                else
                {
                   step=3;
                }

             }
         }

     }
     else                          //当按键释放时
     {                             // 低电平时间计数器清0
        l_delay_count=0;
        if(h_delay_count<H_DELAY)  // 当高电平的时间小于设定值时继续延时
        {
           h_delay_count++;
        }
        else                      // 当高电平延时时间达到设定值时 允许计数
        {
            CountEnable=1;
        }

     }
     TH0=0XFC;
     TL0=0X00;
 }


⌨️ 快捷键说明

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