📄 ex.lst
字号:
A51 MACRO ASSEMBLER EX 03/21/2004 15:04:15 PAGE 1
MACRO ASSEMBLER A51 V7.08a
OBJECT MODULE PLACED IN Ex.OBJ
ASSEMBLER INVOKED BY: d:\Keil\C51\BIN\A51.EXE Ex.asm SET(SMALL) DEBUG EP
LOC OBJ LINE SOURCE
0097 1 SDA BIT P1.7 ;I2C总线定义
0096 2 SCL BIT P1.6
0090 3 RST BIT P1.0
00B2 4 KEY_INT BIT P3.2
0040 5 MTD EQU 40H ;发送数据缓冲器
0049 6 MRD EQU 49H ;接收数据缓冲区
7
8 ;定义器件地址,变
0070 9 ZLG7290 EQU 70H ;ZLG7290的器件地址
0010 10 ACK BIT 10H ;应答标志位
0050 11 SLA DATA 50H ;器件的从地址
0051 12 SUBA DATA 51H ;器件的子地址
0052 13 NUMBYTE DATA 52H ;读/写的字节数变量
14
8000 15 ORG 8000H
8000 028100 16 LJMP MAIN
8100 17 ORG 8100H
18
19 ;-------主程序如下:
8100 20 MAIN:
8100 758170 21 MOV SP,#70H
8103 C290 22 CLR RST
8105 128146 23 LCALL DELAY
8108 D290 24 SETB RST
810A 128146 25 LCALL DELAY
810D 26 MAINLOOP:
810D 30B202 27 JNB KEY_INT,KEY_HANDLE
8110 80FB 28 SJMP MAINLOOP
8112 29 KEY_HANDLE:
8112 755070 30 MOV SLA,#ZLG7290 ;指定器件地址
8115 755101 31 MOV SUBA,#01H ;指定子地址
8118 755201 32 MOV NUMBYTE,#01H ;发送2字节数据
811B 12826B 33 LCALL IRDNBYTE ;调用写2字节数据程序
811E 128146 34 LCALL DELAY
8121 7F08 35 MOV R7,#08H
8123 7460 36 MOV A,#60H
8125 37 HANDLELOOP:
38
8125 F540 39 MOV MTD,A
8127 C0E0 40 PUSH ACC
8129 8F30 41 MOV 30H,R7
812B 854941 42 MOV MTD+1,MRD
812E 755070 43 MOV SLA,#ZLG7290 ;指定器件地址
8131 755107 44 MOV SUBA,#07H ;指定子地址
8134 755202 45 MOV NUMBYTE,#02H ;发送2字节数据
8137 12823F 46 LCALL IWRNBYTE ;调用写2字节数据程序
47
813A 128146 48 LCALL DELAY
49 USING 2
813D AF30 50 MOV R7,30H
813F D0E0 51 POP ACC
8141 04 52 INC A
8142 DFE1 53 DJNZ R7,HANDLELOOP
8144 80C7 54 SJMP MAINLOOP
55
8146 56 DELAY:
8146 7F80 57 MOV R7,#80H
8148 DF01 58 MIN: DJNZ R7,YS500
A51 MACRO ASSEMBLER EX 03/21/2004 15:04:15 PAGE 2
814A 22 59 RET
814B 128151 60 YS500: LCALL YS500US
814E 028148 61 LJMP MIN
8151 7E80 62 YS500US:MOV R6,#80H
8153 DEFE 63 DJNZ R6,$
8155 22 64 RET
8156 7F20 65 DELAY1: MOV R7,#20H
8158 DFFE 66 DJNZ R7,$
815A 22 67 RET
68
69 ;$include (VI2C_ASM.INC) ;包含VIIC软件包
+1 70 ;------------------------------------------------------------------------------------------
--------------
+1 71 ; MCS-51单片机模拟I2C软件包(V1.1)
+1 72 ; 文件名:VI2C_ASM.INC
+1 73 ; 功能说明:本模拟I2C软件包包含了I2C操作的底层子程序,使用前要定义
+1 74 ;好SCL和SDA。在标准8051模式(12 Clock)下,对主频要求是不高于12MHz(即1个
+1 75 ;机器周期1us);若Fosc>12MHz则要增加相应的NOP指令数。(总线时序符合I2C标
+1 76 ;准模式,100Kbit/S)
+1 77 ; 版本说明:本版新增了两个子程序,IWRNBYTEEXT,IRDNBYTEEXT两个子程序,
+1 78 ;这两个子程序用于主从通讯上及一此特殊器件的读写操作较为方便.
+1 79 ; 更新时间:2002.06.04
+1 80 ;------------------------------------------------------------------------------------------
--------------
+1 81
+1 82 ;启动I2C总线子程序
815B D297 +1 83 START: SETB SDA
815D 00 +1 84 NOP
815E D296 +1 85 SETB SCL ;起始条件建立时间大于4.7us
8160 00 +1 86 NOP
8161 00 +1 87 NOP
8162 00 +1 88 NOP
8163 00 +1 89 NOP
8164 00 +1 90 NOP
8165 C297 +1 91 CLR SDA
8167 00 +1 92 NOP ;起始条件锁定时大于4us
8168 00 +1 93 NOP
8169 00 +1 94 NOP
816A 00 +1 95 NOP
816B 00 +1 96 NOP
816C C296 +1 97 CLR SCL ;钳住总线,准备发数据
816E 00 +1 98 NOP
816F 22 +1 99 RET
+1 100
+1 101 ;结束总线子程序
8170 C297 +1 102 STOP: CLR SDA
8172 00 +1 103 NOP
8173 D296 +1 104 SETB SCL ;发送结束条件的时钟信号
8175 00 +1 105 NOP ;结束总线时间大于4us
8176 00 +1 106 NOP
8177 00 +1 107 NOP
8178 00 +1 108 NOP
8179 00 +1 109 NOP
817A D297 +1 110 SETB SDA ;结束总线
817C 00 +1 111 NOP ;保证一个终止信号和起始信号的空闲时间大于4.
7us
817D 00 +1 112 NOP
817E 00 +1 113 NOP
817F 00 +1 114 NOP
8180 22 +1 115 RET
+1 116
+1 117 ;发送应答信号子程序
8181 C297 +1 118 MACK: CLR SDA ;将SDA置0
8183 00 +1 119 NOP
8184 00 +1 120 NOP
8185 D296 +1 121 SETB SCL
A51 MACRO ASSEMBLER EX 03/21/2004 15:04:15 PAGE 3
8187 00 +1 122 NOP ;保持数据时间,即SCL为高时间大于4.7us
8188 00 +1 123 NOP
8189 00 +1 124 NOP
818A 00 +1 125 NOP
818B 00 +1 126 NOP
818C C296 +1 127 CLR SCL
818E 00 +1 128 NOP
818F 00 +1 129 NOP
8190 22 +1 130 RET
+1 131
+1 132 ;发送非应答信号
8191 D297 +1 133 MNACK: SETB SDA ;将SDA置1
8193 00 +1 134 NOP
8194 00 +1 135 NOP
8195 D296 +1 136 SETB SCL
8197 00 +1 137 NOP
8198 00 +1 138 NOP ;保持数据时间,即SCL为高时间大于4.7us
8199 00 +1 139 NOP
819A 00 +1 140 NOP
819B 00 +1 141 NOP
819C C296 +1 142 CLR SCL
819E 00 +1 143 NOP
819F 00 +1 144 NOP
81A0 22 +1 145 RET
+1 146
+1 147 ;检查应答位子程序
+1 148 ;返回值,ACK=1时表示有应答
81A1 D297 +1 149 CACK: SETB SDA
81A3 00 +1 150 NOP
81A4 00 +1 151 NOP
81A5 D296 +1 152 SETB SCL
81A7 C210 +1 153 CLR ACK
81A9 00 +1 154 NOP
81AA 00 +1 155 NOP
81AB A297 +1 156 MOV C,SDA
81AD 4002 +1 157 JC CEND
81AF D210 +1 158 SETB ACK ;判断应答位
81B1 00 +1 159 CEND: NOP
81B2 C296 +1 160 CLR SCL
81B4 00 +1 161 NOP
81B5 22 +1 162 RET
+1 163
+1 164 ;发送字节子程序
+1 165 ;字节数据放入ACC
+1 166 ;每发送一字节要调用一次CACK子程序,取应答位
81B6 7808 +1 167 WRBYTE: MOV R0,#08H
81B8 33 +1 168 WLP: RLC A ;取数据位
81B9 4006 +1 169 JC WR1
81BB 8012 +1 170 SJMP WR0 ;判断数据位
81BD D8F9 +1 171 WLP1: DJNZ R0,WLP
81BF 00 +1 172 NOP
81C0 22 +1 173 RET
81C1 D297 +1 174 WR1: SETB SDA ;发送1
81C3 00 +1 175 NOP
81C4 D296 +1 176 SETB SCL
81C6 00 +1 177 NOP
81C7 00 +1 178 NOP
81C8 00 +1 179 NOP
81C9 00 +1 180 NOP
81CA 00 +1 181 NOP
+1 182
81CB C296 +1 183 CLR SCL
81CD 80EE +1 184 SJMP WLP1
81CF C297 +1 185 WR0: CLR SDA ;发送0
81D1 00 +1 186 NOP
81D2 D296 +1 187 SETB SCL
A51 MACRO ASSEMBLER EX 03/21/2004 15:04:15 PAGE 4
81D4 00 +1 188 NOP
81D5 00 +1 189 NOP
81D6 00 +1 190 NOP
81D7 00 +1 191 NOP
81D8 00 +1 192 NOP
+1 193
+1 194
81D9 C296 +1 195 CLR SCL
81DB 80E0 +1 196 SJMP WLP1
+1 197
+1 198 ;读取字节子程序
+1 199 ;读出的值在ACC
+1 200 ;每取一字节要发送一个应答/非应答信号
81DD 7808 +1 201 RDBYTE: MOV R0,#08H
81DF D297 +1 202 RLP: SETB SDA
81E1 00 +1 203 NOP
81E2 00 +1 204 NOP
81E3 00 +1 205 NOP
81E4 00 +1 206 NOP
81E5 D296 +1 207 SETB SCL ;时钟线为高,接收数据位
81E7 00 +1 208 NOP
81E8 00 +1 209 NOP
81E9 00 +1 210 NOP ;+1
81EA 00 +1 211 NOP ;+1
81EB 00 +1 212 NOP ;+1
81EC 00 +1 213 NOP ;+1
81ED 00 +1 214 NOP ;+1
+1 215
+1 216
81EE A297 +1 217 MOV C,SDA ;读取数据位
81F0 EA +1 218 MOV A,R2
81F1 C296 +1 219 CLR SCL ;将SCL拉低,时间大于4.7us
81F3 33 +1 220 RLC A ;进行数据位的处理
81F4 FA +1 221 MOV R2,A
81F5 00 +1 222 NOP
81F6 00 +1 223 NOP
81F7 00 +1 224 NOP
81F8 00 +1 225 NOP ;+1
81F9 00 +1 226 NOP ;+1
81FA 00 +1 227 NOP ;+1
81FB 00 +1 228 NOP
81FC 00 +1 229 NOP
81FD 00 +1 230 NOP ;+1
81FE 00 +1 231 NOP
81FF 00 +1 232 NOP ;+1
8200 00 +1 233 NOP ;+1
+1 234
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -