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

📄 cmx865ads.c

📁 c program to control cmx865 reading DTMF codes
💻 C
字号:
/*_____________________________________________________________________________________________________________________________________________________________________________
  cmx865(Tipo, Direccion, Dato)
  Version 1.0             Julio 12 2008
  Transmite y lee datos a y desde el CMX865ADS
      Parametros:
      Tipo- tipo de trama q se envia y que se espera
          0- Comando
          1- Direccion y dato 8 bits
          2- Direccion y un datos de 16 bits
          3- Direccion y un dato de 8 bits de regreso
          4- Direccion y un dato de 16 bits de regreso
      Direccion- 8 bits
      Dato- hasta 16 bits
  Ubiquos Ltda.                                                                                                       Alexander Espinosa G.
  _____________________________________________________________________________________________________________________________________________________________________________*/
unsigned int cmx865(unsigned char Tipo, unsigned char Direccion, unsigned int Dato)
{
  unsigned char Cta_bits;
  unsigned int Respuesta;
  // Generar las secuencias de pulsos necesarias para el envio del primer bloque de 8 bits (comando/direccion)
  // el CMX recibe bits en cada flanco de subida del clock
  HABILITAR_CMX();                                                            // Seleccionar el chip 
   retardo_cmx865(2000);
  Cta_bits=0;
  do
  {
   CLRCLK_CMX();                                                              // Asegura el clock en bajo antes de enviar datos
   retardo_cmx865(5000);
   if(Direccion & 0x80)                                                       // verificar el bit mas significativo
   {
     SETDATA_CMX();                                                           // Si se trata de un 1, envia un alto al cmx
   }
   else
   {
     CLRDATA_CMX();                                                           // de lo contrario envia un 0
   }
   SETCLK_CMX();                                                              // este flanco latcha los datos en el cmx
   retardo_cmx865(5000);
   Direccion<<=1;                                                             // Escoger el proximo bit
  }
  while(++Cta_bits<8);                                                        // 8 bits para direccion/comando
  if(Tipo==0) return 0;                                                       // si solo es un comando, regresa sin resultado
  // Decodificar el tipo de trama 
  switch(Tipo)
  {
   case 1:                                                                    // Direccion y dato de 8 bits
     Cta_bits=8;
     Dato<<=8;                                                                // Ubicar el byte en la parte alta para facilitar el envio
     break;
   case 2:                                                                    // Direccion y dato de 16 bits
     Cta_bits=16;
     break;
   case 3:                                                                    // Direccion y dato de 8 bits de retorno
     Cta_bits=8; Dato=0;                                                      // en este caso no importa el valor enviado
     break;
   case 4:                                                                    // Direccion y dato de 16 bits de retorno
     Cta_bits=16;Dato=0;                                                      // en este caso no importa el valor enviado
     break;
  }
  // A continuacion enviar el campo de datos y recibir la respuesta simultaneamente, la respuesta es valida en el clk alto
  Respuesta=0;
  do
  {
   CLRCLK_CMX();                                                              // Asegura el clock en bajo antes de enviar datos
   retardo_cmx865(5000);
   if(Dato & 0x8000)                                                          // verificar el bit mas significativo
   {
     SETDATA_CMX();                                                           // Si se trata de un 1, envia un alto al cmx
   }
   else
   {
     CLRDATA_CMX();                                                           // de lo contrario envia un 0
   }
   SETCLK_CMX();                                                              // este flanco latcha los datos en el cmx
   retardo_cmx865(5000);
   Respuesta&=0xFFFE;                                                         // por defecto asume bit entrante como 0
   if(DATAIN_STAT_CMX())                                                      // si entra un bit en alto
   {
     Respuesta|=0x0001;                                                       // lo carga en la respuesta
   }
   Respuesta<<=1;                                                             // rota el bit recien llegado
   Dato<<=1;                                                                  // Escoger el proximo bit a transmitir
  }
  while(--Cta_bits);                                                          // contar el bit de turno
  retardo_cmx865(5000);
  INHABILITAR_CMX();
  Respuesta>>=1;
  return Respuesta;
}


void retardo_cmx865(unsigned int Retardo)
{
  while(--Retardo);
}






⌨️ 快捷键说明

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