📄 gps.asm
字号:
;=====================================================================================================
;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 + -