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

📄 gps-1280.lst

📁 u-blox的GPS模块LEA-5x,三本例子为ATMEGA1280对他的操作的程序
💻 LST
📖 第 1 页 / 共 5 页
字号:
     30C DDE1      RCALL	_debug_send_string
     30D 940C 0689 JMP	pop_xgset303C
_debug_uint_original_shape:
  ucData_l             --> R10
  ucData_h             --> R12
  uiData               --> R10
     30F 940E 0673 CALL	push_xgset003C
     311 0158      MOVW	R10,R16
(0204) }
(0205) /*************************************************
(0206) 
(0207) *************************************************/
(0208) void debug_uint_original_shape(unsigned int uiData)
(0209) {
(0210) 	unsigned char ucData_h,ucData_l;
(0211) 	
(0212) 	ucData_h = (unsigned char)(uiData>>8);
     312 0165      MOVW	R12,R10
     313 2CCD      MOV	R12,R13
     314 24DD      CLR	R13
(0213) 	debug_uchar_original_shape(ucData_h);
     315 2D0C      MOV	R16,R12
     316 DFBA      RCALL	_debug_uchar_original_shape
(0214) 
(0215) 	ucData_l = (unsigned char)uiData;
(0216) 	debug_uchar_original_shape(ucData_l);
     317 2D0A      MOV	R16,R10
     318 DFB8      RCALL	_debug_uchar_original_shape
     319 940C 065D JMP	pop_xgset003C
_find_string:
  StrLen               --> R12
  i                    --> R20
  j                    --> R22
  DataLen              --> Y,+10
  data                 --> R14
  string               --> R10
     31B 940E 066D CALL	push_xgsetF0FC
     31D 0179      MOVW	R14,R18
     31E 0158      MOVW	R10,R16
FILE: E:\item\GPS-1280\gps.c
(0001) #include <string.h>
(0002) #include "debug.h"
(0003) #include "define.h"
(0004) 
(0005) //GPRMC,<1>,<2>,<3>,<4>,<5>,<6>,<7>,<8>,<9>,<10>,<11>*hh   
(0006) //<1> 当前位置的格林尼治时间,格式为hhmmss   
(0007) //<2> 状态, A 为有效位置, V为非有效接收警告,即当前天线视野上方的卫星个数少于3颗
(0008) //<3> 纬度, 格式为ddmm.mmmm   
(0009) //<4> 标明南北半球, N 为北半球、S为南半球   
(0010) //<5> 径度,格式为dddmm.mmmm   
(0011) //<6> 标明东西半球,E为东半球、W为西半球   
(0012) //<7> 地面上的速度,范围为0.0到999.9   
(0013) //<8> 方位角,范围为000.0到 359.9 度   
(0014) //<9> 日期, 格式为ddmmyy   
(0015) //<10> 地磁变化,从000.0到 180.0 度   
(0016) //<11> 地磁变化方向,为E 或 W
(0017) /*
(0018) $GPRMC,072304.00,A,2231.85460,N,11404.40661,E,0.128,,261008,,,A*7C
(0019) $GPVTG,,T,,M,0.128,N,0.238,K,A*21
(0020) $GPGGA,072304.00,2231.85460,N,11404.40661,E,1,04,10.41,-25.4,M,-2.2,M,,*65
(0021) $GPGSA,A,3,07,20,11,50,,,,,,,,,17.78,10.41,14.42*3C
(0022) $GPGSV,3,1,10,04,30,234,,07,17,180,32,08,40,215,,11,34,038,29*7C
(0023) $GPGSV,3,2,10,20,44,097,51,27,23,193,21,28,63,341,,32,28,070,*78
(0024) $GPGSV,3,3,10,42,51,128,39,50,46,122,45*7C
(0025) $GPGLL,2231.85460,N,11404.40661,E,072304.00,A,A*63
(0026) */
(0027) 
(0028) //-------------------------------------------------------------
(0029) //从长度为DataLen数据指针*data中找出字符串*string
(0030) //-------------------------------------------------------------
(0031) unsigned char find_string(unsigned char *string,unsigned char *data,unsigned int DataLen)
(0032) {
(0033) 	unsigned int StrLen = strlen(string);
     31F 0185      MOVW	R16,R10
     320 940E 0590 CALL	_strlen
     322 0168      MOVW	R12,R16
(0034) 	unsigned int i;
(0035) 	unsigned int j;
(0036) 	
(0037) 	for(i=0;i<DataLen;i++)
     323 2744      CLR	R20
     324 2755      CLR	R21
     325 C028      RJMP	0x034E
(0038) 	{
(0039) 		if(string[0]==data[i])
     326 01FA      MOVW	R30,R20
     327 0DEE      ADD	R30,R14
     328 1DFF      ADC	R31,R15
     329 8020      LDD	R2,Z+0
     32A 01F5      MOVW	R30,R10
     32B 8030      LDD	R3,Z+0
     32C 1432      CP	R3,R2
     32D F4F1      BNE	0x034C
(0040) 		{
(0041) 			for(j=1;j<StrLen;j++)
     32E E061      LDI	R22,1
     32F E070      LDI	R23,0
     330 C011      RJMP	0x0342
(0042) 			{
(0043) 				if(string[j]==data[i+j]){
     331 01FA      MOVW	R30,R20
     332 0FE6      ADD	R30,R22
     333 1FF7      ADC	R31,R23
     334 0DEE      ADD	R30,R14
     335 1DFF      ADC	R31,R15
     336 8020      LDD	R2,Z+0
     337 01FB      MOVW	R30,R22
     338 0DEA      ADD	R30,R10
     339 1DFB      ADC	R31,R11
     33A 8030      LDD	R3,Z+0
     33B 1432      CP	R3,R2
     33C F409      BNE	0x033E
(0044) 					
(0045) 				}else{
     33D C002      RJMP	0x0340
(0046) 					return 0;
     33E 2700      CLR	R16
     33F C015      RJMP	0x0355
     340 5F6F      SUBI	R22,0xFF
     341 4F7F      SBCI	R23,0xFF
     342 156C      CP	R22,R12
     343 057D      CPC	R23,R13
     344 F360      BCS	0x0331
(0047) 				}
(0048) 			}
(0049) 			if(j==StrLen) return i+1;//就算是在0位置找到的也返回0,处理时减1
     345 156C      CP	R22,R12
     346 057D      CPC	R23,R13
     347 F421      BNE	0x034C
     348 2F04      MOV	R16,R20
     349 5F0F      SUBI	R16,0xFF
     34A 4F1F      SBCI	R17,0xFF
     34B C009      RJMP	0x0355
     34C 5F4F      SUBI	R20,0xFF
     34D 4F5F      SBCI	R21,0xFF
     34E 840A      LDD	R0,Y+10
     34F 841B      LDD	R1,Y+11
     350 1540      CP	R20,R0
     351 0551      CPC	R21,R1
     352 F408      BCC	0x0354
     353 CFD2      RJMP	0x0326
(0050) 		}
(0051) 	}
(0052) 	return 0;
     354 2700      CLR	R16
     355 940C 0662 JMP	pop_xgsetF0FC
_Greenwich_time:
  data                 --> R20
     357 934A      ST	R20,-Y
     358 935A      ST	R21,-Y
     359 01A8      MOVW	R20,R16
(0053) }
(0054) //-------------------------------------------------------------
(0055) //格林尼治时间
(0056) //-------------------------------------------------------------
(0057) void Greenwich_time(unsigned char *data)
(0058) {	
(0059) 	debug_str_without_n("Greenwich time	:	");
     35A E40F      LDI	R16,0x4F
     35B E012      LDI	R17,2
     35C 940E 00F8 CALL	_debug_str_without_n
(0060) 	debug_uchars_without_n(&data[0],2);
     35E E022      LDI	R18,2
     35F E030      LDI	R19,0
     360 018A      MOVW	R16,R20
     361 940E 0123 CALL	_debug_uchars_without_n
(0061) 	debug_str_without_n(":");
     363 E40D      LDI	R16,0x4D
     364 E012      LDI	R17,2
     365 940E 00F8 CALL	_debug_str_without_n
(0062) 	debug_uchars_without_n(&data[2],2);
     367 E022      LDI	R18,2
     368 E030      LDI	R19,0
     369 018A      MOVW	R16,R20
     36A 5F0E      SUBI	R16,0xFE
     36B 4F1F      SBCI	R17,0xFF
     36C 940E 0123 CALL	_debug_uchars_without_n
(0063) 	debug_str_without_n(":");
     36E E40D      LDI	R16,0x4D
     36F E012      LDI	R17,2
     370 940E 00F8 CALL	_debug_str_without_n
(0064) 	debug_uchars_without_n(&data[4],2);
     372 E022      LDI	R18,2
     373 E030      LDI	R19,0
     374 018A      MOVW	R16,R20
     375 5F0C      SUBI	R16,0xFC
     376 4F1F      SBCI	R17,0xFF
     377 940E 0123 CALL	_debug_uchars_without_n
(0065) 	debug_str("");
     379 E40C      LDI	R16,0x4C
     37A E012      LDI	R17,2
     37B 940E 0104 CALL	_debug_str
     37D 9159      LD	R21,Y+
     37E 9149      LD	R20,Y+
     37F 9508      RET
_latitude:
  data                 --> R20
     380 934A      ST	R20,-Y
     381 935A      ST	R21,-Y
     382 01A8      MOVW	R20,R16
(0066) }
(0067) //-------------------------------------------------------------
(0068) //纬度
(0069) //-------------------------------------------------------------
(0070) void latitude(unsigned char *data)
(0071) {
(0072) 	debug_str_without_n("latitude	:	");
     383 E400      LDI	R16,0x40
     384 E012      LDI	R17,2
     385 940E 00F8 CALL	_debug_str_without_n
(0073) 	
(0074) 	debug_uchars_without_n(&data[11],1);
     387 E021      LDI	R18,1
     388 E030      LDI	R19,0
     389 018A      MOVW	R16,R20
     38A 5F05      SUBI	R16,0xF5
     38B 4F1F      SBCI	R17,0xFF
     38C 940E 0123 CALL	_debug_uchars_without_n
(0075) 	debug_str_without_n("  ");
     38E E30D      LDI	R16,0x3D
     38F E012      LDI	R17,2
     390 940E 00F8 CALL	_debug_str_without_n
(0076) 	debug_uchars_without_n(&data[0],10);
     392 E02A      LDI	R18,0xA
     393 E030      LDI	R19,0
     394 018A      MOVW	R16,R20
     395 940E 0123 CALL	_debug_uchars_without_n
(0077) 	debug_str("");
     397 E40C      LDI	R16,0x4C
     398 E012      LDI	R17,2
     399 940E 0104 CALL	_debug_str
     39B 9159      LD	R21,Y+
     39C 9149      LD	R20,Y+
     39D 9508      RET
_radian:
  data                 --> R20
     39E 934A      ST	R20,-Y
     39F 935A      ST	R21,-Y
     3A0 01A8      MOVW	R20,R16
(0078) }
(0079) //-------------------------------------------------------------
(0080) //径度
(0081) //-------------------------------------------------------------
(0082) void radian(unsigned char *data)
(0083) {
(0084) 	debug_str_without_n("radian		:	");
     3A1 E302      LDI	R16,0x32
     3A2 E012      LDI	R17,2
     3A3 940E 00F8 CALL	_debug_str_without_n
(0085) 	
(0086) 	debug_uchars_without_n(&data[12],1);
     3A5 E021      LDI	R18,1
     3A6 E030      LDI	R19,0
     3A7 018A      MOVW	R16,R20
     3A8 5F04      SUBI	R16,0xF4
     3A9 4F1F      SBCI	R17,0xFF
     3AA 940E 0123 CALL	_debug_uchars_without_n
(0087) 	debug_str_without_n("  ");
     3AC E30D      LDI	R16,0x3D
     3AD E012      LDI	R17,2
     3AE 940E 00F8 CALL	_debug_str_without_n
(0088) 	debug_uchars_without_n(&data[0],11);
     3B0 E02B      LDI	R18,0xB
     3B1 E030      LDI	R19,0
     3B2 018A      MOVW	R16,R20
     3B3 940E 0123 CALL	_debug_uchars_without_n
(0089) 	debug_str("");
     3B5 E40C      LDI	R16,0x4C
     3B6 E012      LDI	R17,2
     3B7 940E 0104 CALL	_debug_str
     3B9 9159      LD	R21,Y+
     3BA 9149      LD	R20,Y+
     3BB 9508      RET
_speed:
  i                    --> R10
  data                 --> R12
     3BC 940E 0673 CALL	push_xgset003C
     3BE 0168      MOVW	R12,R16
(0090) }
(0091) //-------------------------------------------------------------
(0092) //地面速度
(0093) //-------------------------------------------------------------
(0094) void speed(unsigned char *data)
(0095) {
(0096) 	unsigned char i=0;
     3BF 24AA      CLR	R10
(0097) 	
(0098) 	debug_str_without_n("speed		:	");
     3C0 E208      LDI	R16,0x28
     3C1 E012      LDI	R17,2
     3C2 940E 00F8 CALL	_debug_str_without_n
(0099) speed_top:
(0100) 	if(data[i]!='.'){
     3C4 2DEA      MOV	R30,R10
     3C5 27FF      CLR	R31
     3C6 0DEC      ADD	R30,R12
     3C7 1DFD      ADC	R31,R13
     3C8 8180      LDD	R24,Z+0
     3C9 328E      CPI	R24,0x2E
     3CA F051      BEQ	0x03D5
(0101) 		debug_uchars_without_n(&data[i],1);
     3CB E021      LDI	R18,1
     3CC E030      LDI	R19,0
     3CD 2D0A      MOV	R16,R10
     3CE 2711      CLR	R17
     3CF 0D0C      ADD	R16,R12
     3D0 1D1D      ADC	R17,R13
     3D1 940E 0123 CALL	_debug_uchars_without_n
(0102) 		i++;
     3D3 94A3      INC	R10
(0103) 		goto speed_top;
     3D4 CFEF      RJMP	0x03C4
(0104) 	}
(0105) 	debug_str("");
     3D5 E40C      LDI	R16,0x4C
     3D6 E012      LDI	R17,2
     3D7 940E 0104 CALL	_debug_str
     3D9 940C 065D JMP	pop_xgset003C
_gps_function:
  availability_flag_1  --> R20
  availability_flag_2  --> R12
  mes_addr             --> R22
  DataLen              --> R14
  data                 --> R10
     3DB 940E 066D CALL	push_xgsetF0FC
     3DD 0179      MOVW	R14,R18
     3DE 0158      MOVW	R10,R16
     3DF 9722      SBIW	R28,2
(0106) }
(0107) //-------------------------------------------------------------
(0108) unsigned char gps_function(unsigned char *data,unsigned int DataLen)
(0109) {
(0110) 	unsigned int mes_addr=0;
     3E0 2766      CLR	R22
     3E1 2777      CLR	R23
(0111) 	unsigned char availability_flag_1=0;
     3E2 2744      CLR	R20
(0112) 	unsigned char availability_flag_2=0;
     3E3 24CC      CLR	R12
(0113) 	
(0114) 	if(data[0]=='$'){
     3E4 01F5      MOVW	R30,R10
     3E5 8180      LDD	R24,Z+0
     3E6 3284      CPI	R24,0x24
     3E7 F401      BNE	0x03E8
(0115) 		//debug_uchars(data,DataLen);
(0116) 	}
(0117) 			
(0118) 	if(data[0]=='$'){//判断接收到的GPS数据头一个数据是否为'$'
     3E8 01F5      MOVW	R30,R10
     3E9 8180      LDD	R24,Z+0
     3EA 3284      CPI	R24,0x24
     3EB F009      BEQ	0x03ED
     3EC C04D      RJMP	0x043A
(0119) 		mes_addr = find_string("$GPRMC",data,DataLen);//找出字符串"$GPRMC"所在GPS数据中的位置
     3ED 82F9      STD	Y+1,R15
     3EE 82E8      STD	Y+0,R14
     3EF 019F      MOVW	R18,R30
     3F0 E201      LDI	R16,0x21
     3F1 E012      LDI	R17,2
     3F2 DF28      RCALL	_find_string
     3F3 2F60      MOV	R22,R16
     3F4 2777      CLR	R23
(0120) 		if(mes_addr != 0){//有找到
     3F5 3060      CPI	R22,0
     3F6 0767      CPC	R22,R23
     3F7 F409      BNE	0x03F9
     3F8 C041      RJMP	0x043A
(0121) 			mes_addr = mes_addr -1; //注意:减1才是真正的字符串位置
     3F9 5061      SUBI	R22,1
     3FA 4070      SBCI	R23,0
(0122) 			availability_flag_1 = data[mes_addr + 8];//无效数据标志'V'(这个位置不存在'A')
     3FB 01FB      MOVW	R30,R22
     3FC 9638      ADIW	R30,0x8
     3FD 0DEA      ADD	R30,R10
     3FE 1DFB      ADC	R31,R11
     3FF 8140      LDD	R20,Z+0
(0123) 			availability_flag_2 = data[mes_addr + 17];//无效数据标志'V',有效数据标志'A'
     400 01FB      MOVW	R30,R22
     401 9671      ADIW	R30,0x11
     402 0DEA      ADD	R30,R10
     403 1DFB      ADC	R31,R11
     404 80C0      LDD	R12,Z+0
(0124) 			
(0125) 			if(availability_flag_2 == 'A'){//有效数据
     405 2D8C      MOV	R24,R12
     406 3481      CPI	R24,0x41
     407 F4E9      BNE	0x0425
(0126) 				//debug_str("gps data effective !");
(0127) 				//<1> 当前位置的格林尼治时间,格式为hhmmss
(0128) 				Greenwich_time(&data[mes_addr + 7]);
     408 018B      MOVW	R16,R22
     409 5F09      SUBI	R16,0xF9
     40A 4F1F      SBCI	R17,0xFF
     40B 0D0A      ADD	R16,R10
     40C 1D1B      ADC	R17,R11
     40D DF49      RCALL	_Greenwich_time
(0129) 				//纬度
(0130) 				latitude(&data[mes_addr + 19]);
     40E 018B      MOVW	R16,R22
     40F 5E0D      SUBI	R16,0xED
     410 4F1F      SBCI	R17,0xFF
     411 0D0A      ADD	R16,R10
     412 1D1B      ADC	R17,R11
     413 DF6C      RCALL	_latitude

⌨️ 快捷键说明

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