📄 i2c.lst
字号:
A51 MACRO ASSEMBLER I2C 08/25/2006 15:57:59 PAGE 1
MACRO ASSEMBLER A51 V8.00
OBJECT MODULE PLACED IN I2C.OBJ
ASSEMBLER INVOKED BY: E:\Program Files\Keil\C51\BIN\A51.EXE I2C.asm SET(SMALL) DEBUG EP
LOC OBJ LINE SOURCE
1
2
3
0010 4 ACK BIT 10H ;应答标志位
0050 5 SLA DATA 50H ;器件地址字
0051 6 SUBA DATA 51H ;器件子地址
0052 7 NUMBYTE DATA 52H ;读/写字节数
8
0095 9 SDA BIT P1.5
0094 10 SCL BIT P1.4 ;I2C总线定义
0030 11 MTD EQU 30H ;发送数据缓存区首地址(30H-3FH)
0040 12 MRD EQU 40H ;接收数据缓存区首地址(40H-4FH)
13
14
0000 2180 15 AJMP MAIN
0080 16 ORG 80H
17
18
19
20
21
22
23 ;*********************************************************************
24 ;名称:IWRNBYTE
25 ;描述:向器件指定子地址写N个数据
26 ;入口参数:器件地址字SLA,子地址SUBA,发送数据缓冲区MTD,发送字节数NUMBYTE
27 ;*********************************************************************
0080 28 IWRNBYTE:
0080 AB52 29 MOV R3,NUMBYTE
0082 1200E7 30 LCALL START ;启动总线
0085 E550 31 MOV A,SLA
0087 120143 32 LCALL WRBYTE ;发送器件地址字
008A 12012E 33 LCALL CACK
008D 301017 34 JNB ACK,RETWRN ;无应答则退出
0090 E551 35 MOV A,SUBA ;指定子地址
0092 120143 36 LCALL WRBYTE
0095 12012E 37 LCALL CACK
0098 7930 38 MOV R1,#MTD
009A E7 39 WRDA: MOV A,@R1
009B 120143 40 LCALL WRBYTE ;开始写入数据
009E 12012E 41 LCALL CACK
00A1 3010DC 42 JNB ACK,IWRNBYTE
00A4 09 43 INC R1
00A5 DBF3 44 DJNZ R3,WRDA ;判断是否写完
00A7 1200FB 45 RETWRN: LCALL STOP
00AA 22 46 RET
47 ;*********************************************************************
48 ;名称:IRDNBYTE
49 ;描述:从器件指定子地址读取N个数据
50 ;入口参数:器件地址字SLA,子地址SUBA,接收数据缓存区MRD,接收字节数NUMBYTE
51 ;*********************************************************************
00AB 52 IRDNBYTE:
00AB AB52 53 MOV R3,NUMBYTE
00AD 1200E7 54 LCALL START
00B0 E550 55 MOV A,SLA
00B2 120143 56 LCALL WRBYTE ;发送器件地址字
00B5 12012E 57 LCALL CACK
00B8 301022 58 JNB ACK,RETRDN
A51 MACRO ASSEMBLER I2C 08/25/2006 15:57:59 PAGE 2
00BB E551 59 MOV A,SUBA ;指定子地址
00BD 120143 60 LCALL WRBYTE
00C0 12012E 61 LCALL CACK
00C3 1200E7 62 LCALL START ;重新启动总线
00C6 E550 63 MOV A,SLA
00C8 04 64 INC A ;准备进行读操作
00C9 120143 65 LCALL WRBYTE
00CC 12012E 66 LCALL CACK
00CF 3010D9 67 JNB ACK,IRDNBYTE
00D2 7940 68 MOV R1,#MRD
00D4 12016A 69 RON1: LCALL RDBYTE ;读操作开始
00D7 F7 70 MOV @R1,A
00D8 DB07 71 DJNZ R3,SACK
00DA 12011E 72 LCALL MNACK ;最后一字节发非应答位
00DD 1200FB 73 RETRDN: LCALL STOP
00E0 22 74 RET
00E1 12010E 75 SACK: LCALL MACK
00E4 09 76 INC R1
00E5 80ED 77 SJMP RON1
78 ;*********************************************************************
79 ;名称:STRRT
80 ;描述:启动I2C总线子程序—发送I2C总线起始条件
81 ;*********************************************************************
00E7 D295 82 START: SETB SDA ;发送起始条件数据信号
00E9 00 83 NOP ;起始条件建立时间大于4.7us
00EA D294 84 SETB SCL ;发送起始条件的时钟信号
00EC 00 85 NOP
00ED 00 86 NOP
00EE 00 87 NOP
00EF 00 88 NOP
00F0 00 89 NOP ;起始条件锁定时间大于4.7us
00F1 C295 90 CLR SDA ;发送起始信号
00F3 00 91 NOP
00F4 00 92 NOP
00F5 00 93 NOP
00F6 00 94 NOP ;起始条件锁定时间大于4.7us
00F7 C294 95 CLR SCL ;钳住I2C总线,准备发送或接收数据
00F9 00 96 NOP
00FA 22 97 RET
98 ;*********************************************************************
99 ;名称:STOP
100 ;描述:停止I2C总线子程序—发送I2C总线停止条件
101 ;*********************************************************************
00FB C295 102 STOP: CLR SDA ;发送停止条件的数据信号
00FD 00 103 NOP
00FE 00 104 NOP
00FF D294 105 SETB SCL ;发送停止条件的时钟信号
0101 00 106 NOP
0102 00 107 NOP
0103 00 108 NOP
0104 00 109 NOP
0105 00 110 NOP ;起始条件建立时间大于4.7us
0106 D295 111 SETB SDA ;发送I2C总线停止信号
0108 00 112 NOP
0109 00 113 NOP
010A 00 114 NOP
010B 00 115 NOP
010C 00 116 NOP ;延迟时间大于4.7us
010D 22 117 RET
118 ;*********************************************************************
119 ;名称:MACK
120 ;描述:发送应答信号子程序
121 ;*********************************************************************
010E C295 122 MACK: CLR SDA ;将SDA置0
0110 00 123 NOP
0111 00 124 NOP
A51 MACRO ASSEMBLER I2C 08/25/2006 15:57:59 PAGE 3
0112 D294 125 SETB SCL
0114 00 126 NOP
0115 00 127 NOP
0116 00 128 NOP
0117 00 129 NOP
0118 00 130 NOP ;保持数据时间,大于4.7us
0119 C294 131 CLR SCL
011B 00 132 NOP
011C 00 133 NOP
011D 22 134 RET
135 ;*********************************************************************
136 ;名称:MNACK
137 ;描述:发送非应答信号子程序
138 ;*********************************************************************
011E D295 139 MNACK: SETB SDA ;将SDA置1
0120 00 140 NOP
0121 00 141 NOP
0122 D294 142 SETB SCL
0124 00 143 NOP
0125 00 144 NOP
0126 00 145 NOP
0127 00 146 NOP
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -