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

📄 main.c

📁 ARM程序
💻 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 + -