📄 gps.lst
字号:
A51 MACRO ASSEMBLER GPS 06/23/2007 11:02:10 PAGE 1
MACRO ASSEMBLER A51 V7.10
OBJECT MODULE PLACED IN GPS.OBJ
ASSEMBLER INVOKED BY: C:\Keil\C51\BIN\A51.EXE GPS.asm SET(SMALL) DEBUG EP
LOC OBJ LINE SOURCE
00B5 1 RS EQU P3.5
00B6 2 RW EQU P3.6
00B7 3 E EQU P3.7
4
0000 5 ORG 0000H
0000 8023 6 JMP START ; 程序开始
0023 7 ORG 0023H
0023 21D3 8 JMP Serial_RX_ISR ; 串口中断向量
9
0025 10 START:
0025 758160 11 MOV SP,#60H ; 设置堆栈
0028 120057 12 LCALL Init ; 进行有关的初始化
13
002B 7920 14 MOV R1,#20H ; 初始化内存空间
002D 7A30 15 MOV R2,#30H
002F 16 CLR_CYC:
002F 7700 17 MOV @R1,#0
0031 DAFC 18 DJNZ R2,CLR_CYC
19
0033 7C00 20 MOV R4,#0
0035 D200 21 SETB 20H.0 ; 将GPS工作状态位设为1,表示正在搜索中
0037 120186 22 LCALL LCD_INIT ; 刷新启动进行LCD
23
003A 24 MAIN:
003A A200 25 MOV C,20H.0
003C 4011 26 JC WAIT ; 20H.0 为 1时,进入等待
003E 120070 27 LCALL COUNT_NS ; 计算纬度
0041 1200CB 28 LCALL COUNT_EW ; 计算经度
0044 120124 29 LCALL DISPLAY_NS ; 显示纬度
0047 12014D 30 LCALL DISPLAY_EW ; 显示经度
004A 1201CA 31 LCALL DELAY1 ; 延时
004D 80EB 32 JMP MAIN
004F 33 WAIT:
004F 120174 34 LCALL DISPLAY_SEARCH ; 显示搜索状态
0052 1201CA 35 LCALL DELAY1 ; 延时
0055 80E3 36 JMP MAIN
37
0057 38 Init:
39 ;---------------------------------
40 ; 程序初始化,包括串口、定时器T1、中断的初始化
41 ;---------------------------------
0057 759890 42 MOV SCON,#10010000B ; 串口控制寄存器初始化
005A 438780 43 ORL PCON,#10000000B ; 把SMOD位置1
005D D2AF 44 SETB EA ; 中断允许总控制位使能
005F D2AC 45 SETB ES ; 串口中断使能
0061 D2BC 46 SETB PS ; 把串口中断设为高优先级
0063 1166 47 CALL Timer1_Init ; 进行定时器T1的初始化
0065 22 48 RET
0066 49 Timer1_Init:
50 ;-------------------------
51 ; 定时器T1作为串口的波特率发生器
52 ; (2^SMOD)*fosc/32*12*(256-th1)=9600
53 ;-------------------------
0066 758920 54 MOV TMOD,#00100000B ; 定时器T1工作在方式2
0069 758840 55 MOV TCON,#01000000B ; 定时器T1使能
006C 758DFA 56 MOV TH1,#0FAH ; 设定定时器T1的初始值
006F 22 57 RET
58
A51 MACRO ASSEMBLER GPS 06/23/2007 11:02:10 PAGE 2
0070 59 COUNT_NS:
60 ;----------------------------------
61 ;- 计算纬度的值,并将纬度的十位,个位,十分位分别放入相应的内存空间
62 ;----------------------------------
0070 E537 63 MOV A,55 ; 读取纬度的最高位数据
0072 5480 64 ANL A,#80H ; 测试符号位,1为北纬,0为南纬
0074 600E 65 JZ S ; 跳到南纬的处理
0076 900245 66 MOV DPTR,#TABLE2
0079 7400 67 MOV A,#0
007B 93 68 MOVC A,@A+DPTR
007C F53D 69 MOV 61,A ; 将N所对应的代码写进内存61
70
007E E537 71 MOV A,55
0080 557F 72 ANL A,7FH ; 去掉最高位
0082 800A 73 JMP NEXT
74
0084 75 S:
0084 900245 76 MOV DPTR,#TABLE2
0087 7401 77 MOV A,#1
0089 93 78 MOVC A,@A+DPTR
008A F53D 79 MOV 61,A ; 将S对应的代码写进内存61
008C E537 80 MOV A,55
008E 81 NEXT:
008E 75F05A 82 MOV B,#90
0091 A4 83 MUL AB ; 最高字节乘以90
0092 85F025 84 MOV 37,B ; 结果的高位存在内存37
0095 F526 85 MOV 38,A ; 结果的低位存在内存38
86
0097 E538 87 MOV A,56 ; 读取次高字节
0099 75F05A 88 MOV B,#90
009C A4 89 MUL AB ; 次高字节乘以90
009D E526 90 MOV A,38 ; 读取纬度高字节乘以90所得结果的低字节
009F 35F0 91 ADDC A,B ; 用纬度次高字节乘以90所得结果的高字节修正上述数据
00A1 500A 92 JNC NEXT1
00A3 8525F0 93 MOV B,37 ; 读取纬度高字节乘以90所得结果的高字节
00A6 05F0 94 INC B ; 修正上述数据
00A8 85F025 95 MOV 37,B ; 纬度计算结果高位存在37
00AB F526 96 MOV 38,A ; 纬度计算结果低位存在38
00AD 97 NEXT1:
98 ; 处理整数部分,将整数的十位部分和个位部分分别储存
00AD 33 99 RLC A ; 将低位的最高位左移到C中
00AE E525 100 MOV A,37 ; 处理高位
00B0 23 101 RL A ; 高位乘2
00B1 3400 102 ADDC A,#0 ; 加上低位的最高位,这就是纬度的整数部分
103
00B3 75F00A 104 MOV B,#10
00B6 84 105 DIV AB ; 整数部分除以10,得到十位部分和个位部分
00B7 F53E 106 MOV 62,A ; 十位部分
00B9 85F03F 107 MOV 63,B ; 个位部分
108 ; 以下处理小数部分
00BC E526 109 MOV A,38 ; 读入纬度的低字节部分
00BE 547F 110 ANL A,#7FH ; 去掉最高位得到小数部分
00C0 75F00A 111 MOV B,#10 ; 小数部分乘以10
00C3 A4 112 MUL AB
00C4 33 113 RLC A ; 以下将小数部分乘以10的结果除以2^7,去商作为第一位小数
00C5 E5F0 114 MOV A,B
00C7 33 115 RLC A
00C8 F540 116 MOV 64,A
00CA 22 117 RET
118
00CB 119 COUNT_EW:
120 ;----------------------------------
121 ;- 计算经度的值,并将经度的十位,个位,十分位分别放入相应的内存空间
122 ;----------------------------------
00CB E53B 123 MOV A,59 ; 读取经度的最高位数据
00CD 5480 124 ANL A,#80H ; 测试符号位,1为西经,0为东经
A51 MACRO ASSEMBLER GPS 06/23/2007 11:02:10 PAGE 3
00CF 600C 125 JZ EAST ; 跳到东经的处理
00D1 900245 126 MOV DPTR,#TABLE2
00D4 7403 127 MOV A,#3
00D6 93 128 MOVC A,@A+DPTR
00D7 F541 129 MOV 65,A ; 将W所对应的代码写进内存61
130
00D9 E537 131 MOV A,55
00DB 557F 132 ANL A,7FH ; 去掉最高位
00DD 133 EAST:
00DD 900245 134 MOV DPTR,#TABLE2
00E0 7402 135 MOV A,#2
00E2 93 136 MOVC A,@A+DPTR
00E3 F541 137 MOV 65,A ; 将E对应的代码写进内存65
00E5 E537 138 MOV A,55
00E7 139 NEXT2:
00E7 75F0B4 140 MOV B,#180
00EA A4 141 MUL AB ; 最高字节乘以180
00EB 85F027 142 MOV 39,B ; 结果的高位存在内存39
00EE F528 143 MOV 40,A ; 结果的低位存在内存40
144
00F0 E53C 145 MOV A,60 ; 读取次高字节
00F2 75F0B4 146 MOV B,#180
00F5 A4 147 MUL AB ; 次高字节乘以180
00F6 E528 148 MOV A,40 ; 读取经度度高字节乘以180所得结果的低字节
00F8 35F0 149 ADDC A,B ; 用经度次高字节乘以180所得结果的高字节修正上述数据
00FA 500A 150 JNC NEXT3
00FC 8527F0 151 MOV B,39 ; 读取经度高字节乘以180所得结果的高字节
00FF 05F0 152 INC B ; 修正上述数据
0101 85F027 153 MOV 39,B ; 经度计算结果高位存在39
0104 F528 154 MOV 40,A ; 经度计算结果低位存在40
0106 155 NEXT3:
156 ; 处理整数部分,将整数的十位部分和个位部分分别储存
0106 33 157 RLC A ; 将低位的最高位左移到C中
0107 E525 158 MOV A,37 ; 处理高位
0109 23 159 RL A ; 高位乘2
010A 3400 160 ADDC A,#0 ; 加上低位的最高位,这就是经度的整数部分
161
010C 75F00A 162 MOV B,#10
010F 84 163 DIV AB ; 整数部分除以10,得到十位部分和个位部分
0110 F542 164 MOV 66,A ; 十位部分
0112 85F043 165 MOV 67,B ; 个位部分
166 ; 以下处理小数部分
0115 E528 167 MOV A,40 ; 读入经度度的低字节部分
0117 547F 168 ANL A,#7FH ; 去掉最高位得到小数部分
0119 75F00A 169 MOV B,#10 ; 小数部分乘以10
011C A4 170 MUL AB
011D 33 171 RLC A ; 以下将小数部分乘以10的结果除以2^7,取商作为第一位小数
011E E5F0 172 MOV A,B
0120 33 173 RLC A
0121 F544 174 MOV 68,A
175
0123 22 176 RET
0124 177 DISPLAY_NS:
178 ;------------------
179 ;- 显示纬度
180 ;------------------
0124 3186 181 CALL LCD_INIT
0126 759080 182 MOV P1,#80H ; 显示位置
0129 319E 183 ACALL ENABLE ; 传送命令
012B 759001 184 MOV P1,#01H
012E 319E 185 CALL ENABLE
186
0130 783D 187 MOV R0,#61 ; 显示N或S
0132 E6 188 MOV A,@R0
0133 31B4 189 CALL WRITE2
0135 08 190 INC R0
A51 MACRO ASSEMBLER GPS 06/23/2007 11:02:10 PAGE 4
0136 90023B 191 MOV DPTR,#TABLE1
192
0139 E6 193 MOV A,@R0 ; 显示纬度的十位
013A 93 194 MOVC A,@A+DPTR
013B 31B4 195 CALL WRITE2
013D 08 196 INC R0
197
013E E6 198 MOV A,@R0 ; 显示纬度的个位
013F 93 199 MOVC A,@A+DPTR
0140 31B4 200 CALL WRITE2
0142 08 201 INC R0
202
0143 742E 203 MOV A,#2EH ; 显示小数点 .
0145 31B4 204 CALL WRITE2
0147 08 205 INC R0
206
0148 E6 207 MOV A,@R0 ; 显示纬度的十分位
0149 93 208 MOVC A,@A+DPTR
014A 31B4 209 CALL WRITE2
210
014C 22 211 RET
014D 212 DISPLAY_EW:
213 ;------------------
214 ;- 显示经度
215 ;------------------
014D 759080 216 MOV P1,#80H ; 显示位置
0150 319E 217 ACALL ENABLE
0152 7590C0 218 MOV P1,#0C0H ; 写入显示起始地址(第二行第一个位置)
0155 319E 219 CALL ENABLE ; 调用写入命令子程序
220
0157 7841 221 MOV R0,#65 ; 显示E或W
0159 E6 222 MOV A,@R0
015A 31B4 223 CALL WRITE2
015C 08 224 INC R0
015D 90023B 225 MOV DPTR,#TABLE1
226
0160 E6 227 MOV A,@R0 ; 显示经度的十位
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -