📄 gps.asm
字号:
Gpsrec:
mov 65h,dph
mov 66h,dpl ;保护地址
mov 7ah,#30h
mov 7bh,#30h
mov 7ch,#30h
mov 7dh,#30h
mov 7eh,#30h
mov 7fh,#30h
clr 2dh.5
mov a,60h
cjne a,#24h,gpsreca ;判断是否为$
mov dptr,#0f0h
movx @dptr,a
inc dptr
setb 20h.0
mov 70h,dph
mov 71h,dpl
mov dph,65h
mov dpl,66h ;出栈
ret
gpsreca:
jnb 20h.0,gpsrecret
mov dph,70h
mov dpl,71h
cjne a,#0ah,gpsrecb ;判断是否为最后一个字节
movx @dptr,a
clr 20h.0
ljmp gpscheck
gpsrecb: ;数据存放
movx @dptr,a
inc dptr
mov 70h,dph
mov 71h,dpl
gpsrecret:
mov dph,65h
mov dpl,66h ;出栈
ret
;=======================================================================================================
;=====================================================================================================
;校验子程序
;占用资源75H 作为异或中间存储,76h 77h作为异或和校验中间存储
;76h存储低字节 77h存储高字节
gpscheck:
mov dptr,#0f1h ;首地址
mov 75h,#00h
gpschea:
movx a,@dptr
inc dptr
cjne a,#2ah,gpscheb ;判断是否为*
ljmp gpschec ;全部异或结束,跳转处理程序
gpscheb:
xrl a,75h ;异或
mov 75h,a
ljmp gpschea
gpschec:
mov 76h,75h
mov 77h,75h
anl 76h,#0fh ;取出低字节放在76H
anl 77h,#0f0h
mov a,77h
swap a
mov 77h,a ;高字节放在77H
orl 76h,#30h
orl 77h,#30h ;变成ASC码格式
movx a,@dptr
cjne a,77h,gpscheret
inc dptr
movx a,@dptr
cjne a,76h,gpscheret ;校验成功 应该改为直接跳转道rmc数据接收程序
ljmp gpsdata ;*****现在还没有进行改动******
;setb 20h.1
gpscheret:
mov dph,65h
mov dpl,66h
ret
;=====================================================================================================
;GPSRMC数据接收程序
;采用对逗号和小数点进行计数的方法,将需要的数据存放在一个连续的空间
;对待不同符号后的数据接收采用不同的方法
;数据校验成功即跳转到本程序
;78h 逗号个数存储器
gpsdata:
mov dptr,#00f3h
mov 78h,#0
movx a,@dptr
inc dptr
cjne a,#52h,gpsggaj ;若f3空间是r 进入提取rmc数据空间。否则转去判断是否为gga数据
;===========================================================================================
;判断接受数据是否有效,只有在接收数据为rmc时 才进入此流程
gpsav:
mov dptr,#0f0h
mov 78h,#0
gpsava:
movx a,@dptr
inc dptr
cjne a,#2ch,gpsava
inc 78h
mov a,78h
cjne a,#2,gpsava
movx a,@dptr
cjne a,#41h,gpsavret
mov dptr,#7d5h ;如gps数据有效 ,报警信息第三位置为1
movx a,@dptr
xor a,#08h
movx @dptr,a
mov 78h,#0
ljmp gpsavv
gpsavret:
mov dptr,#7d5h ;无效 ,第三位置为0
movx a,@dptr
anl a,#0f7h
movx @dptr,a
mov 78h,#0
mov dph,65h
mov dpl,66h
ret
;=============================================================================================
gpsavv:
mov dptr,#0f4h
gpsrmc:
movx a,@dptr
inc dptr
cjne a,#2ch,gpsrmc
inc 78h
rmcdhao:
mov a,78h
cjne a,#1,rmcdhaoa ;判断逗号个数为1 进入接收时间信息流程
mov r2,#07h
mov r3,#0f3h ;时 分 秒 数据 放在7f3h开头的空间内
mov r4,#7ah
lcall drmcdata
rmcdhaol:
movx a,@dptr
inc dptr
cjne a,#2ch,rmcdhaol
inc 78h
ljmp rmcdhao
gpsggaj:
ljmp gpsgga
rmcdhaoa:
cjne a,#2,rmcdhaob ;判断逗号个数为2 进入接受"A""V"的过程
;由于是单个数据的处理 直接读取 直接判断
rmcdatab:
movx a,@dptr
inc dptr ;数据接收
cjne a,#2ch,rmcdataba ;判断是否为逗号
inc 78h ;是逗号则说明接受完毕
ljmp rmcdhao ;跳转去判断逗号个数
rmcdataba:
cjne a,#41h,rmcjump1 ;若此数据不为"A"则数据无效 跳转回主程序/////////////////////
ljmp rmcdatab ;若是"a" 则继续接收下个数据
rmcjump1:
ljmp gerroll
rmcdhaob:
cjne a,#3,rmcdhaoc ;判断逗号个数为3 进入接收纬度信息流程
mov r2,#07h
mov r3,#0dfh ;小数点前纬度数据存放在#7dfh-7e0h
mov r4,#7ch ;数据提取从7ch开始
lcall drmcdata
mov r2,#07h
mov r3,#0e1h ;小数点后数据存放在#7e1h-7e2h
mov r4,#7dh
lcall srmcdata
inc 78h
ljmp rmcdhao
rmcdhaoc:
cjne a,#4,rmcdhaod ;判断逗号个数为4 进入接收纬度方向信息流程
;这段也是接受单字符程序 直接读取 直接存放
rmcdatac:
movx a,@dptr
inc dptr
cjne a,#2ch,rmcdataca
inc 78h
ljmp rmcdhao
rmcdataca:
cjne a,#4eh,rmcdatacb ;判断时候为"n" 否去判断是否为"s"
mov 75h,dph
mov 76h,dpl
mov dptr,#07e3h ;存放在 xram 7e3h内
movx @dptr,a
mov dph,75h
mov dpl,76h
ljmp rmcdatac
rmcdatacb:
cjne a,#53h,rmcjump2 ;判断是"s",则可以存储,否,重新接收
mov 75h,dph
mov 76h,dpl
mov dptr,#07e3h
movx @dptr,a
mov dph,75h
mov dpl,76h
ljmp rmcdatac
rmcjump2:
ljmp gerroll
rmcdhaod:
cjne a,#5,rmcdhaoe ;5c内个数为5是 进入提取经度信息流程
mov r2,#07h
mov r3,#0e4h ;小数点经度信息放在7e4 7e5 7e6内
mov r4,#7ah
lcall drmcdata
mov r2,#07h
mov r3,#0e7h ;小数点后经度信息放在7e7 7e8内
mov r4,#7dh
lcall srmcdata
inc 78h
ljmp rmcdhao
rmcdhaoe:
cjne a,#6,rmcdhaof ;5c内个数为6是 进入提取经度方向信息流程
rmcdatad:
movx a,@dptr
inc dptr
cjne a,#2ch,rmcdatada
inc 78h
ljmp rmcdhao
rmcdatada:
cjne a,#45h,rmcdatadb ;判断时候为"e" 否去判断是否为"w"
mov 75h,dph
mov 76h,dpl
mov dptr,#07e9h ;存放在 xram 7e9h内
movx @dptr,a
mov dph,75h
mov dpl,76h
ljmp rmcdatad
rmcdatadb:
cjne a,#57h,gerroll ;判断是"w",则可以存储,否,重新接收
mov 75h,dph
mov 76h,dpl
mov dptr,#07e9h
movx @dptr,a
mov dph,75h
mov dpl,76h
ljmp rmcdatad
rmcdhaof:
cjne a,#7,rmcdhaog ;5c内个数为7是 进入提取速度信息流程
mov r2,#07h
mov r3,#0d9h ;小数点前数据放在7d9 7da内
mov r4,#7ch
lcall drmcdata
mov r2,#07h
mov r3,#0dbh ;小数点后数据放在7db内
mov r4,#7bh
lcall srmcdata
inc 78h
ljmp rmcdhao
rmcdhaog:
cjne a,#8,rmcdhaoh ;5c内个数为8是 进入提取方向信息流程
mov r2,#07h
mov r3,#0dch ;方向信息小数点前方在7dc 7dd内
mov r4,#7ch
lcall drmcdata
mov r2,#07h
mov r3,#0deh ;方向信息小数点后 放在7de内
mov r4,#7bh
lcall srmcdata
inc 78h
ljmp rmcdhao
rmcdhaoh:
cjne a,#9,gerroll ;5c内个数为9是 进入提取日期信息流程
mov r2,#07h
mov r3,#0f0h ;日期信息放在7f0 7f1 7f2内
lcall rirmcdata
gerroll:
mov dph,65h
mov dpl,66h
ret ;直接返回主程序即可,重新接收
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -