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

📄 gps.asm

📁 串行接收、提取GPS报文信息
💻 ASM
📖 第 1 页 / 共 2 页
字号:
;=====================================================================================================
                                 
                                   ;gpsgga数据接收程序 
                                   ;78h作为逗号计数器,20h.2为初始化设置标志位
																	 ;接收完数据后的第一个逗号后,跳转进入数据处理
gpsgga:
    mov dptr,#0f5h
		mov 78h,#00h
    movx a,@dptr
		inc dptr
    cjne a,#41h,ggadataret
ggadata:
    movx a,@dptr
		inc dptr
		cjne a,#2ch,ggadata
		inc 78h
ggadhao:
		mov a,78h
		cjne a,#11,ggadata
ggadatac:
   mov r2,#07h
	 mov r3,#0eeh
	 mov r4,#7ch
	 lcall ggadeal
ggadataret:
   mov dph,65h
	 mov dpl,66h
	 ret

	

;=======================================================================================================
                                   ;gga海拔高度提取程序 占用资源如下
																	 ;7ch 7dh 7eh 7fh 存放中间数据
																	 ;
																	 ;r1 r2 分别为中间计数器 地址寄存器
																	 ;7ech 7edh 为生产数据海拔部分
 

ggadeal:
     ljmp gga1
gga2:
     cjne a,#2ch,gga13
     ljmp gga14
gga13:
     inc dptr

gga1:   
	   movx a,@dptr
	   cjne a,#2eh,gga2
gga14:
	   mov 75h,dph
		 mov 76h,dpl                  ;保存程序dptr地址,现在dptr在小数点上
gga3:
     mov r1,#7fh
		 mov 77h,dpl                  ;低字节取出放在77h
gga4:
     dec 77h
		 mov dpl,77h                  ;低字节减1
		 movx a,@dptr                 ;dptr内数据取出
		 cjne a,#2dh,gga5            ;判断是否取完
     ljmp gga6
gga5:
     cjne a,#2ch,gga7
     ljmp gga10
gga7:
     mov @r1,a                    ;数据存储在7c-7f中
		 dec r1
		 ljmp gga4
gga6:
     mov dph,r2                    
		 mov dpl,r3                   ;数据放在生产数据dptr
		 mov a,r4
		 mov r1,a                    ;r4是子程序的起始地址
		 ljmp gga9
gga8:
     inc r1		                              
gga9:
		 lcall aschex
		 movx @dptr,a
		 inc dptr
		 cjne r1,#7fh,gga8
		 mov dptr,#7eeh               ;若有负号 则将7ech内数据最高位置1
		 movx a,@dptr
		 orl a,#80h
		 movx @dptr,a
     ljmp ggaret
gga10:
     mov dph,r2                    
		 mov dpl,r3                   ;数据放在生产数据dptr
		 mov a,r4
		 mov r1,a                    ;r4是子程序的起始地址
		 ljmp gga11
gga12:
     inc r1		                              
gga11:
		 lcall aschex
		 movx @dptr,a
		 inc dptr
		 cjne r1,#7fh,gga12
     ljmp ggaret
     
ggaret:
     mov 7ah,#30h
		 mov 7bh,#30h
		 mov 7ch,#30h
		 mov 7dh,#30h
		 mov 7eh,#30h
		 mov 7fh,#30h 
     mov dph,75h
		 mov dpl,76h                 ;恢复dptr数据
		 ret
;============================================================================
 ;处理小数点前的数据 占用资源如下
																	;75h 76h存储程序dptr地址 77h 作为低字节dpl的中间存储器
																	;r1 作为存储地址寄存器 
																	;r2 r3 入口参数 存放生产信息地址
																	;r4 入口参数 存放内部ram被处理数据起始地址
                                  ;7ah-7fh内部ram存储空间
																	;所有数据均为局部变量


drmcdata:
     
		 ljmp drmc1 
drmc2:
     cjne a,#2ch,drmc9
		 ljmp drmc10
drmc9:
     inc dptr
drmc1:
     movx a,@dptr 
		 cjne a,#2eh,drmc2            ;遇到小数点,开始逆向保存数据
drmc10:
		 mov 75h,dph
		 mov 76h,dpl                  ;保存程序dptr地址,现在dptr在小数点上
drmc3:
     mov r1,#7fh
		 mov 77h,dpl                  ;低字节取出放在77h
drmc4:
     dec 77h
		 mov dpl,77h                  ;低字节减1
		 movx a,@dptr                 ;dptr内数据取出
		 cjne a,#2ch,drmc5            ;判断是否取完
     ljmp drmc6
drmc5:
     mov @r1,a                    ;数据存储在7a-7f中
		 dec r1
		 ljmp drmc4
drmc6:
     mov dph,r2                    
		 mov dpl,r3
		 mov a,r4                         ;数据放在生产数据dptr
		 mov r1,a                    ;r4是子程序的起始地址
		 ljmp drmc7
drmc8:
     inc r1		                              
drmc7:
		 lcall aschex
		 movx @dptr,a
		 inc dptr
		 cjne r1,#7fh,drmc8
     mov 7ah,#30h
		 mov 7bh,#30h
		 mov 7ch,#30h
		 mov 7dh,#30h
		 mov 7eh,#30h
		 mov 7fh,#30h 
     mov dph,75h
		 mov dpl,76h                 ;恢复dptr数据
		 ret
;=====================================================================================================
                                  ;处理小数点后数据,占用资源如下
																	;75h 76h存储程序dptr地址 
																	;r1 作为存储地址寄存器 
																	;r2 r3 入口参数 存放生产信息地址
																	;r4 入口参数 存放内部ram被处理数据末地址
                                  ;7ah-7fh内部ram存储空间
																	;所有数据均为局部变量; 
srmcdata: 
 
    inc dptr
    mov r1,#7ah
srmc1:
    movx a,@dptr
		inc dptr
		cjne a,#2ch,srmc2
		ljmp srmc3
srmc2:
    mov @r1,a
		inc r1
		ljmp srmc1
srmc3:
    mov 75h,dph
		mov 76h,dpl  
    mov dph,r2
		mov dpl,r3
		mov r1,#7ah
		mov 79h,r4                     ;末地址放在79h       
    ljmp srmc4
srmc5:
    inc r1 
srmc4:
		lcall aschex
		movx @dptr,a
		inc dptr
		mov a,r1
		cjne a,79h,srmc5
    mov 7ah,#30h
		mov 7bh,#30h
		mov 7ch,#30h
		mov 7dh,#30h
		mov 7eh,#30h
		mov 7fh,#30h 
    mov dph,75h
		mov dpl,76h
    ret
;=====================================================================================================
                                  ;asc码转换成为十六进制子程序 
																	;不会遇到字符类型asc码 只考虑数字类型就可以了 
																	;入口参数r1 合并成的数据放在a内 
                                  ;5ah 5bh 在时间提取程序结束后 被释放 这里作为数据寄存器
aschex:
    mov a,@r1
		clr c                        ;bimianjiewei
		subb a,#30h
		anl a,#0fh
		swap a
		mov 5ah,a
		inc r1
		mov a,@r1
		subb a,#30h
		anl a,#0fh
		mov 5bh,a
		
aschexa:
    mov a,5ah
		add a,5bh
		ret		                               
;=====================================================================================================
                                  ;日期 数据提取子程序
																	;过程是 将已经存储在f0-**h的rmc上述数据读取出来存放在存放在50h-**h 
																	;由于各个数据长度固定 所以 直接调用asc码转换程序  将有效数据存放在
																	;生产数据地址内                                  

rirmcdata: 
    mov r1,#7ah
riqi2:    
		movx a,@dptr
		inc dptr
		cjne a,#2ch,riqi1
		ljmp riqi3
riqi1:
		mov @r1,a
		inc r1
    ljmp riqi2
riqi3:
    mov 75h,dph
		mov 76h,dpl
    mov dph,r2
		mov dpl,r3
		mov r1,#7ah
		ljmp riqi4
riqi5:
    inc r1
riqi4:
		lcall aschex
    movx @dptr,a
		inc dptr
    cjne r1,#7fh,riqi5
	   mov 7ah,#30h
		 mov 7bh,#30h
		 mov 7ch,#30h
		 mov 7dh,#30h
		 mov 7eh,#30h
		 mov 7fh,#30h
     mov dph,75h
		 mov dpl,76h                 ;恢复dptr数据
		 ret

⌨️ 快捷键说明

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