📄 hospital.lst
字号:
A51 MACRO ASSEMBLER HOSPITAL 02/12/00 17:23:19 PAGE 1
DOS MACRO ASSEMBLER A51 X4.86
OBJECT MODULE PLACED IN HOSPITAL.OBJ
ASSEMBLER INVOKED BY: C:\MEDWIN\762\A51.EXE HOSPITAL.ASM DB
LOC OBJ LINE SOURCE
1 ;***********************************************************************
2 ;医院寻呼,无线发射部分
3 ;全部在键盘唤醒中断里完成
4 ;
5 ;***********************************************************************
6 ; I/O PORT PIN DEFINED
7
0081 8 KEY1 BIT P0.1 ;暂定为4个按键
0082 9 KEY2 BIT P0.2
0083 10 KEY3 BIT P0.3
0084 11 KEY4 BIT P0.4
0080 12 LED BIT P0.0 ;按键按下,LED亮
13
0086 14 CS_93C BIT P0.6
0087 15 SK_93C BIT P0.7
0090 16 DI_93C BIT P1.0
0091 17 DO_93C BIT P1.1
18
0085 19 DATAOUT BIT P0.5 ;数据输出
20
21
22 ;=================== PHILIPS PLC SFR DEFINED BEGAIN =======================
0087 23 HPCON DATA 087H
24 ;PD bit 087h.1 ;不能位寻址
00A2 25 AUXR1 EQU 0A2h ; 附助功能寄存器
26 ;KBF BIT AUXR1.7
00AC 27 CMP1 EQU 0ACh ; 比较器 1 控制 寄存器
00AD 28 CMP2 EQU 0ADh ; 比较器 2 控制 寄存器
0095 29 DIVM EQU 095h ; cpu 时钟 控制
00C8 30 I2CFG EQU 0C8h ; I2C 设置寄存器
00C8 31 CT0 bit I2CFG.0 ; 时钟选择0
00C9 32 CT1 bit I2CFG.1 ; 时钟选择1
00CC 33 TIRUN bit I2CFG.4 ; 计时器 I 使能位
00CD 34 CLRTI bit I2CFG.5 ; 清除计时器I
00CE 35 MASTRQ bit I2CFG.6 ; 主控器请求
00CF 36 SLAVEN bit I2CFG.7 ; 被控器使能
00D8 37 I2CON EQU 0D8h ; I2C 控制寄存器
00D9 38 MASTER bit I2CON.1 ; 主控器状态位
00DA 39 STP bit I2CON.2 ; 停止探测标志
00DB 40 STR bit I2CON.3 ; 开始探测标志
00DC 41 ARL bit I2CON.4 ; 仲裁失败标志
00DD 42 DRDY bit I2CON.5 ; 数据准备标志位
00DE 43 ATN bit I2CON.6 ; 注意: I2C 中断标志位
00DF 44 RDAT bit I2CON.7 ; I2C 读数据
00D9 45 I2DAT EQU 0D9h ; I2C 数据寄存器
00A8 46 IEN0 EQU 0A8h ; 中断使能0
00A9 47 ETO BIT IEN0.1 ;定时器0中断使能
00AD 48 EBO bit IEN0.5 ; 节电方式中断使能
00AE 49 EWD bit IEN0.6 ; 看门狗中断使能
50
00E8 51 IEN1 EQU 0E8h ; 中断使能寄存器 1
00E8 52 EI2 bit IEN1.0 ; I2C 中断使能
00E9 53 EKB bit IEN1.1 ; 键盘中断使能
00EA 54 EC2 bit IEN1.2 ; 比较器 2 中断使能
00ED 55 EC1 bit IEN1.5 ; 比较器 1 中断使能
00EF 56 ETI bit IEN1.7 ; 计时器 I 中断使能
00B8 57 IP0 EQU 0B8h ; 中断优先 0 低位
00BD 58 PBO bit IP0.5 ; 节电方式中断优先
A51 MACRO ASSEMBLER HOSPITAL 02/12/00 17:23:19 PAGE 2
0086 59 KBI EQU 86h ; 键盘中断
0080 60 CMP2O bit P0.0 ; 比较器2 输出
0081 61 CIN2B bit P0.1 ; 比较器2 输入B
0082 62 CIN2A bit P0.2 ; 比较器2 输入A
00F6 63 PT0AD EQU 0F6H ;0口数字输入禁能
0084 64 P0M1 EQU 84H
0085 65 P0M2 EQU 85H
0091 66 P1M1 EQU 91H
0092 67 P1M2 EQU 92H
68
69
70
71 ;***********************************************************************
72 ; 自己使用的RAM的定义
73
0000 74 SEND_FINISH BIT 00H ;发送完成标志位。=1,还未完成。20H.1
75
0031 76 KEY_VALUE EQU 31H ;按键值,2BIT
0032 77 TIME_ADD EQU 32H ;地址是10BTI
0033 78 TIME_CD_NUM EQU 33H ;自身地址是8位,两次都是。
0034 79 TIMERS EQU 34H ;一共10次
0035 80 SENDING_DATA EQU 35H
0036 81 TIME_REP EQU 36H ;在发送0、1的子程序里使用,6BIT
82
0037 83 ADD_93C_L EQU 37H
0038 84 BYTE1_93C EQU 38H
0039 85 BYTE2_93C EQU 39H
86
0040 87 SEND_BUFFER1 EQU 40H ;要发送的数据暂存区
0042 88 DATA1 EQU 42H
0043 89 DATA2 EQU 43H
90
91
92
93
94 ;***********************************************************************
0000 95 ORG 0000H
0000 0150 96 AJMP SYS_START
97
0003 98 ORG 0003H ; INT0外部中断0
0003 C2A8 99 CLR EX0
0005 32 100 RETI
0006 00 101 NOP
0007 00 102 NOP
103
104
000B 105 ORG 000BH ; TIME0 OUT定时0中断
000B C2A9 106 CLR ET0
000D 32 107 RETI
000E 00 108 NOP
000F 00 109 NOP
110
0013 111 ORG 0013H ; INT1外部中断1
0013 C2AA 112 CLR EX1
0015 32 113 RETI
0016 00 114 NOP
0017 00 115 NOP
116
001B 117 ORG 001BH ; TIME1 OUT定时1中断
001B C2AB 118 CLR ET1
001D 32 119 RETI
001E 00 120 NOP
001F 00 121 NOP
0020 00 122 NOP
123
0023 124 ORG 0023H ; COM I/O串口中断
A51 MACRO ASSEMBLER HOSPITAL 02/12/00 17:23:19 PAGE 3
0023 C2AC 125 CLR ES
0025 32 126 RETI
0026 00 127 NOP
0027 00 128 NOP
129
002B 130 ORG 002BH ;TIME2 OUT 降压检测中断
002B C2AD 131 CLR IEN0.5
002D 32 132 RETI
002E 00 133 NOP
002F 00 134 NOP
135
0033 136 ORG 0033H ;I2C中断
0033 C2E8 137 CLR IEN1.0
0035 32 138 RETI
0036 00 139 NOP
0037 00 140 NOP
141
003B 142 ORG 003BH ;键盘中断
003B C2E9 143 CLR IEN1.1
003D 016F 144 AJMP KEYINT
003F 00 145 NOP
0040 00 146 NOP
147
0043 148 ORG 0043H ;比较器2中断
0043 C2EA 149 CLR IEN1.2
0045 32 150 RETI
0046 00 151 NOP
0047 00 152 NOP
153
0053 154 ORG 0053H ; WDT TIMER OUT
0053 C2AE 155 CLR IEN0.6
0055 32 156 RETI
0056 00 157 NOP
0057 00 158 NOP
159
0063 160 ORG 0063H ;比较器1中断
0063 C2ED 161 CLR IEN1.5
0065 32 162 RETI
163
164 ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
0050 165 ORG 050H
0050 166 SYS_START:
167 ;MOV PT0AD,#00H ;P0作为I/O,不使用比较器
0050 758400 168 MOV P0M1,#00H ; P0 准双向口
0053 758541 169 MOV P0M2,#041H ;P0.0驱动LED,P0.6时93C46的CS,所以选择上拉。
170
0056 759101 171 MOV P1M1,#01H ;P1.0是93C46的DI,选择仅为输入
0059 759202 172 MOV P1M2,#02H ;P1.1是93C46的DO,选择上拉
173
005C 43A250 174 ORL AUXR1,#50H ;禁止掉电检测,并关掉EPROM部分模拟电路
175
005F C2AE 176 CLR EWD ;关掉看门狗
177
178
0061 D2AF 179 SETB EA
0063 75861E 180 MOV KBI,#01EH ;4个按键中断
0066 D2E9 181 SETB EKB ;最后是使能键盘中断
182
0068 C200 183 CLR SEND_FINISH
006A 184 MAIN:
006A 2000FD 185 JB SEND_FINISH,MAIN ;循环等待所有的完成,然后进入休眠状态
186 ;ORL HPCON,#02H ;PD=1,进入低功耗模式
187
006D 016A 188 AJMP MAIN
189
190
A51 MACRO ASSEMBLER HOSPITAL 02/12/00 17:23:19 PAGE 4
191
192 ;*****************************************************************
193 ;键盘中断处理程序
194 ;*****************************************************************
006F 195 KEYINT:
006F C0D0 196 PUSH PSW
0071 00 197 NOP ;奇怪的是:没有这两个NOP,AUXR1和7FH与的值不变
0072 00 198 NOP
0073 53A27F 199 ANL AUXR1,#07FH ;CLEAR KBF
0076 C2E9 200 CLR EKB ;禁止键盘中断
201
202
0078 208107 203 JB P0.1,KY2
007B 5151 204 ACALL DELAY10MS
007D 208120 205 JB P0.1,NOKEY
0080 01AA 206 AJMP KEY1_IN
0082 207 KY2:
0082 208207 208 JB P0.2,KY3
0085 5151 209 ACALL DELAY10MS
0087 208216 210 JB P0.2,NOKEY
008A 01B0 211 AJMP KEY2_IN
008C 212 KY3:
008C 208307 213 JB P0.3,KY4
008F 5151 214 ACALL DELAY10MS
0091 20830C 215 JB P0.3,NOKEY
0094 01B6 216 AJMP KEY3_IN
0096 217 KY4:
0096 208407 218 JB P0.4,NOKEY
0099 5151 219 ACALL DELAY10MS
009B 208402 220 JB P0.4,NOKEY
009E 01BB 221 AJMP KEY4_IN
222
223
00A0 224 NOKEY:
00A0 D2E9 225 SETB EKB
00A2 C200 226 CLR SEND_FINISH
00A4 53A27F 227 ANL AUXR1,#07FH ;CLEAR KBF中断开始清0了一次,此处仍要清0,奇怪!
00A7 D0D0 228 POP PSW
00A9 32 229 RETI
230
231
00AA 232 KEY1_IN:
00AA 00 233 NOP
00AB 753100 234 MOV KEY_VALUE,#00H ;用2个BYTE来表示4个按键
00AE 01BE 235 AJMP KEY_FINISH
00B0 236 KEY2_IN:
00B0 00 237 NOP
00B1 753101 238 MOV KEY_VALUE,#01H
00B4 01BE 239 AJMP KEY_FINISH
00B6 240 KEY3_IN:
00B6 753102 241 MOV KEY_VALUE,#02H
00B9 01BE 242 AJMP KEY_FINISH
00BB 243 KEY4_IN:
00BB 753103 244 MOV KEY_VALUE,#03H
245
246
00BE 247 KEY_FINISH: ;问题在于唤醒省电模式之前的指令是如何运行的?
00BE D280 248 SETB LED
249
00C0 5387FD 250 ANL HPCON,#0FDH ;PD=0唤醒省电模式
00C3 C2E9 251 CLR EKB ;UNABLE THE KEY INTERUPTER
252 ;*******************************************************************
253 ;93C46里首先是2BYTE的地址,A1-A10,后的6BIT用0补。
254 ;第3个BYTE是自身地址前8BIT,第4个BYTE的高位是自身地址后4位,低位是KEY-VALUE
255 ;********************************************************************
00C5 753700 256 MOV ADD_93C_L,#00H ;首先读10BIT(2BYTE)的ADDRESS
A51 MACRO ASSEMBLER HOSPITAL 02/12/00 17:23:19 PAGE 5
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -