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