www.pudn.com > armexamples.rar > main.c


/****************************************************************************/ 
/*                                                                          */ 
/* 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<= 20) 
					{ 
						break; 
					} 
				}while(gprs_recv_msg_code != AT_RECV_MSG_OK && gprs_recv_msg_code != AT_RECV_MSG_ERROR); 
				 
				if(gprs_recv_msg_code == AT_RECV_MSG_ERROR) 
				{ 
					TRACE("服务中心号码设置错误\n"); 
					bexit = 1; 
					break; 
				}else 
				{ 
					// 发送短信 
					SM_PARAM Src; 
				 
					strcpy(Src.SCA, "8613800270500");			// 短消息服务中心号码(SMSC地址) 
					strcpy(Src.TPA, "86"); 
					strcat(Src.TPA, strcallnum);			// 目标号码或回复号码(TP-DA或TP-RA) 
					strcallnum[0] = 0; 
					Src.TP_PID = 0;			// 用户信息协议标识(TP-PID) 
					Src.TP_DCS = 8;			// 用户信息编码方式(TP-DCS) 
					strcpy(Src.TP_SCTS, "04060308421002");		// 服务时间戳字符串(TP_SCTS), 接收时用到 
					strcpy(Src.TP_UD, "武汉创维特信息技术有限公司欢迎您\r\nwww.cvtech.com.cn");		// 原始用户信息(编码前或解码后的TP-UD) 
					 
					TRACE("开始发送\n"); 
					 
					gprsSendMessage(&Src); 
					 
					TRACE("发送完毕\n"); 
					TRACE("输入号码,ENTER键发送,Cancel退出\n"); 
					gprs_sms_status = GPRS_SMS_IDLE; 
				} 
				break; 
		} 
		 
		gprs_recv_cmd(gprs_cmd_recv_string); 
		gprs_recv_msg_code = gprs_analyze_msg(gprs_cmd_recv_string); 
		if(gprs_recv_msg_code == AT_RECV_MSG_CMTI) 
		{ 
			char *pDest; 
			 
			// 收到短消息 
			TRACE("收到短消息\n"); 
			 
			// 解析短消息 
			pDest = strstr(gprs_cmd_recv_string, ","); 
			if(pDest != 0) 
			{ 
				SM_PARAM Msg; 
				 
				pDest++; 
				// 阅读短消息 
				TRACE("阅读短消息\n"); 
				 
				// Read Message 
				sprintf(gprs_cmd_send_string, "AT+CMGR=%d\r", atoi(pDest)); 
				gprs_send_cmd(gprs_cmd_send_string); 
				// receive message 
				do 
				{ 
					gprs_recv_cmd(gprs_cmd_recv_string); 
					gprs_recv_msg_code = gprs_analyze_msg(gprs_cmd_recv_string); 
					if(gprs_recv_msg_code == AT_RECV_MSG_CMGR) 
					{ 
						SM_PARAM Msg; 
						 
						gprs_recv_cmd(gprs_cmd_recv_string); 
						gprs_recv_cmd(gprs_cmd_recv_string); 
						gprsDecodePdu(gprs_cmd_recv_string, &Msg); 
						 
						gprs_print_msg(&Msg); 
						break; 
					} 
				}while(1); 
			} 
		} 
	} 
	TRACE("退出\n"); 
} 
/******************************************************************** 
// Function name	: gprs_print_msg 
// Description	    : 打印短消息 
// Return type		: void 
// Argument         : SM_PARAM* pMsg 
*********************************************************************/ 
void gprs_print_msg(SM_PARAM* pMsg) 
{ 
	char tmp[100]; 
	 
	TRACE("\n服务中心:"); 
	TRACE(pMsg->SCA); 
	TRACE("\n来自:"); 
	TRACE(pMsg->TPA); 
	TRACE("\n时间:"); 
	sprintf(tmp, "20%c%c年%c%c月%c%c日%c%c时%c%c分%c%c秒", pMsg->TP_SCTS[0], pMsg->TP_SCTS[1], \ 
	                               pMsg->TP_SCTS[2], pMsg->TP_SCTS[3], \ 
	                               pMsg->TP_SCTS[4], pMsg->TP_SCTS[5], \ 
	                               pMsg->TP_SCTS[6], pMsg->TP_SCTS[7], \ 
	                               pMsg->TP_SCTS[8], pMsg->TP_SCTS[9], \ 
	                               pMsg->TP_SCTS[10], pMsg->TP_SCTS[11]); 
	TRACE(tmp); 
	TRACE("\n内容:"); 
	TRACE(pMsg->TP_UD); 
	TRACE("\n"); 
} 
/******************************************************************** 
// Function name	: Main 
// Description	    : 主函数 
// Return type		: void 
// Argument         : void 
*********************************************************************/ 
void Main(void) 
{ 
	/* 配置系统时钟 */ 
    ChangeClockDivider(1,1);          // 1:2:4     
    ChangeMPllValue(0xa1,0x3,0x1);    // FCLK=202.8MHz   
	 
	/* 中断初始化 */ 
    Isr_Init(); 
    /* 初始化端口 */ 
    Port_Init(); 
     
    /* 初始化串口 */ 
    Uart_Init(0,115200); 
    Uart_Select(0); 
     
#if 0 
    TestTel(); 
#else 
	TestSMS(); 
#endif 
	 
	while(1) 
	{ 
	} 
}