📄 main.c
字号:
/*******************************************************************************************************
* 文件名:main.c
* 功 能:开发板main()函数例子
* 作 者:POWER
* 日 期:2006年9月28号
* 斯凯科技主页:www.armsky.net
* 斯凯科技论坛:www.armsky.net/bbs
********************************************************************************************************/
#include "config.h"
#define MT8880_DATA 0xf<<22 //p0.22-25
#define MT8880_RW 0x1<<12 //p0.12
#define MT8880_RS0 0x1<<13 //p0.13
#define MT8880_IRQ 0x1<<14 //p0.14
#define MT8880_CLK 0x1<<15 //p0.15
#define MT8880_HandUp 0x1<<20 //p0.20
#define MT8880_Bell 0x1<<21 //p0.21
/* 子函数(子程序)说明 */
void MT8880_RST(void);
void MT8880_WC(uint8 com);
void MT8880_WD(uint8 dat);
uint8 MT8880_RD(void);
uint8 MT8880_RS(void);
void Delay_us(uint32 dly);
void Delay_ms(uint32 dly);
void tran_init(void);
void transmit(uint8 *p,uint8 count);
void rece_init(void);
void Sys_REST(void);
/* 主函数(主程序) */
int main(void)
{
uint8 tmp,ucSendBuf=0,ucRcvBuf=0,ucStatusBuf,T_buf[20]={5,6,3,5,7,5,2,3,4,8,8,9,1},R_buf[10]; /* 预存数码 */
Sys_REST();
MT8880_RST();
Delay_ms(800);
IO0SET=MT8880_HandUp;
Delay_ms(500);
MT8880_WC(0x0D); //写CRA,中断允许,DTMF模式,音频输出允许
MT8880_WC(0x00); //写CRB,突发模式,DTMF模式
tmp=0;
while(1)
{
if(ucSendBuf!=4){
MT8880_WD(T_buf[ucSendBuf++]); //发送数据到MT8880
}
ucStatusBuf=MT8880_RS();
if((ucStatusBuf&0x04)!=0) //接收有效信号,STATUS.2=1表示接收到DTMF信号.
{
R_buf[ucRcvBuf++]=MT8880_RD(); //读取数据
if(ucRcvBuf==10)
ucRcvBuf=0;
}
Delay_ms(500);
}
}
void Sys_REST(void)
{
IO0DIR=~0;
IO1DIR=~0;
PINSEL0=0;
PINSEL1=0;
PINSEL0=PINSEL0&(~((uint32)(0x3f<<24))); // 将P0.12-14引脚选择为输出功能
PINSEL1=PINSEL1&(~((uint32)(0xff<<14))); // 将P0.22-25引脚选择为输出功能
IO0PIN=0;
IO0DIR=IO0DIR|((uint32)(0xb<<12)); //p0.12-13,15 out
IO0DIR=IO0DIR&(~((uint32)(0x1<<14))); //p0.14 in
IO0DIR=IO0DIR|MT8880_DATA; //p0.22-25 输出
}
/***************************************************************
*名称: MT8880_RST
*功能: 初始化MT8880,发送禁止,中断禁止,DTMF模式,突发模式
****************************************************************/
void MT8880_RST(void)
{
MT8880_RS(); //读状态寄存器,用以清除各标志
MT8880_WC(0); //写控制寄存器,确保控制寄存器指针指向CRA
MT8880_WC(0);
MT8880_WC(8); //写控制寄存器A,输出禁止,中断禁止,DTMF模式
MT8880_WC(0); //写控制寄存器B,突发模式,DTMF模式
MT8880_RS(); //读状态寄存器,用以清除各标志
}
/*****************************************
*名称: MT8880_WC()
*功能: 写控制寄存器CRA或CRB
*入口参数: com--要写入的数据
*出口参数: 无
******************************************/
void MT8880_WC(uint8 com)
{
IO0DIR=IO0DIR|((uint32)MT8880_DATA); //D0~D3设置为输出
IO0SET=MT8880_RS0;
IO0CLR=MT8880_RW;
Delay_us(1);
com&=0x0f;
IO0PIN =(IO0PIN&(~((uint32)MT8880_DATA)))|(com<<22);
IO0SET=MT8880_CLK;
Delay_us(1);
IO0CLR=MT8880_CLK;
}
/***************************************
*名称: MT8880_WD()
*功能: 写MT8880的发送数据寄存器
*入口参数: dat--要发送的数据
*出口参数: 无
****************************************/
void MT8880_WD(uint8 dat)
{
IO0DIR=IO0DIR|((uint32)MT8880_DATA); //D0~D3设置为输出
IO0CLR=MT8880_RS0;
IO0CLR=MT8880_RW;
Delay_us(2);
dat&=0x0f;
IO0PIN =(IO0PIN&(~((uint32)MT8880_DATA)))|(dat<<22);
IO0SET=MT8880_CLK;
Delay_us(2);
IO0CLR=MT8880_CLK;
}
/***************************************
*名称: MT8880_RD
*功能: 读MT8880的接收数据寄存器
*入口参数: 无
*出口参数: temp--读出的数据,低4位有效
****************************************/
uint8 MT8880_RD()
{
uint8 temp;
IO0DIR=IO0DIR&(~((uint32)MT8880_DATA)); //D0~D3设置为输入
IO0CLR=MT8880_RS0;
IO0SET=MT8880_RW;
IO0SET=MT8880_CLK;
Delay_us(1);
temp=(((IO0PIN&(MT8880_DATA))>>22)&0xf);
IO0CLR=MT8880_CLK;
return(temp);
}
/***************************************
*名称: MT8880_RS()
*功能: 读MT8880的状态寄存器
*入口参数: 无
*出口参数: temp--读出的数据,低4位有效
****************************************/
uint8 MT8880_RS()
{
uint8 temp;
IO0DIR=IO0DIR&(~((uint32)MT8880_DATA)); //D0~D3设置为输入
IO0SET=MT8880_RS0;
IO0SET=MT8880_RW;
IO0SET=MT8880_CLK;
temp=(((IO0PIN&(MT8880_DATA))>>22)&0xf);
IO0CLR=MT8880_CLK;
return(temp);
}
/*============== 延时子函数 ==================*/
void Delay_ms(uint32 dly)
{
uint32 i;
for(;dly>0;dly--)
for(i=0;i<10000;i++);
}
void Delay_us(uint32 dly)
{
uint32 i;
for (i=0;i<dly;i++);
}
/* 发送初始化子函数 */
void tran_init(void)
{
uint32 tm;
tm=(IO0PIN&(~((uint32)MT8880_DATA)))|(0x9<<22);
IO0PIN =tm; IO0CLR=MT8880_RW; IO0SET=MT8880_RS0; //P1=0x29; /* CRA=1001 */
IO0PIN =(IO0PIN&(~((uint32)MT8880_DATA)))|(0x1<<22); IO0CLR=MT8880_RW; IO0SET=MT8880_RS0; //P1=0x21; /* CRB=0001 */
Delay_ms(50);
}
/* 发送操作子函数 */
void transmit(uint8 *p,uint8 count)
{
uint8 i;
for (i=0;i<count;i++,p++)
{ IO0PIN =(IO0PIN&(~((uint32)MT8880_DATA)))|(*p<<22); // P1=*p; /* 发送数码 */
Delay_ms(100); /* 延时 */
IO0SET=MT8880_RW |MT8880_RS0; // P1=0x3f; /* 读SR */
IO0PIN =(IO0PIN&(~((uint32)MT8880_DATA)))|(0x02<<22);
IO0CLR=MT8880_RW; IO0SET=MT8880_RS0;
Delay_ms(50);
}
}
/*==============*3.2 接收程序=================
程序利用单片机的INT0以中断方式接收DTMF信号,
接收的7位数码存入数组R_BUF中。
============================================*/
/* 接收初始化子函数 */
void rece_init(void)
{
//P1=0x24; /* CRA=0100 */
//IT0=1; /* 边沿触发 */
//IE=0x81; } /* 允许中断,开中断 */
IO0PIN =(IO0PIN&(~((uint32)MT8880_DATA)))|(0x04<<22);
IO0CLR=MT8880_RW; IO0SET=MT8880_RS0;
}
/* 接收中断服务程序
void int0(void) interrupt 0 using 1
{ P1=0x3f; // 读SR
P1=0x1f; // 读RDR
r_buf[i++]=P1&0x0f; // 保存
}
====*/
/********************************************************************************************
* 函数名称:IRQ_Eint0()
* 功 能:外部中断0服务程序
* 入口参数:无
* 出口参数:无
*********************************************************************************************/
void __irq IRQ_Eint1(void)
{
EXTINT=0x02; // 清除EINT1中断标志
VICVectAddr=0; // 向量中断结束
}
//没有查资料可能不对
void Set_Intrupt(void)
{
PINSEL0&=0xcfffffff; // 将P0.14引脚选择为EINT1功能
PINSEL0|=0x20000000; // 将P0.14引脚选择为EINT1功能
IRQEnable(); // 使能IRQ中断
/* 外部中断0和2初始化(使用向量中断) */
VICIntSelect=0x00000000; // 设置所有中断分配为IRQ中断
VICVectCntl0=0x20 | 14; // 分配外部中断1到向量中断1
VICVectAddr0=(uint32)IRQ_Eint1; // 设置中断服务程序地址
EXTINT=0x02; // 清除EINT1
VICIntEnable=(1<<14); // 使能EINT1
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -