📄 gps-1280.lst
字号:
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 + -