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

📄 mt8889.c

📁 双音多频驱动程序
💻 C
字号:
//********************** 操作 MT88L89 ****************
#include <msp430x14x.h>
#include "main.h"
//----------------------------- 加说明-----no---
//九个与DTMF有关的位
//#define SAD BIT5      //SAD//---P1.5,DTMF寄存器选择  输出
//#define MT88L89 BIT6  //MT88L89//-P1.6,88L89的片选   输出
//#define D0 BIT0           //D0//----P4.0,DTMF的四个数据端  数据双向端
//#define D1 BIT1           //D1//----P4.1
//#define D2 BIT2           //D2//----P4.2
//#define D3 BIT3           //D3//----P4.3
//#define DTM1 BIT4     //DTM1//--P5.4,DTMF芯片GS控制端,高有效
//#define RING BIT7     //RING//--P1.7,检测振铃,读状态,常态为高
//#define Pd1f BIT7     //Pd1f//--P5.7,检测插座是否插好,不插为高,插为低]
//#define RD BIT3           //RD//-------P6.3--J2.8---DTMF读写控制
//#define WR BIT4           //WR//-------P6.4--J2.7---DTMF读写控制
//#define OFFHOOK BIT6  //OFFHOOK--P6.6,高有效,有输出  //一个电话机取机动作信号
//#define LCD15 BIT5        //LCD15//----P2.5
#define DataBus 0x0F                  //p4.0-4.3
#define RD8889 BIT3                  //p6.3
#define WR8889 BIT4                 //p6.4
#define CS8889 BIT6                 //p1.6
#define RS8889 BIT5                 //p1.5
#define RING  BIT7                 //P1.7
#define OFFHOOK BIT6                  //P6.6

unsigned char read_SR(void);
unsigned char read_DTMF(void);

void init_8889(void);
unsigned char Get_DTMF(void);
void write_CR(unsigned char WriteData);
void Write_DTMF(unsigned char WriteData);

/**************************************
*功能: 读状态 REGISTER  
*参数: 
*返回: 
*备注: 
**************************************/
unsigned char read_SR(void)
{
    unsigned char read_temp;
    P1OUT |= RS8889;   //针对CRA/CRB操作
    P4DIR &= ~DataBus;//I/O 为读
    P1OUT &= (~CS8889);//开片选
    P6OUT &= (~RD8889);//开读
    _NOP();
    read_temp = P4IN;//延 ns秒级别。。。后读I/O
    read_temp &= 0x0f;//只要低四位
    P6OUT |= (RD8889);//关读
    P1OUT |= CS8889;//关片选
    P1OUT &= (~RS8889);//关
    return(read_temp);
}
/**************************************
*功能: 写状态 REGISTER     
*参数: 
*返回: 
*备注: 
**************************************/
void write_CR(unsigned char WriteData)
{
    P4DIR |= 0x0f;          //将数据位设为输出
    WriteData &= 0x0f;      //一定只能对 低四位操作 only low 4 bit
    P4OUT &= ~DataBus;      //--好象不能取消
    P1OUT |= RS8889;        //保证R
    P4OUT |= WriteData;     //将WriteData中保存的数据写入P1口的低四位(D0~D3)
    P1OUT &= (~CS8889);     //片选有效
    P6OUT &= (~WR8889);     //写
    _NOP();
    _NOP();
    P6OUT |= WR8889;        //关写
    P1OUT |= CS8889;        //关片选
    P1OUT &= (~RS8889);     //关
}
/**************************************
*功能: 发 DTMF 码    
*参数: 
*返回: 
*备注: 
**************************************/
void Write_DTMF(unsigned char WriteData)
{
    P4DIR |= 0x0f;      //将数据位设为输出
    WriteData &= 0x0f;  //一定只能对 低四位操作 only low 4 bit
    P1OUT &= (~RS8889);            //默认针对数据寄存器操作 
    P4OUT &= ~DataBus;  //--好象不能取消
    P4OUT |= WriteData; //将WriteData中保存的数据写入P1口的低四位(D0~D3)
    P1OUT &= (~CS8889); //片选有效
    P6OUT &= (~WR8889); //写
    _NOP();
    _NOP();
    P6OUT |= WR8889;    //关写
    P1OUT |= CS8889;     // /关片选
}
/**************************************
*功能: 读 DTMF 码    
*参数: 
*返回: 
*备注: 
**************************************/   
unsigned char  read_DTMF(void)
{    
    unsigned char Read_temp;
    P4DIR &= ~DataBus;   //I/O 为读
    P1OUT &= (~RS8889);  //默认针对数据寄存器操作   
    P1OUT &= (~CS8889);  //开片选
    P6OUT &= (~RD8889);  //开读
    _NOP();
    Read_temp = P4IN;   //读D0~D3
    Read_temp &= 0x0f;   //只要低四位
    P6OUT |= (RD8889);   //关读
    P1OUT |= CS8889;    //关片选
    return(Read_temp);
}
/**************************************
*功能: 初始化 DTMF 88l89    
*参数: 
*返回: 
*备注: 开机时 CALL
**************************************/
void init_8889(void)
{
    P1DIR |= RS8889 + CS8889;                         //ALL P1 IS OUT,BUT WHEN OPERATE DTMF,D0--D3 IS BIDIRCTION
    P1OUT &= ~RS8889;    
    P1OUT |= CS8889;
    P6DIR |= RD8889 + WR8889 + OFFHOOK;
    P6OUT |= RD8889 + WR8889;//OFFHOOK 不动作 表示低电平,不取机
    P1DIR &= ~RING; //定义为读I/O
    //#define DTM1 BIT4     //DTM1//--P5.4,DTMF芯片GS控制端,高有效
    P5DIR |= DTM1;//收码
    P5OUT |= DTM1;//收码
    //#define RD BIT3           //RD//-------P6.3--J2.8---DTMF读写控制
    //#define WR BIT4           //WR//-------P6.4--J2.7---DTMF读写控制
    P6DIR |= RD + WR;//输出
    
    //以下是8889复位(RESET)序列 
    read_SR();
    write_CR(0x0);
    write_CR(0x0);
    write_CR(0x08);
    write_CR(0);
    read_SR();
    //以下将8889设置成 非突发\非中断\DTMF发送及接收的模式   
    write_CR(0x8);
    write_CR(0x1);
}   
/**************************************
*功能: 收 DTMF 码    
*参数: 
*返回: 
*备注: 
**************************************/   
unsigned char Get_DTMF(void)
{
    unsigned char Read_Data;
    Read_Data = read_SR();
    if(Read_Data & BIT2)
    {
        Read_Data = read_DTMF();
        return(Read_Data);
    }
    else
    {
        return(0xff);
    }
}
      

⌨️ 快捷键说明

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