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

📄 0706.c

📁 一个用单片机控制TC35I发短信的例子
💻 C
📖 第 1 页 / 共 2 页
字号:
//  0704

#include  "reg52.h"
#include  "stdio.h"
#include  "intrins.h"
#include  "absacc.h"
#include  "TC35I.H"
#define   uchar   unsigned char
#define   uint    unsigned int
#define   ulint   unsigned long int
#define   TIME1       100
#define   TIME2       200
#define   TIME3       300
#define   TIME4       100      //去抖延时
#define   L_DELAY              10
#define   H_DELAY              10
#define   START_PT    0
#define   RBUF_START  0

#define  CT_1            0        // OE 极性  改变极性可更改此宏
#define  CT_0            1
#define  RED0             0X01
#define  RED1             0X02
#define  DAT_INVERSE      0Xff;      //  数据反 0xff ,数据正常 0x00
/********** LED 屏寄存器地址定义************/
#define    SCAN_REG   XBYTE[0X0000]
#define    ReadInport  XBYTE[0X0000]
/*******************************************/
#define   SECOND    XBYTE[0X7F00]
#define   MINUTE    XBYTE[0X7F02]
#define   HOUR      XBYTE[0X7F04]
#define   WEEK      XBYTE[0X7F06]
#define   DATE      XBYTE[0X7F07]
#define   MONTH     XBYTE[0X7F08]
#define   YEAR      XBYTE[0X7F09]
#define   REG_A     XBYTE[0X7F0A]
#define   REG_B     XBYTE[0X7F0B]
#define   REG_C     XBYTE[0X7F0C]
#define   CENTURY   XBYTE[0X7F32]
/*********************************************/
uchar   volatile bdata  CTRL_R;             // 控制寄存器
sbit     SCAN_A=CTRL_R^0;
sbit     SCAN_B=CTRL_R^1;
sbit     SCAN_C=CTRL_R^2;
sbit     SCAN_D=CTRL_R^3;
sbit     EN=CTRL_R^4;
sbit     STB=CTRL_R^5;

sbit       CLK_EN =P1^6;

sbit  A16=P1^0;
sbit  A17=P1^1;
sbit  A18=P1^2;
sbit  A_138=       P1^3;
sbit  B_138=       P1^4;
sbit  C_138=       P1^5;
/*********************************************/

sbit     KEY2= P3^2;
sbit    DE = P3^5 ;
/********************************************/
sbit    IO_CE=  P1^6;        //外部IO选择,为1选择CPLD,为0选择eeprom

//*****************************************************************
uint   data   delaycount;
uchar  data   step;
uchar  data   time_sec;
uchar   idata  timemem[16];
uchar   idata  dispbuffer[28];
uchar   data   reg_row=0;
uint    data   pt_col=START_PT;
uchar xdata *xp_rbuffer;
uchar   data   over_count;    //回车累计变量,为4时即为通信结束
uint    data   timeout;
uchar   KEY;
uchar    data   h_delay_count;
uchar    data   l_delay_count;
uchar   data   bak;
bit     CountEnable;
bit     keyflag;
bit     updateflag;
bit     receiveflag;
bit     dateflag;
bit     timeflag;
bit     serial_flag;

//SM_PARAM   xdata gsmsms;

void  delay(unsigned int time0)
      {
       while(time0--);

      }

void  SelectInport()
{
   C_138=1;
   B_138=0;
   A_138=1;
}

void  Select374()
{

      B_138=1;
      C_138=0;
      A_138=1;
}
void SelectRam()
{
    A_138=0;
    B_138=0;
    C_138=0;
    A17=1;
    A18=0;
}
void SelectRom()
{
      A_138=1;
      B_138=0;
      C_138=0;
}
void SelectRTC()
{
      A_138=0;
      B_138=1;
      C_138=0;
}


void   TimeStop()
{
    uchar  bak;
    bak=P1;
    SelectRTC();
    REG_B=0X9A;
    P1=bak;
}
void   TimeRun()
{
   uchar  bak;
   bak=P1;
   SelectRTC();
   REG_B=0X1A;
   P1=bak;
}
void   Init_RTC()
{
    uchar i;
    uchar bak;
    bak=P1;
    SelectRTC();
    REG_B=0X9A;
    REG_A=0X26;
    REG_C=0X70;
    i=REG_C;
    P1=bak;
    TimeRun();

}
void   ResetTime()
{
  uchar bak;
  bak=P1;
  SelectRTC();
   SECOND=0X50;
   MINUTE=0X52;
   HOUR=0X08;
   WEEK=0X02;
   DATE=0X02;
   MONTH=0X05;
   YEAR=0X07;
   CENTURY=0X20;
   P1=bak;
}


//********************************* FLASH  读写程序 ****************************
void  Flash_Write(uchar page,uchar xdata *source,uchar xdata *destination)
{
  uint data i;
  IO_CE=1;
 // EXT_ADDR=0;
  IO_CE=0;
  XBYTE[0xD555]=0xaa;      //load 0xaa to adresss 5555
  XBYTE[0xAAAA]=0x55;      //load 0x55 to address 2aaa
  XBYTE[0xD555]=0xa0;      //load 0xa0 to adresss 5555
  IO_CE=1;
 // EXT_ADDR=page;
  IO_CE=0;
  for(i=0;i<256;i++)
  {
     *destination++=*source++;
  }

  delay(10000);


}

void  Flash_Erase()
{

}

void  Dis_Flash_Protect()
{
  IO_CE=1;
  IO_CE=0;
  XBYTE[0xD555]=0xaa;
  XBYTE[0xAAAA]=0x55;
  XBYTE[0xD555]=0x80;
  XBYTE[0xD555]=0xaa;
  XBYTE[0xAAAA]=0x55;
  XBYTE[0xD555]=0x20;
  delay(20000);


}

//******************************************************************************

void  ClearRam(uchar xdata *xp_begin,uchar xdata *xp_end)
{
  uchar xdata *xp_ram;
   xp_ram=xp_begin;
   while(xp_ram<xp_end)
   {
     *xp_ram++=0xff;
   }
}

void  ReadSy()
{
  uchar data page_flash;
  uchar xdata *xp_flash;
  uchar idata *ip_buffer;
  uint data i;
   ip_buffer=0x80;
   page_flash=0x44000/0x10000;
   P1=(P1&0xf8)|page_flash;
   xp_flash=0x44000%0x10000;
   SelectRom();
 //  P1&=0XF8;
//   xp_flash=0x150;
   for(i=0;i<40;i++)
   {
     *ip_buffer++=*(xp_flash+i);

   }

}

void SaveWord(uchar xdata *xp_ram,uchar index)
{
   uint data i;
   uint data j;
   uchar data k;
   uchar data page_flash;
   uchar xdata *xp_flash;
   uchar data row;
   uchar data temp;

   page_flash=0x70000/0x10000;
   P1=(P1&0xf8)|page_flash;
   xp_flash=index*256;
               P1&=0XF8;
               SelectRom();
               XBYTE[0xD555]=0xaa;      //load 0xaa to adresss 5555
               XBYTE[0xAAAA]=0x55;      //load 0x55 to address 2aaa
               XBYTE[0xD555]=0xa0;      //load 0xa0 to adresss 5555
               P1|=page_flash;

                for(i=0;i<256;i++)
                {
                    if(xp_ram<0x7fff)
                    {
                      SelectRam();
                      A16=0;
                      temp=*xp_ram++;
                      SelectRom();
                      P1=(P1&0XF8)|page_flash;

                      *xp_flash++=temp;
                    }
                    else
                    {
                       SelectRom();
                       P1=(P1&0XF8)|page_flash;
                       *xp_flash++=' ';
                    }

                }
                  delay(4500);
}

uint HZK_UNICODE(uint code_alpha, uchar mode)          //  mode=0  HZK-->UNICODE ; mode=1  HZK<----UNICODE
{
      uint  decode;
      uchar xdata *xp_ram;
      uint  xdata *xp_rom;
      uchar data  page_flash;
      uchar data  step;
      uint  data  address;
      uchar data  bak;
      bak=P1;
      page_flash=0x50000/0x10000;    // HZK_UNICODE 表存放的地址
      P1=(P1&0xf8)|page_flash;       //
      if(mode==0)
      {
         xp_rom=0x50000%0x10000;  // 指向表中的 HZK
         address=0xfffa;       // HZK->UNICODE 查表时的结束地址
      }
      else
      if(mode==1)
      {
         xp_rom=0x50000%0x10000;
         xp_rom++;                 // 指向表中的 UNICODE
         address=0xfffc;       // UNICODE->HZK 查表时的结束地址
      }

      SelectRom();             // 选择FLASH 29C040
      step=1;
      while(1)
      {
           if(*xp_rom==code_alpha)
           {
              if(mode==0)
                 return *(xp_rom+1);      // 返回HZK后面的UNICODE
              else
              if(mode==1)
                 return *(xp_rom-1);      // 返回 UNICODE 前面的 HZK
           }
           else
           {

              if(xp_rom<address)
              {
                            xp_rom++;       // 跳跃1组数据
                            xp_rom++;       // 指向下一组数据
              }
              else
              {
                 if(step<2)                 // STEP=2 为查询表的下64K 内容时的状态
                 {
                     step++;
                     if(mode==0)
                     {
                                address=0x5876;       // HZK->UNICODE 查表时的结束地址
                     }
                     else
                     if(mode==1)
                     {
                              address=0x5878;       // UNICODE->HZK 查表时的结束地址
                     }
                     page_flash=0x60000/0x10000;
                     P1=(P1&0xf8)|page_flash;
                     if(mode==0)
                           xp_rom=0x50000%0x10000;
                     else
                     if(mode==1)
                     {
                           xp_rom=0x50000%0x10000;
                           xp_rom++;
                     }

                 }
                 else
                 {
                    return(0xffff);         //未找到匹配数据时返回0xffff;找到匹配数据时返回对应的数据
                 }
              }
           }


      }
     P1=bak;
     _nop_();
}


void  CreateFnt16()    //构建16点阵显示RAM
{
   uchar xdata *xp_ram;
   uchar xdata *xp_rom;
   uchar xdata *xp_word;
   uchar data  temp;
   uchar data  row;    //点阵行,16点阵字为16行
   uchar data  col;   // 点阵列,16点阵字为16列
   uchar data  i;
   uint  data  length;     // 汉字长度,即多少个汉字,32K RAM 存16点阵字则可存储128字,共2048点
   uchar data  low ;
   uchar data  high;
   uchar data  asc;
   ulint row1;
   unsigned long int data  qu_code;
   uint  wei_code;
   unsigned long int data position;
   uint data  page;
   uchar data page_flash;
   uchar data   character;
   bit   flag;
   uchar  word_end;
    union
         {
          uchar  byte[4];
          unsigned long int  dword;
          uint  word[2];
         }  word;

   flag=0;
   SelectRam();
   A16=0;
   ClearRam(0x00,0xffff);
   A16=1;
   ClearRam(0x00,0xffff);



   for(row=0;row<16;row++)     // 处理16行文字
   {
      page_flash=0x70000/0x10000;    //文 字存放的位置 页
      P1=(P1&0xf8)|page_flash;       // 切换页面
      xp_rom=0x70000%0x10000;  //文字存放的位置  页内地址
      SelectRom();             // 选择FLASH 29C040
     row1=row;
     word.dword=row1*0x1000;   // 计算每行的汉字的RAM地址
     xp_word=xp_rom;
     character=*xp_word;       // 取出FLASH内的字符
     xp_ram=word.word[1];      // 确定 显示 RAM 地址
     word_end=0;       // 文字结束 标志变量
     length=0;
     while(length<256)
      {

                    word_end=0;
                    if(character<0xa0)          //  ASC 处理部分
                    {
                            SelectRom();
                            page_flash=0x70000/0x10000;    //文 字存放的位置 页
                             P1=(P1&0xf8)|page_flash;       // 切换页面
                            asc=character;
                            xp_word++;
                            character=*xp_word;
                            position=asc*16;               //  字符在ASC16中的偏移位置 
                            position=position+0x42000;     // ASC字库在存储器中的偏移位置  0x42000;
                            page=position/65536;           //  计数页码 32K/页
                            page_flash=page;
                            P1=(P1&0xf8)|page_flash;

                            page=(position%65536);
                            SelectRom();
                            xp_rom=page;
                            low=*(xp_rom+row);
                            SelectRam();
                            A16=1;
                       //     page_flash=row/8;

                       //     P1=(P1&0XFE)|page_flash;

                            for(col=0;col<8;col++)      // 将字库中点阵数据变换为LED显示屏把需数据
                            {
                                  low<<=1;
                                  temp=(CY&RED0)^DAT_INVERSE;
                                  *xp_ram++=temp;
                            }
                            length++;

                    }
                    else   // 汉字处理部分
                    {
                        SelectRom();
                        page_flash=0x70000/0x10000;    //文 字存放的位置 页
                        P1=(P1&0xf8)|page_flash;       // 切换页面
                        character=*xp_word++;
                        qu_code=character-0xa1;             //区码
                        character=*xp_word++;
                        wei_code=character-0xa1;            //位码
                        character=*xp_word;
                        position=32*(qu_code*94+wei_code);     //根据区位码计算汉字点阵在字库中的位置 
                        page=position/65536;           //  计数页码 32K/页
                        page_flash=page;
                        P1=(P1&0xf8)|page_flash;
                        page=(position%65536);
                        SelectRom();
                        xp_rom=page;
                        high=*(xp_rom+row*2);                     // 汉字点阵左半部分
                        low=*(xp_rom+row*2+1);                      // 汉字点阵右半部分
                        SelectRam();
                        A16=1;
                      //  page_flash=row/8;
                      //  P1=(P1&0XFE)|page_flash;

                        for(col=0;col<8;col++)
                        {
                                high<<=1;
                                temp=(CY&RED0)^DAT_INVERSE;
                                *xp_ram++=temp;
                        }
                        for(col=0;col<8;col++)
                        {
                               low<<=1;
                               temp=(CY&RED0)^DAT_INVERSE;
                               *xp_ram++=temp;

                        }
                        length++;
                        length++;
                     }
        }


   }


}

void IntToChar(ulint num,uchar data *pt_array)
{
  *pt_array++=num/10000;
  *pt_array++=(num%10000)/1000;
  *pt_array++=(num%1000)/100;
  *pt_array++=(num%100)/10;
  *pt_array++=num%10;

}


void init()
     {

      uchar i;
      uchar  idata  *ip_time;
      uchar sec;
      uint  temp;
      EN=0;         // LED显示板上OE
      Select374();
      SCAN_REG=CTRL_R;

      SCON=0X50;          //  SM0/SM1/SM2/REN/TB8/RB8/TI/RI
      TMOD=0X21;
   //   TH1=0XF4;
  //    TL1=0XF4;
      TH1=0XFA;
      TL1=0XFA;
      TR1=1;
      ES=1;
      PS=1;
      TR0=1;
      ET0=1;
      EX0=1;
      IT0=0;
      TH0=0Xe0;
      TL0=0X00;
  //    temp=HZK_UNICODE(0xdd7b,0);
      _nop_();
    /*
      for(i=0;i<28;i++)
      {
         dispbuffer[i]=0;
      }
     */
     }

uchar xdata *CompareBuffer(uchar code * pc_str)    // 在RAM中搜索指定字符串

{
  uchar  xdata *xp_ram;
  uchar  code   *cp_str;
  uchar  xdata  *xp_ram1;
  bit    same;

  xp_ram=0;
  P1&=0XF8;

⌨️ 快捷键说明

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