?? 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 + -