📄 24cxx.lst
字号:
A51 MACRO ASSEMBLER 24CXX 09/16/2006 15:07:00 PAGE 1
MACRO ASSEMBLER A51 V7.08a
OBJECT MODULE PLACED IN 24CXX.OBJ
ASSEMBLER INVOKED BY: D:\Keil\C51\BIN\A51.EXE 24CXX.ASM SET(SMALL) DEBUG EP
LOC OBJ LINE SOURCE
0094 1 SDA BIT P1.4 ;I2C总线定义
00B7 2 SCL BIT P3.7
0040 3 MTD EQU 40H ;写数据缓冲器
0049 4 MRD EQU 49H ;读数据缓冲区
5
6 ;-------;定义器件地址,
00A0 7 CSI24WC02 EQU 0A0H ;器件地址
0010 8 ACK BIT 10H ;应答标志位
0050 9 SLA DATA 50H ;器件的从地址
0051 10 SUBA DATA 51H ;器件的子地址
0052 11 NUMBYTE DATA 52H ;读/写的字节数变量
12
0000 13 ORG 0000H
0000 020100 14 LJMP MAIN
0100 15 ORG 0100H
16
17 ;-------主程序如下:
0100 18 MAIN:
0100 758170 19 MOV SP,#70H
0103 12012C 20 LCALL DELAY
21
0106 754015 22 MOV MTD,#15H
0109 75418A 23 MOV MTD+1,#8AH
010C 7550A0 24 MOV SLA,#CSI24WC02 ;指定器件地址
010F 755100 25 MOV SUBA,#00H ;指定子地址
0112 755202 26 MOV NUMBYTE,#02H ;写2字节数据
0115 120225 27 LCALL IWRNBYTE ;调用写2字节数据程序
28
0118 12012C 29 LCALL DELAY
30
011B 7550A0 31 MOV SLA,#CSI24WC02 ;指定器件地址
011E 755100 32 MOV SUBA,#00H ;指定子地址
0121 755202 33 MOV NUMBYTE,#02H ;读2字节数据
0124 120251 34 LCALL IRDNBYTE ;调用读2字节数据程序
0127 12012C 35 LCALL DELAY
012A 80FE 36 SJMP $
37
012C 38 DELAY:
012C 7F00 39 MOV R7,#00H
012E DF01 40 MIN: DJNZ R7,YS500
0130 22 41 RET
0131 120137 42 YS500: LCALL YS500US
0134 02012E 43 LJMP MIN
0137 7E00 44 YS500US:MOV R6,#00H
0139 DEFE 45 DJNZ R6,$
013B 22 46 RET
013C 7F20 47 DELAY1: MOV R7,#20H
013E DFFE 48 DJNZ R7,$
0140 22 49 RET
50 ;------------------------------------------------------------------------------------------
--------------
51 ; MCS-51单片机模拟I2C软件包(V1.1)
52 ; 文件名:VI2C_ASM.INC
53 ; 功能说明:本模拟I2C软件包包含了I2C操作的底层子程序,使用前要定义
54 ;好SCL和SDA。在标准8051模式(12 Clock)下,对主频要求是不高于12MHz(即1个
55 ;机器周期1us);若Fosc>12MHz则要增加相应的NOP指令数。(总线时序符合I2C标
56 ;准模式,100Kbit/S)
57 ; 版本说明:本版新增了两个子程序,IWRNBYTEEXT,IRDNBYTEEXT两个子程序,
A51 MACRO ASSEMBLER 24CXX 09/16/2006 15:07:00 PAGE 2
58 ;这两个子程序用于主从通讯上及一此特殊器件的读写操作较为方便.
59 ; 更新时间:2002.06.04
60 ;------------------------------------------------------------------------------------------
--------------
61
62 ;启动I2C总线子程序
0141 D294 63 START: SETB SDA
0143 00 64 NOP
0144 D2B7 65 SETB SCL ;起始条件建立时间大于4.7us
0146 00 66 NOP
0147 00 67 NOP
0148 00 68 NOP
0149 00 69 NOP
014A 00 70 NOP
014B C294 71 CLR SDA
014D 00 72 NOP ;起始条件锁定时大于4us
014E 00 73 NOP
014F 00 74 NOP
0150 00 75 NOP
0151 00 76 NOP
0152 C2B7 77 CLR SCL ;钳住总线,准备发数据
0154 00 78 NOP
0155 22 79 RET
80
81 ;结束总线子程序
0156 C294 82 STOP: CLR SDA
0158 00 83 NOP
0159 D2B7 84 SETB SCL ;发送结束条件的时钟信号
015B 00 85 NOP ;结束总线时间大于4us
015C 00 86 NOP
015D 00 87 NOP
015E 00 88 NOP
015F 00 89 NOP
0160 D294 90 SETB SDA ;结束总线
0162 00 91 NOP ;保证一个终止信号和起始信号的空闲时间大于4.
7us
0163 00 92 NOP
0164 00 93 NOP
0165 00 94 NOP
0166 22 95 RET
96
97 ;发送应答信号子程序
0167 C294 98 MACK: CLR SDA ;将SDA置0
0169 00 99 NOP
016A 00 100 NOP
016B D2B7 101 SETB SCL
016D 00 102 NOP ;保持数据时间,即SCL为高时间大于4.7us
016E 00 103 NOP
016F 00 104 NOP
0170 00 105 NOP
0171 00 106 NOP
0172 C2B7 107 CLR SCL
0174 00 108 NOP
0175 00 109 NOP
0176 22 110 RET
111
112 ;发送非应答信号
0177 D294 113 MNACK: SETB SDA ;将SDA置1
0179 00 114 NOP
017A 00 115 NOP
017B D2B7 116 SETB SCL
017D 00 117 NOP
017E 00 118 NOP ;保持数据时间,即SCL为高时间大于4.7us
017F 00 119 NOP
0180 00 120 NOP
0181 00 121 NOP
A51 MACRO ASSEMBLER 24CXX 09/16/2006 15:07:00 PAGE 3
0182 C2B7 122 CLR SCL
0184 00 123 NOP
0185 00 124 NOP
0186 22 125 RET
126
127 ;检查应答位子程序
128 ;返回值,ACK=1时表示有应答
0187 D294 129 CACK: SETB SDA
0189 00 130 NOP
018A 00 131 NOP
018B D2B7 132 SETB SCL
018D C210 133 CLR ACK
018F 00 134 NOP
0190 00 135 NOP
0191 A294 136 MOV C,SDA
0193 4002 137 JC CEND
0195 D210 138 SETB ACK ;判断应答位
0197 00 139 CEND: NOP
0198 C2B7 140 CLR SCL
019A 00 141 NOP
019B 22 142 RET
143
144 ;发送字节子程序
145 ;字节数据放入ACC
146 ;每发送一字节要调用一次CACK子程序,取应答位
019C 7808 147 WRBYTE: MOV R0,#08H
019E 33 148 WLP: RLC A ;取数据位
019F 4006 149 JC WR1
01A1 8012 150 SJMP WR0 ;判断数据位
01A3 D8F9 151 WLP1: DJNZ R0,WLP
01A5 00 152 NOP
01A6 22 153 RET
01A7 D294 154 WR1: SETB SDA ;发送1
01A9 00 155 NOP
01AA D2B7 156 SETB SCL
01AC 00 157 NOP
01AD 00 158 NOP
01AE 00 159 NOP
01AF 00 160 NOP
01B0 00 161 NOP
162
01B1 C2B7 163 CLR SCL
01B3 80EE 164 SJMP WLP1
01B5 C294 165 WR0: CLR SDA ;发送0
01B7 00 166 NOP
01B8 D2B7 167 SETB SCL
01BA 00 168 NOP
01BB 00 169 NOP
01BC 00 170 NOP
01BD 00 171 NOP
01BE 00 172 NOP
173
174
01BF C2B7 175 CLR SCL
01C1 80E0 176 SJMP WLP1
177
178 ;读取字节子程序
179 ;读出的值在ACC
180 ;每取一字节要发送一个应答/非应答信号
01C3 7808 181 RDBYTE: MOV R0,#08H
01C5 D294 182 RLP: SETB SDA
01C7 00 183 NOP
01C8 00 184 NOP
01C9 00 185 NOP
01CA 00 186 NOP
01CB D2B7 187 SETB SCL ;时钟线为高,接收数据位
A51 MACRO ASSEMBLER 24CXX 09/16/2006 15:07:00 PAGE 4
01CD 00 188 NOP
01CE 00 189 NOP
01CF 00 190 NOP ;+1
01D0 00 191 NOP ;+1
01D1 00 192 NOP ;+1
01D2 00 193 NOP ;+1
01D3 00 194 NOP ;+1
195
196
01D4 A294 197 MOV C,SDA ;读取数据位
01D6 EA 198 MOV A,R2
01D7 C2B7 199 CLR SCL ;将SCL拉低,时间大于4.7us
01D9 33 200 RLC A ;进行数据位的处理
01DA FA 201 MOV R2,A
01DB 00 202 NOP
01DC 00 203 NOP
01DD 00 204 NOP
01DE 00 205 NOP ;+1
01DF 00 206 NOP ;+1
01E0 00 207 NOP ;+1
01E1 00 208 NOP
01E2 00 209 NOP
01E3 00 210 NOP ;+1
01E4 00 211 NOP
01E5 00 212 NOP ;+1
01E6 00 213 NOP ;+1
214
215
01E7 D8DC 216 DJNZ R0,RLP ;未够8位,再来一次
01E9 22 217 RET
218
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -