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

📄 main.c

📁 武汉创维特的arm培训例程试验程序
💻 C
📖 第 1 页 / 共 2 页
字号:
/****************************************************************************/
/*                                                                          */
/* FILE NAME                                      VERSION                   */
/*                                                                          */
/* GPRS.C                                            1.0                    */
/*                                                                          */
/* DESCRIPTION                                                              */
/*                                                                          */
/*     JX44B0(S3C44B0X)GPRS通讯实验                                         */
/*                                                                          */
/*                                                                          */
/* DATA STRUCTURES                                                          */
/*                                                                          */
/* FUNCTIONS :                                                              */
/*     在JX44B0教学实验箱进行GPRS通讯实验                                   */
/*                                                                          */
/* DEPENDENCIES                                                             */
/*     JX44B0-2                                                             */
/*     JX44B0-3                                                             */
/*                                                                          */
/*                                                                          */
/* NAME:                                                                    */
/* REMARKS:                                                                 */
/*                                                                          */
/*								Copyright (C) 2003 Wuhan CVTECH CO.,LTD     */
/****************************************************************************/

/****************************************************************************/
/* 学习JX44B0中电话呼叫功能和中英文短信功能的实现方法:                     */
/* 注意:                                                                   */
/*     1. 该实验仅仅适用与JX44B0-2以及JX44B0-3实验箱                        */
/*     2. 实验之前请阅读用户手册,并进行正确的硬件连接                      */
/*     3. 实验过程需要SIM卡,SIM可以使用中国移动和中国联通的各种手机卡      */
/*     4. SIM卡请不要带电插拔,否则容易导致烧卡                             */
/*     5. 短信实验中需要修改短信中心号码,请参照您的手机中的设置设置该值,  */
/*     注意去掉前面的'+'号                                                  */
/****************************************************************************/

/* 包含文件 */
#include "2410addr.h"
#include "2410lib.h"
#include "gprs.h"

/* 按键缓冲区 */
char gprs_key_recv_buf[GPRS_RECV_CMD_MAX_BUF];
int  gprs_key_recv_read = 0;
int  gprs_key_recv_write = 0;

/********************************************************************
// Function name	: TRACE
// Description	    : 在串口0上打印调试信息
// Return type		: void
// Argument         : char *string
*********************************************************************/
void TRACE(char *string)
{
	// disable int
//	gprs_disable_int();
	
	Uart_Select(0);
	Uart_Printf(string);
	
	// enable int
//	gprs_enable_int();
}
/********************************************************************
// Function name	: gprs_recv_key
// Description	    : 将获取的键值加入按键缓冲区
// Return type		: void
// Argument         : int key
*********************************************************************/
void gprs_recv_key(int key)
{
	gprs_key_recv_buf[gprs_key_recv_write] = key;
	gprs_key_recv_write ++;
	if(gprs_key_recv_write >= GPRS_RECV_CMD_MAX_BUF)
		gprs_key_recv_write = 0;
		
	if(gprs_key_recv_write == gprs_key_recv_read)
	{
		// 缓冲区以满
		gprs_key_recv_read ++;
		if(gprs_key_recv_read >= GPRS_RECV_CMD_MAX_BUF)
			gprs_key_recv_read = 0;
	}
}
/********************************************************************
// Function name	: key_get_char
// Description	    : 键盘扫描码
// Return type		: char
// Argument         : int row
// Argument         : int col
*********************************************************************/
char key_get_char(int row, int col)
{
	char key = 0;
	
	switch( row )
	{
	case 0:
		if((col & 0x01) == 0) key = '0'; 
		else if((col & 0x02) == 0) key = 'A'; 
		else if((col & 0x04) == 0) key = 'B'; 
		else if((col & 0x08) == 0) key = 'F'; 
		break;
	case 1:
		if((col & 0x01) == 0) key = '7'; 
		else if((col & 0x02) == 0) key = '8'; 
		else if((col & 0x04) == 0) key = '9';
		else if((col & 0x08) == 0) key = 'E';
		break;
	case 2:
		if((col & 0x01) == 0) key = '4'; 
		else if((col & 0x02) == 0) key = '5'; 
		else if((col & 0x04) == 0) key = '6'; 
		else if((col & 0x08) == 0) key = 'D'; 
		break;
	case 3:
		if((col & 0x01) == 0) key = '1'; 
		else if((col & 0x02) == 0) key = '2'; 
		else if((col & 0x04) == 0) key = '3'; 
		else if((col & 0x08) == 0) key = 'C'; 
		break;
	default:
		break;
	}
	
	return key;
}
/********************************************************************
// Function name	: gprs_get_key
// Description	    : 如果有键按下返回键,否则返回0
// Return type		: char
// Argument         : 
*********************************************************************/
char gprs_get_key()
{
	char ch = 0;
	
	return Uart_GetKey();
//	if(gprs_key_recv_write == gprs_key_recv_read)
//	{
//		/* no key found */
//		ch = 0;
//	}else
//	{
//		ch = gprs_key_recv_buf[gprs_key_recv_read];
//		gprs_key_recv_read ++;
//		if(gprs_key_recv_read >= GPRS_RECV_CMD_MAX_BUF)
//			gprs_key_recv_read = 0;
//	}
	return ch;
}

int  timer1_count = 0;
enum KEYBOARD_SCAN_STATUS
{
	KEYBOARD_SCAN_FIRST,
	KEYBOARD_SCAN_SECOND,
	KEYBOARD_SCAN_THIRD,
	KEYBOARD_SCAN_FOURTH
};
int row = 0;
unsigned char output_0x02000000 = 0xff;
unsigned char 	ascii_key, input_key[4], input_key1[4], key_mask = 0x0F;
unsigned char*	keyboard_port_scan = (unsigned char*)0x10000000;
unsigned char*	keyboard_port_value = (unsigned char*)0x10000002;
int              keyboard_scan_status[4] = {
														KEYBOARD_SCAN_FIRST,
														KEYBOARD_SCAN_FIRST,
														KEYBOARD_SCAN_FIRST,
														KEYBOARD_SCAN_FIRST
													  };
void timer1_isr1() __attribute__ ((interrupt("IRQ")));
/********************************************************************
// Function name	: timer1_isr
// Description	    : 定时器1中断服务程序,用于扫描键盘,每隔10ms一次中断
// Return type		: void
// Argument         : void
*********************************************************************/
void timer1_isr1(void)
{
	int loopcnt = row, bexit = 0;
	int temp;
	
	// 清除TIMER1中断
	ClearPending(BIT_TIMER1);
	timer1_count++;
	
	// 20ms
	for( loopcnt = row; loopcnt < row + 4; loopcnt ++)
	{
		if(loopcnt >= 4)
			temp = loopcnt - 4;
		else
			temp = loopcnt;
		switch(keyboard_scan_status[temp])
		{
			case KEYBOARD_SCAN_FIRST:
				*keyboard_port_scan = output_0x02000000 & (~(0x00000001<<temp));        /*将row列置低电平	*/
				keyboard_scan_status[temp] = KEYBOARD_SCAN_SECOND;
				bexit = 1;
				break;
			case KEYBOARD_SCAN_SECOND:
				input_key[temp] = (*keyboard_port_value) & key_mask;	/*并获取第一次扫描值*/
				if(input_key[temp] == key_mask)	
					keyboard_scan_status[temp] = KEYBOARD_SCAN_FIRST;		/* 没有按键,回到开始状态			*/
				else
				{
					keyboard_scan_status[temp] = KEYBOARD_SCAN_THIRD;		/* 有按键		*/
					bexit = 1;
				}
				break;
			case KEYBOARD_SCAN_THIRD:
				if (((*keyboard_port_value) & key_mask) != input_key[temp]) 
					keyboard_scan_status[temp] = KEYBOARD_SCAN_FIRST;	
				else	
				{
					ascii_key = key_get_char(temp, input_key[temp]);
					keyboard_scan_status[temp] = KEYBOARD_SCAN_FOURTH;
					
					*keyboard_port_scan = output_0x02000000 & (~(0x00000001<<temp));        /*将row列置低电平	*/
					bexit = 1;
				}
				break;
			case KEYBOARD_SCAN_FOURTH:
				input_key1[temp] = (*keyboard_port_value) & key_mask;	/*并获取第一次扫描值*/
				if(input_key1[temp] == key_mask)	
				{
					// get a key
					gprs_recv_key(ascii_key);					
					keyboard_scan_status[temp] = KEYBOARD_SCAN_FIRST;
				}else
				{
					*keyboard_port_scan = output_0x02000000 & (~(0x00000001<<temp));        /*将row列置低电平	*/
					bexit = 1;
				}
				break;
		}			
		if(bexit)
			break;
	}
	
	row = temp;
}
/********************************************************************
// Function name	: timer_init
// Description	    : 初始化定时器
// Return type		: void
// Argument         : void
*********************************************************************/
void timer_init(void)
{
	// 定时器初始化
    Irq_Request(IRQ_TIMER1, timer1_isr1);

    rTCFG0 = rTCFG0 & ~(0xffffff) | 0x000f0f;         //Dead zone=0,Prescaler1=15(0x0f),Prescaler0=15(0x0f)
    rTCFG1 = rTCFG1 & ~(0xffffff) | 0x001233;         //All interrupt,Mux4=1/2,Mux3=1/4,Mux2=1/8,Mux1=1/16,Mux0=1/16

    //Timer input clock frequency = PCLK/(prescaler value+1)/(divider value)
    rTCNTB1 = 0x7aa;           //(1/(50MHz/16/16)) * 0x7aa (1962) = 0.01s ( Hz)
    
    rTCON  = rTCON & ~(0xffffff) | 0xa00;         //Auto reload, Inverter off, Manual update, Dead zone disable, Stop  
    
    rTCON  = rTCON & ~(0xffffff) | 0x900;         //Auto reload(T0=One-shot),Inverter off,No operation,Dead zone disable,Start
	
	Irq_Enable(IRQ_TIMER1);
}
/********************************************************************
// Function name	: gprs_tel_call_in
// Description	    : GPRS电话呼入功能测试
// Return type		: void
// Argument         : 
*********************************************************************/
void gprs_tel_call_in()
{
	enum GPRS_TEL_IN_STATUS
	{
		GPRS_TEL_CALL_IN_IDLE,     // 等待输入
		GPRS_TEL_CALL_IN_ANSWER,   // 电话应答
		GPRS_TEL_CALL_IN_PHONE_ON, // 开始通话
	};

	int gprs_tel_call_in_status;
	int bexit = 0;
	char gprs_cmd_send_string[512];
	char gprs_cmd_recv_string[512];
	int  gprs_recv_msg_code;
	int key;

	gprs_tel_call_in_status = GPRS_TEL_CALL_IN_IDLE;
	while(bexit == 0)
	{
		key = gprs_get_key();
		switch(key)
		{
			case 0x0a:
			case 0x0d:
			case 'F':
			if(gprs_tel_call_in_status == GPRS_TEL_CALL_IN_IDLE)
			{
				// 接听电话
				TRACE("接听\n");
				strcpy(gprs_cmd_send_string, "ATA\r");
				gprs_send_cmd(gprs_cmd_send_string);
				gprs_tel_call_in_status = GPRS_TEL_CALL_IN_ANSWER;
			}
			break;
			case 'E':
			if(gprs_tel_call_in_status == GPRS_TEL_CALL_IN_ANSWER || \
			   gprs_tel_call_in_status == GPRS_TEL_CALL_IN_PHONE_ON)
			{
				// 正在通话,挂机
				TRACE("挂机\n");
				strcpy(gprs_cmd_send_string, "ATH\r");
				gprs_send_cmd(gprs_cmd_send_string);
				gprs_tel_call_in_status = GPRS_TEL_CALL_IN_IDLE;
				bexit = 1;
			}else
			{
				// 退出
				gprs_tel_call_in_status = GPRS_TEL_CALL_IN_IDLE;
				bexit = 1;
			}
			break;
		}

		// 接收输入
		gprs_recv_cmd(gprs_cmd_recv_string);
		gprs_recv_msg_code = gprs_analyze_msg(gprs_cmd_recv_string);
		if(gprs_tel_call_in_status == GPRS_TEL_CALL_IN_ANSWER)
		{
			switch(gprs_recv_msg_code)
			{
				// 接听
				case AT_RECV_MSG_OK:
					strcpy(gprs_cmd_send_string, "AT+PPSPKR=0\r");
					Delay(200);
					gprs_send_cmd(gprs_cmd_send_string);
					Delay(200);
					gprs_send_cmd(gprs_cmd_send_string);
					gprs_tel_call_in_status = GPRS_TEL_CALL_IN_PHONE_ON;
					TRACE("开始通话\n");
				break;				
			}
		}
	}

	TRACE("退出呼入功能\n");
}
/********************************************************************
// Function name	: gprs_tel_call_out
// Description	    : 电话呼出测试程序
// Return type		: void
// Argument         : 
*********************************************************************/
void gprs_tel_call_out()
{
	enum GPRS_TEL_OUT_STATUS
	{
		GPRS_TEL_CALL_OUT_IDLE,     // 等待输入
		GPRS_TEL_CALL_OUT_GET_NUM,  // 开始输入号码
		GPRS_TEL_CALL_OUT_CALLING,  // 呼出号码
		GPRS_TEL_CALL_OUT_PHONE_ON, // 开始通话
	};

	int gprs_tel_call_out_status;
	int bexit = 0;
	int key;
	char strcallnum[20];
	char gprs_cmd_send_string[512];
	char gprs_cmd_recv_string[512];
	char strtemp[10];
	strcallnum[0] = 0;
	int  gprs_recv_msg_code;
	
	gprs_tel_call_out_status = GPRS_TEL_CALL_OUT_IDLE;
	while(bexit == 0)
	{
		key = gprs_get_key();
		switch(key)
		{
			case '1':
			case '2':
			case '3':
			case '4':
			case '5':
			case '6':
			case '7':
			case '8':
			case '9':
			case '0':
				if(gprs_tel_call_out_status == GPRS_TEL_CALL_OUT_IDLE || \
				   gprs_tel_call_out_status == GPRS_TEL_CALL_OUT_GET_NUM)
				{
					gprs_tel_call_out_status = GPRS_TEL_CALL_OUT_GET_NUM;
					sprintf(strtemp, "%c", key);
					TRACE(strtemp);
					strcat(strcallnum, strtemp);
				}
				break;
			case 'E':
				if(gprs_tel_call_out_status == GPRS_TEL_CALL_OUT_CALLING || \
				   gprs_tel_call_out_status == GPRS_TEL_CALL_OUT_PHONE_ON)
				{
					// 正在通话,挂机
					TRACE("挂机\n继续拨号或者Cancel退出\n");
					strcpy(gprs_cmd_send_string, "ATH\r");
					gprs_send_cmd(gprs_cmd_send_string);
					gprs_tel_call_out_status = GPRS_TEL_CALL_OUT_IDLE;
					// 号码清零
					strcallnum[0] = 0;
				}else
				{
					// 退出
					gprs_tel_call_out_status = GPRS_TEL_CALL_OUT_IDLE;
					bexit = 1;
				}
				break;
			case 'F':
			case 0x0a:
			case 0x0d:
				TRACE("\n开始拨号或者Cancel挂机\n");

⌨️ 快捷键说明

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