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

📄 386.c

📁 C开发的报警程序
💻 C
📖 第 1 页 / 共 5 页
字号:
  MT8880_D0=1;  //使能tone输出       
  MT8880_D1=0;  //选用双音多频方式,不用CP方式      
  MT8880_D2=0;  //此脚在实际电路中未接,不管
  MT8880_D3=1;  //本次操作CRA,下一个写操作选择CRB 
  MT8880_CS=0;
  MT8880_CP2=1;//给时钟信号,写D0-D3口值到控制寄存器   
  MT8880_CP2=0;    
  MT8880_CS=1;
  
  MT8880_RW=0;   //写控制寄存器
  MT8880_RS0=1;
  MT8880_D0=0;      
  MT8880_D1=0;        
  MT8880_D2=0;  
  MT8880_D3=0; 
  MT8880_CS=0;  
  MT8880_CP2=1;  //给时钟信号,写D0-D3口值到控制寄存器   
  MT8880_CP2=0;    
  MT8880_CS=1;
  
  MT8880_D0=1;  //总线复位       
  MT8880_D1=1;        
  MT8880_D2=1;  
  MT8880_D3=1;  
}

void MT8880_WriteOne(unsigned char SendData)  //使用入口参数,即要发送的数
{ 
   MT8880_CS=1;    
   MT8880_CP2=0;
   MT8880_RW=0;      //写传输数据寄存器
   MT8880_RS0=0;

  switch(SendData)
  {
   case 10: MT8880_D0=0; MT8880_D1=1; MT8880_D2=0; MT8880_D3=1;break; 
   case 1:  MT8880_D0=1; MT8880_D1=0; MT8880_D2=0; MT8880_D3=0;break;
   case 2:  MT8880_D0=0; MT8880_D1=1; MT8880_D2=0; MT8880_D3=0;break;
   case 3:  MT8880_D0=1; MT8880_D1=1; MT8880_D2=0; MT8880_D3=0;break;
   case 4:  MT8880_D0=0; MT8880_D1=0; MT8880_D2=1; MT8880_D3=0;break;
   case 5:  MT8880_D0=1; MT8880_D1=0; MT8880_D2=1; MT8880_D3=0;break;
   case 6:  MT8880_D0=0; MT8880_D1=1; MT8880_D2=1; MT8880_D3=0;break;
   case 7:  MT8880_D0=1; MT8880_D1=1; MT8880_D2=1; MT8880_D3=0;break;
   case 8:  MT8880_D0=0; MT8880_D1=0; MT8880_D2=0; MT8880_D3=1;break;
   case 9:  MT8880_D0=1; MT8880_D1=0; MT8880_D2=0; MT8880_D3=1;break;
   case 11: MT8880_D0=1; MT8880_D1=1; MT8880_D2=0; MT8880_D3=1;break;  // *
   case 12: MT8880_D0=0; MT8880_D1=0; MT8880_D2=1; MT8880_D3=1;break;  // #
  }
   MT8880_CS=0;    //给时钟信号,写D0-D3口值到控制寄存器
   MT8880_CP2=1;
   
   MT8880_CP2=0;
   MT8880_CS=1;
    
   MT8880_D0=1;  //写操作完后一定要总线复位       
   MT8880_D1=1;        
   MT8880_D2=1;  
   MT8880_D3=1;
 
}


void START24C02(void)     /////启动24c02
{
  scl=0;sda=1;  //用“读”来开始准备启动24C02的工作,把数据线置高,为启动的“下跳”准备
  scl=1;sda=0;  //启动
  scl=0;        //为“写”周期做准备,即准备控制线上跳。
}

void STOP24C02(void)     /////停止24C02
{
  sda=0;scl=1;
  sda=1;scl=0;            
}

bit Check24C02()    //应答位检查
{
  bit Check=0;
  sda=1;scl=1;
  Check=sda;   //接收应答信号
  scl=0;  
  return(Check);
}

void MACK(void)    //发送应答
{
 sda=0;scl=1;scl=0;sda=1;
}

void MNACK(void)   //发送非应答
{
 sda=1;scl=1;scl=0;sda=0;
}

void WriteOneByte(unsigned char dd)     ///写一个字节,已经完善,不再修改-----------------------------
{
  ACC=dd;
  sda=aa7;scl=1;scl=0;  //  数据在scl=0时才能改变
  sda=aa6;scl=1;scl=0;
  sda=aa5;scl=1;scl=0;
  sda=aa4;scl=1;scl=0;
  sda=aa3;scl=1;scl=0;
  sda=aa2;scl=1;scl=0;
  sda=aa1;scl=1;scl=0;
  sda=aa0;_nop_();scl=1;scl=0;
  sda=0;                  //令总线处于备用状态
}

unsigned char ReadOneByte(void)       /////读一个字节-------------------------------
{
  sda=1;
  scl=1;aa7=sda;scl=0;sda=1;
  scl=1;aa6=sda;scl=0;sda=1;
  scl=1;aa5=sda;scl=0;sda=1;
  scl=1;aa4=sda;scl=0;sda=1;
  scl=1;aa3=sda;scl=0;sda=1;
  scl=1;aa2=sda;scl=0;sda=1;
  scl=1;aa1=sda;scl=0;sda=1;
  scl=1;aa0=sda;scl=0;
  return(ACC);
}
//---------------------------------------写整个数组到24c02----------------------------------//

void Write24C02_Array(Number NUMBERW)
                                 /////入口参数为待传送数组
{
  unsigned char NUMSERIAL;  
  unsigned char NUMBYT=NUMBERW[1]+1;      //取组成员个数
  unsigned char i;
  bit Check_bit;
  NUMSERIAL=NUMBERW[0];   //取组的序号

  switch(NUMSERIAL)             //设定数组存放起始位置
  {
   case 1: NUMSERIAL=102; break;  //数组1的起始位置=0 长24位
   case 2: NUMSERIAL=124;break; //数组2的起始位置=21 长13位
   case 3: NUMSERIAL=144;break; //数组3的起始位置=34 长13位
   case 4: NUMSERIAL=164;break; //数组4的起始位置=47 长13位
   case 5: NUMSERIAL=184;break; //数组5的起始位置=60 长13位
   case 6: NUMSERIAL=204;break; //数组6的起始位置=73 长13位
   case 7: NUMSERIAL=224;break; //数组7的起始位置=86 长5 位
   case 8: NUMSERIAL=230;break; //数组8的起始位置=90 长2位
   case 9: NUMSERIAL=233;break; //数组9的起始位置=91 长3位

  } 
    for(i=1;i<=NUMBYT;i++)
      {
       startWrite:  START24C02();     //START24C02()执行完后,scl=0,sda=0
       WriteOneByte(160);            //寻址字节为0A0H,“写”;执行完后,scl=0,sda=0
       Check_bit=Check24C02();      //校验应答位;执行完后,scl=0,sda不管
       if(Check_bit==1)              //如果出错,从新启动总线
       goto startWrite;

       WriteOneByte(NUMSERIAL);      //确定片内寻址地址
       Check_bit=Check24C02();      //校验应答位
       if(Check_bit==1)              //如果出错,从新启动总线
       goto startWrite;

       WriteOneByte(NUMBERW[i]);  //原数组把组的序号放在“0”位置,组成员个数放在“1”位置
       Check_bit=Check24C02();
       if(Check_bit==1)              //如果出错,从新启动总线
       goto startWrite;
     
       STOP24C02();                 //执行完后,scl=0,sda=1
       NUMSERIAL=NUMSERIAL+1;
     } 
}//---------------------------------------写整个数组到24c02结束----------------------------------//

void Write24C02_139()
   {
       bit Check_bit=1;
    startWrite:   START24C02();     //START24C02()执行完后,scl=0,sda=0
       WriteOneByte(160);            //寻址字节为0A0H,“写”;执行完后,scl=0,sda=0
       Check_bit=Check24C02();      //校验应答位;执行完后,scl=0,sda不管
       if(Check_bit==1)              //如果出错,从新启动总线
       goto startWrite;

       WriteOneByte(99);      //确定片内寻址地址
       Check_bit=Check24C02();      //校验应答位
       if(Check_bit==1)              //如果出错,从新启动总线
       goto startWrite;

       WriteOneByte(139);  //原数组把组的序号放在“0”位置,组成员个数放在“1”位置
       Check_bit=Check24C02();
       if(Check_bit==1)              //如果出错,从新启动总线
       goto startWrite;
       STOP24C02();                 //执行完后,scl=0,sda=1
      
   }

void Write24C02_1390()
   {
       bit Check_bit=1;
    startWrite:   START24C02();     //START24C02()执行完后,scl=0,sda=0
       WriteOneByte(160);            //寻址字节为0A0H,“写”;执行完后,scl=0,sda=0
       Check_bit=Check24C02();      //校验应答位;执行完后,scl=0,sda不管
       if(Check_bit==1)              //如果出错,从新启动总线
       goto startWrite;

       WriteOneByte(99);      //确定片内寻址地址
       Check_bit=Check24C02();      //校验应答位
       if(Check_bit==1)              //如果出错,从新启动总线
       goto startWrite;

       WriteOneByte(0);  
       Check_bit=Check24C02();
       if(Check_bit==1)              //如果出错,从新启动总线
       goto startWrite;
       STOP24C02();                 //执行完后,scl=0,sda=1
      
   }

void Write24C02_FIRST()
   {
       bit Check_bit=1;
    startWrite:   START24C02();     //START24C02()执行完后,scl=0,sda=0
       WriteOneByte(160);            //寻址字节为0A0H,“写”;执行完后,scl=0,sda=0
       Check_bit=Check24C02();      //校验应答位;执行完后,scl=0,sda不管
       if(Check_bit==1)              //如果出错,从新启动总线
       goto startWrite;

       WriteOneByte(98);      //确定片内寻址地址
       Check_bit=Check24C02();      //校验应答位
       if(Check_bit==1)              //如果出错,从新启动总线
       goto startWrite;

       WriteOneByte(138);  
       Check_bit=Check24C02();
       if(Check_bit==1)              //如果出错,从新启动总线
       goto startWrite;
       STOP24C02();                 //执行完后,scl=0,sda=1
      
   }



//-----------------------------------读内容到整个结构,数组------------------------------------------//
struct ReadArray Read24C02_Array(unsigned char NUMSERIAL)
{
 bit Check_bit;
 unsigned char i;
 struct ReadArray READARRAY;
  switch(NUMSERIAL)             //设定数组存放起始位置
  {
   case 1: NUMSERIAL=102; break; //数组1的起始位置=0 长20位
   case 2: NUMSERIAL=124;break; //数组2的起始位置=20 长13位
   case 3: NUMSERIAL=144;break; //数组3的起始位置=33 长13位
   case 4: NUMSERIAL=164;break; //数组4的起始位置=46 长13位
   case 5: NUMSERIAL=184;break; //数组5的起始位置=59 长13位
   case 6: NUMSERIAL=204;break; //数组6的起始位置=72 长13位
   case 7: NUMSERIAL=224;break; //数组7的起始位置=85 长5 位
   case 8: NUMSERIAL=230;break; //数组8的起始位置=89 长2位
   case 9: NUMSERIAL=233;break; //数组9的起始位置=90 长3位
  } 
 
  startRead:  START24C02();
   WriteOneByte(160);            //寻址字节为0A0H,“写”
   Check_bit=Check24C02();      //校验应答位
   if(Check_bit==1)              //如果出错,从新启动总线
   goto startRead;
   
   WriteOneByte(NUMSERIAL);      //确定片内寻址地址
   Check_bit=Check24C02();      //校验应答位
   if(Check_bit==1)              //如果出错,从新启动总线
   goto startRead;
   STOP24C02();            //  执行完后,scl=0,sda=1

  startReadD: START24C02();
   WriteOneByte(161);            //寻址字节为0A1H,“读”
   Check_bit=Check24C02();      //校验应答位
   if(Check_bit==1)              //如果出错,从新启动总线
   goto startReadD;
      
   READARRAY.Number24[1]=ReadOneByte();  //读出本组有多少个成员,[0]位预留,组成员个数放在[1]位置
                                         //执行“读”完后,scl=0,sda任意
   if(READARRAY.Number24[1]==0)
      MNACK();    
   else
    {
   MACK();                               //发送校验
       for(i=0;i<READARRAY.Number24[1];i++)
      {
       READARRAY.Number24[i+2]=ReadOneByte();
       if(i<READARRAY.Number24[1]-1)
         MACK();
       else MNACK();
      } 
    }
  STOP24C02();
  return(READARRAY);
}//---------------------------读内容到整个结构,数组结束------------------------------------------//


//------------------------------处理在一次摘机“编程”过程中的读取 ,存储----------------------------------//

void Make_Program()    
{ 
  unsigned char Number_Note=0;   //记录是第几个“电话机输入键”
  unsigned char Number_Array=0;  //标记是生成的第几号数组。
  unsigned char Number_Key;          //存储“电话机输入键值”的中间变量
  Number NUMBER;       //生成记录一次摘机过程的数组
  bit SaveTo24C02=0;
                Reset=0;
   ReadStatus: MT8880_StatusRegister_READ();
           
   if(MT8880_D2==1)     //是否有键值生成              
    {
        MT8880_CP2=0; //停动8880总线 
        MT8880_CS=1;  //停动8880总线

     MT8880_DataRegister_READ();   //读入的一个值出现在MT8880_D0-D3
     
     if(MT8880_D3==0 & MT8880_D2==0 & MT8880_D1==0 & MT8880_D0==1)  //输入“1” 
       {Number_Key=1; LED_DRIVER(0,0,0,0,0,1,1,0); }//显示“1”
     if(MT8880_D3==0 & MT8880_D2==0 & MT8880_D1==1 & MT8880_D0==0)  //输入“2” 
       {Number_Key=2; LED_DRIVER(1,1,0,1,1,0,1,0);} //显示“2”
     if(MT8880_D3==0 & MT8880_D2==0 & MT8880_D1==1 & MT8880_D0==1)  //输入“3” 
       {Number_Key=3; LED_DRIVER(1,1,0,0,1,1,1,0);} //显示“3”
     if(MT8880_D3==0 & MT8880_D2==1 & MT8880_D1==0 & MT8880_D0==0)  //输入“4” 
       {Number_Key=4; LED_DRIVER(1,0,0,0,0,1,1,1);} //显示“4”
     if(MT8880_D3==0 & MT8880_D2==1 & MT8880_D1==0 & MT8880_D0==1)  //输入“5” 
       {Number_Key=5; LED_DRIVER(1,1,0,0,1,1,0,1); }//显示“5”
     if(MT8880_D3==0 & MT8880_D2==1 & MT8880_D1==1 & MT8880_D0==0)  //输入“6” 
       {Number_Key=6; LED_DRIVER(1,1,0,1,1,1,0,1); }//显示“6”
     if(MT8880_D3==0 & MT8880_D2==1 & MT8880_D1==1 & MT8880_D0==1)  //输入“7” 
       {Number_Key=7; LED_DRIVER(0,1,0,0,0,1,1,0); } //显示“7”
     if(MT8880_D3==1 & MT8880_D2==0 & MT8880_D1==0 & MT8880_D0==0)  //输入“8” 
       {Number_Key=8; LED_DRIVER(1,1,0,1,1,1,1,1); }//显示“8”
     if(MT8880_D3==1 & MT8880_D2==0 & MT8880_D1==0 & MT8880_D0==1)  //输入“9” 
       {Number_Key=9; LED_DRIVER(1,1,0,0,1,1,1,1); } //显示“9”
     if(MT8880_D3==1 & MT8880_D2==0 & MT8880_D1==1 & MT8880_D0==0)  //输入“0” 
       {Number_Key=10; LED_DRIVER(0,1,0,1,1,1,1,1); }//显示“0”
     if(MT8880_D3==1 & MT8880_D2==0 & MT8880_D1==1 & MT8880_D0==1)  //输入“*” 
       {Number_Key=11; LED_DRIVER(1,0,0,1,1,1,0,1); }//显示“b” 代替
     if(MT8880_D3==1 & MT8880_D2==1 & MT8880_D1==0 & MT8880_D0==0)  //输入“#” 
       {Number_Key=12;  LED_DRIVER(1,0,0,1,0,1,1,1);}//显示“#”="H"


    // if(MT8880_D3==1 & MT8880_D2==1 & MT8880_D1==0 & MT8880_D0==1)  //输入“A” 
    //   Number_Key=13;
    // if(MT8880_D3==1 & MT8880_D2==1 & MT8880_D1==1 & MT8880_D0==0)  //输入“B” 
    //   Number_Key=14;
    // if(MT8880_D3==1 & MT8880_D2==1 & MT8880_D1==1 & MT8880_D0==1)  //输入“C” 
    //   Number_Key=15;
    // if(MT8880_D3==0 & MT8880_D2==0 & MT8880_D1==0 & MT8880_D0==0)  //输入“D” 
    //   Number_Key=0;
       
       MT8880_CP2=0; //停动8880总线
       MT8880_CS=1;  //停动8880总线

     if(Number_Note==0)     //处理本次摘机编程的第一次电话机键盘数据
       {
        Number_Array=Number_Key;
        if(Number_Array==10||Number_Array==1||Number_Array==2||Number_Array==3||Number_Array==4||Number_Array==5||Number_Array==6||Number_Array==7||Number_Array==8||Number_Array==9)
          {
           if(Number_Array==10){NUMBER[0]=0;Reset=1;}
           else{NUMBER[0]=Number_Array;}     //把组的序号放在“0”位置
           Number_Note=Number_Note+1;
         
           if(ISD1420_REC_ZJ==0)    //还处在摘机状态,则继续读状态
              goto ReadStatus;
              else return;
          }  
        else return; 
       }
     if(Number_Note==1)   //处理本次摘机编程的第二次电话机键盘数据,已经处理了1次电话机键盘数据
        {
         if(Number_Key!=11)  //判断是否为*

⌨️ 快捷键说明

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