📄 mt8889.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 + -