📄 ex.lst
字号:
A51 MACRO ASSEMBLER EX 03/21/2004 15:04:34 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
0040 3 MTD EQU 40H ;发送数据缓冲器
0049 4 MRD EQU 49H ;接收数据缓冲区
5
6 ;定义器件地址,变
00A2 7 PCF8563 EQU 0A2H ;ZLG7290的器件地址
0010 8 ACK BIT 10H ;应答标志位
0050 9 SLA DATA 50H ;器件的从地址
0051 10 SUBA DATA 51H ;器件的子地址
0052 11 NUMBYTE DATA 52H ;读/写的字节数变量
12
8000 13 ORG 8000H
8000 028100 14 LJMP MAIN
8100 15 ORG 8100H
16
17 ;-------主程序如下:
8100 18 MAIN:
8100 758170 19 MOV SP,#70H
8103 128135 20 LCALL DELAY
21
8106 754000 22 MOV MTD,#00H
8109 754112 23 MOV MTD+1,#12H
810C 754200 24 MOV MTD+2,#00H
810F 754330 25 MOV MTD+3,#30H
8112 754412 26 MOV MTD+4,#12H
8115 7550A2 27 MOV SLA,#PCF8563 ;指定器件地址
8118 755100 28 MOV SUBA,#00H ;指定子地址
811B 755205 29 MOV NUMBYTE,#05H ;发送2字节数据
811E 12822E 30 LCALL IWRNBYTE ;调用写2字节数据程序
31
8121 128135 32 LCALL DELAY
8124 33 MAINLOOP:
8124 7550A2 34 MOV SLA,#PCF8563 ;指定器件地址
8127 755102 35 MOV SUBA,#02H ;指定子地址
812A 755203 36 MOV NUMBYTE,#03H ;发送2字节数据
812D 12825A 37 LCALL IRDNBYTE ;调用写2字节数据程序
8130 128135 38 LCALL DELAY
8133 80EF 39 SJMP MAINLOOP
40
8135 41 DELAY:
8135 7F00 42 MOV R7,#00H
8137 DF01 43 MIN: DJNZ R7,YS500
8139 22 44 RET
813A 128140 45 YS500: LCALL YS500US
813D 028137 46 LJMP MIN
8140 7E00 47 YS500US:MOV R6,#00H
8142 DEFE 48 DJNZ R6,$
8144 22 49 RET
8145 7F20 50 DELAY1: MOV R7,#20H
8147 DFFE 51 DJNZ R7,$
8149 22 52 RET
53
54 ;$include (VI2C_ASM.INC) ;包含VIIC软件包
+1 55 ;------------------------------------------------------------------------------------------
--------------
+1 56 ; MCS-51单片机模拟I2C软件包(V1.1)
+1 57 ; 文件名:VI2C_ASM.INC
A51 MACRO ASSEMBLER EX 03/21/2004 15:04:34 PAGE 2
+1 58 ; 功能说明:本模拟I2C软件包包含了I2C操作的底层子程序,使用前要定义
+1 59 ;好SCL和SDA。在标准8051模式(12 Clock)下,对主频要求是不高于12MHz(即1个
+1 60 ;机器周期1us);若Fosc>12MHz则要增加相应的NOP指令数。(总线时序符合I2C标
+1 61 ;准模式,100Kbit/S)
+1 62 ; 版本说明:本版新增了两个子程序,IWRNBYTEEXT,IRDNBYTEEXT两个子程序,
+1 63 ;这两个子程序用于主从通讯上及一此特殊器件的读写操作较为方便.
+1 64 ; 更新时间:2002.06.04
+1 65 ;------------------------------------------------------------------------------------------
--------------
+1 66
+1 67 ;启动I2C总线子程序
814A D297 +1 68 START: SETB SDA
814C 00 +1 69 NOP
814D D296 +1 70 SETB SCL ;起始条件建立时间大于4.7us
814F 00 +1 71 NOP
8150 00 +1 72 NOP
8151 00 +1 73 NOP
8152 00 +1 74 NOP
8153 00 +1 75 NOP
8154 C297 +1 76 CLR SDA
8156 00 +1 77 NOP ;起始条件锁定时大于4us
8157 00 +1 78 NOP
8158 00 +1 79 NOP
8159 00 +1 80 NOP
815A 00 +1 81 NOP
815B C296 +1 82 CLR SCL ;钳住总线,准备发数据
815D 00 +1 83 NOP
815E 22 +1 84 RET
+1 85
+1 86 ;结束总线子程序
815F C297 +1 87 STOP: CLR SDA
8161 00 +1 88 NOP
8162 D296 +1 89 SETB SCL ;发送结束条件的时钟信号
8164 00 +1 90 NOP ;结束总线时间大于4us
8165 00 +1 91 NOP
8166 00 +1 92 NOP
8167 00 +1 93 NOP
8168 00 +1 94 NOP
8169 D297 +1 95 SETB SDA ;结束总线
816B 00 +1 96 NOP ;保证一个终止信号和起始信号的空闲时间大于4.
7us
816C 00 +1 97 NOP
816D 00 +1 98 NOP
816E 00 +1 99 NOP
816F 22 +1 100 RET
+1 101
+1 102 ;发送应答信号子程序
8170 C297 +1 103 MACK: CLR SDA ;将SDA置0
8172 00 +1 104 NOP
8173 00 +1 105 NOP
8174 D296 +1 106 SETB SCL
8176 00 +1 107 NOP ;保持数据时间,即SCL为高时间大于4.7us
8177 00 +1 108 NOP
8178 00 +1 109 NOP
8179 00 +1 110 NOP
817A 00 +1 111 NOP
817B C296 +1 112 CLR SCL
817D 00 +1 113 NOP
817E 00 +1 114 NOP
817F 22 +1 115 RET
+1 116
+1 117 ;发送非应答信号
8180 D297 +1 118 MNACK: SETB SDA ;将SDA置1
8182 00 +1 119 NOP
8183 00 +1 120 NOP
8184 D296 +1 121 SETB SCL
A51 MACRO ASSEMBLER EX 03/21/2004 15:04:34 PAGE 3
8186 00 +1 122 NOP
8187 00 +1 123 NOP ;保持数据时间,即SCL为高时间大于4.7us
8188 00 +1 124 NOP
8189 00 +1 125 NOP
818A 00 +1 126 NOP
818B C296 +1 127 CLR SCL
818D 00 +1 128 NOP
818E 00 +1 129 NOP
818F 22 +1 130 RET
+1 131
+1 132 ;检查应答位子程序
+1 133 ;返回值,ACK=1时表示有应答
8190 D297 +1 134 CACK: SETB SDA
8192 00 +1 135 NOP
8193 00 +1 136 NOP
8194 D296 +1 137 SETB SCL
8196 C210 +1 138 CLR ACK
8198 00 +1 139 NOP
8199 00 +1 140 NOP
819A A297 +1 141 MOV C,SDA
819C 4002 +1 142 JC CEND
819E D210 +1 143 SETB ACK ;判断应答位
81A0 00 +1 144 CEND: NOP
81A1 C296 +1 145 CLR SCL
81A3 00 +1 146 NOP
81A4 22 +1 147 RET
+1 148
+1 149 ;发送字节子程序
+1 150 ;字节数据放入ACC
+1 151 ;每发送一字节要调用一次CACK子程序,取应答位
81A5 7808 +1 152 WRBYTE: MOV R0,#08H
81A7 33 +1 153 WLP: RLC A ;取数据位
81A8 4006 +1 154 JC WR1
81AA 8012 +1 155 SJMP WR0 ;判断数据位
81AC D8F9 +1 156 WLP1: DJNZ R0,WLP
81AE 00 +1 157 NOP
81AF 22 +1 158 RET
81B0 D297 +1 159 WR1: SETB SDA ;发送1
81B2 00 +1 160 NOP
81B3 D296 +1 161 SETB SCL
81B5 00 +1 162 NOP
81B6 00 +1 163 NOP
81B7 00 +1 164 NOP
81B8 00 +1 165 NOP
81B9 00 +1 166 NOP
+1 167
81BA C296 +1 168 CLR SCL
81BC 80EE +1 169 SJMP WLP1
81BE C297 +1 170 WR0: CLR SDA ;发送0
81C0 00 +1 171 NOP
81C1 D296 +1 172 SETB SCL
81C3 00 +1 173 NOP
81C4 00 +1 174 NOP
81C5 00 +1 175 NOP
81C6 00 +1 176 NOP
81C7 00 +1 177 NOP
+1 178
+1 179
81C8 C296 +1 180 CLR SCL
81CA 80E0 +1 181 SJMP WLP1
+1 182
+1 183 ;读取字节子程序
+1 184 ;读出的值在ACC
+1 185 ;每取一字节要发送一个应答/非应答信号
81CC 7808 +1 186 RDBYTE: MOV R0,#08H
81CE D297 +1 187 RLP: SETB SDA
A51 MACRO ASSEMBLER EX 03/21/2004 15:04:34 PAGE 4
81D0 00 +1 188 NOP
81D1 00 +1 189 NOP
81D2 00 +1 190 NOP
81D3 00 +1 191 NOP
81D4 D296 +1 192 SETB SCL ;时钟线为高,接收数据位
81D6 00 +1 193 NOP
81D7 00 +1 194 NOP
81D8 00 +1 195 NOP ;+1
81D9 00 +1 196 NOP ;+1
81DA 00 +1 197 NOP ;+1
81DB 00 +1 198 NOP ;+1
81DC 00 +1 199 NOP ;+1
+1 200
+1 201
81DD A297 +1 202 MOV C,SDA ;读取数据位
81DF EA +1 203 MOV A,R2
81E0 C296 +1 204 CLR SCL ;将SCL拉低,时间大于4.7us
81E2 33 +1 205 RLC A ;进行数据位的处理
81E3 FA +1 206 MOV R2,A
81E4 00 +1 207 NOP
81E5 00 +1 208 NOP
81E6 00 +1 209 NOP
81E7 00 +1 210 NOP ;+1
81E8 00 +1 211 NOP ;+1
81E9 00 +1 212 NOP ;+1
81EA 00 +1 213 NOP
81EB 00 +1 214 NOP
81EC 00 +1 215 NOP ;+1
81ED 00 +1 216 NOP
81EE 00 +1 217 NOP ;+1
81EF 00 +1 218 NOP ;+1
+1 219
+1 220
81F0 D8DC +1 221 DJNZ R0,RLP ;未够8位,再来一次
81F2 22 +1 222 RET
+1 223
+1 224
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -