?? 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 ;判斷是否為最后一個字節(jié)
movx @dptr,a
clr 20h.0
ljmp gpscheck
gpsrecb: ;數(shù)據存放
movx @dptr,a
inc dptr
mov 70h,dph
mov 71h,dpl
gpsrecret:
mov dph,65h
mov dpl,66h ;出棧
ret
;=======================================================================================================
;=====================================================================================================
;校驗子程序
;占用資源75H 作為異或中間存儲,76h 77h作為異或和校驗中間存儲
;76h存儲低字節(jié) 77h存儲高字節(jié)
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 ;取出低字節(jié)放在76H
anl 77h,#0f0h
mov a,77h
swap a
mov 77h,a ;高字節(jié)放在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數(shù)據接收程序
ljmp gpsdata ;*****現(xiàn)在還沒有進行改動******
;setb 20h.1
gpscheret:
mov dph,65h
mov dpl,66h
ret
;=====================================================================================================
;GPSRMC數(shù)據接收程序
;采用對逗號和小數(shù)點進行計數(shù)的方法,將需要的數(shù)據存放在一個連續(xù)的空間
;對待不同符號后的數(shù)據接收采用不同的方法
;數(shù)據校驗成功即跳轉到本程序
;78h 逗號個數(shù)存儲器
gpsdata:
mov dptr,#00f3h
mov 78h,#0
movx a,@dptr
inc dptr
cjne a,#52h,gpsggaj ;若f3空間是r 進入提取rmc數(shù)據空間。否則轉去判斷是否為gga數(shù)據
;===========================================================================================
;判斷接受數(shù)據是否有效,只有在接收數(shù)據為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數(shù)據有效 ,報警信息第三位置為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 ;判斷逗號個數(shù)為1 進入接收時間信息流程
mov r2,#07h
mov r3,#0f3h ;時 分 秒 數(shù)據 放在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 ;判斷逗號個數(shù)為2 進入接受"A""V"的過程
;由于是單個數(shù)據的處理 直接讀取 直接判斷
rmcdatab:
movx a,@dptr
inc dptr ;數(shù)據接收
cjne a,#2ch,rmcdataba ;判斷是否為逗號
inc 78h ;是逗號則說明接受完畢
ljmp rmcdhao ;跳轉去判斷逗號個數(shù)
rmcdataba:
cjne a,#41h,rmcjump1 ;若此數(shù)據不為"A"則數(shù)據無效 跳轉回主程序/////////////////////
ljmp rmcdatab ;若是"a" 則繼續(xù)接收下個數(shù)據
rmcjump1:
ljmp gerroll
rmcdhaob:
cjne a,#3,rmcdhaoc ;判斷逗號個數(shù)為3 進入接收緯度信息流程
mov r2,#07h
mov r3,#0dfh ;小數(shù)點前緯度數(shù)據存放在#7dfh-7e0h
mov r4,#7ch ;數(shù)據提取從7ch開始
lcall drmcdata
mov r2,#07h
mov r3,#0e1h ;小數(shù)點后數(shù)據存放在#7e1h-7e2h
mov r4,#7dh
lcall srmcdata
inc 78h
ljmp rmcdhao
rmcdhaoc:
cjne a,#4,rmcdhaod ;判斷逗號個數(shù)為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內個數(shù)為5是 進入提取經度信息流程
mov r2,#07h
mov r3,#0e4h ;小數(shù)點經度信息放在7e4 7e5 7e6內
mov r4,#7ah
lcall drmcdata
mov r2,#07h
mov r3,#0e7h ;小數(shù)點后經度信息放在7e7 7e8內
mov r4,#7dh
lcall srmcdata
inc 78h
ljmp rmcdhao
rmcdhaoe:
cjne a,#6,rmcdhaof ;5c內個數(shù)為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內個數(shù)為7是 進入提取速度信息流程
mov r2,#07h
mov r3,#0d9h ;小數(shù)點前數(shù)據放在7d9 7da內
mov r4,#7ch
lcall drmcdata
mov r2,#07h
mov r3,#0dbh ;小數(shù)點后數(shù)據放在7db內
mov r4,#7bh
lcall srmcdata
inc 78h
ljmp rmcdhao
rmcdhaog:
cjne a,#8,rmcdhaoh ;5c內個數(shù)為8是 進入提取方向信息流程
mov r2,#07h
mov r3,#0dch ;方向信息小數(shù)點前方在7dc 7dd內
mov r4,#7ch
lcall drmcdata
mov r2,#07h
mov r3,#0deh ;方向信息小數(shù)點后 放在7de內
mov r4,#7bh
lcall srmcdata
inc 78h
ljmp rmcdhao
rmcdhaoh:
cjne a,#9,gerroll ;5c內個數(shù)為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 + -