?? ex.lst
字號:
A51 MACRO ASSEMBLER EX 11/07/2006 08:35:29 PAGE 1
MACRO ASSEMBLER A51 V7.07
OBJECT MODULE PLACED IN Ex.OBJ
ASSEMBLER INVOKED BY: F:\program files\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
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 120135 20 LCALL DELAY
21
0106 754000 22 MOV MTD,#00H
0109 754112 23 MOV MTD+1,#12H
010C 754200 24 MOV MTD+2,#00H
010F 754330 25 MOV MTD+3,#30H
0112 754412 26 MOV MTD+4,#12H
0115 7550A2 27 MOV SLA,#PCF8563 ;指定器件地址
0118 755100 28 MOV SUBA,#00H ;指定子地址
011B 755205 29 MOV NUMBYTE,#05H ;發送2字節數據
011E 12022E 30 LCALL IWRNBYTE ;調用寫2字節數據程序
31
0121 120135 32 LCALL DELAY
0124 33 MAINLOOP:
0124 7550A2 34 MOV SLA,#PCF8563 ;指定器件地址
0127 755102 35 MOV SUBA,#02H ;指定子地址
012A 755203 36 MOV NUMBYTE,#03H ;發送2字節數據
012D 12025A 37 LCALL IRDNBYTE ;調用讀2字節數據程序
0130 120135 38 LCALL DELAY
0133 80EF 39 SJMP MAINLOOP
40
0135 41 DELAY:
0135 7F00 42 MOV R7,#00H
0137 DF01 43 MIN: DJNZ R7,YS500
0139 22 44 RET
013A 120140 45 YS500: LCALL YS500US
013D 020137 46 LJMP MIN
0140 7E00 47 YS500US:MOV R6,#00H
0142 DEFE 48 DJNZ R6,$
0144 22 49 RET
0145 7F20 50 DELAY1: MOV R7,#20H
0147 DFFE 51 DJNZ R7,$
0149 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 11/07/2006 08:35:29 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總線子程序
014A D297 +1 68 START: SETB SDA
014C 00 +1 69 NOP
014D D296 +1 70 SETB SCL ;起始條件建立時間大于4.7us
014F 00 +1 71 NOP
0150 00 +1 72 NOP
0151 00 +1 73 NOP
0152 00 +1 74 NOP
0153 00 +1 75 NOP
0154 C297 +1 76 CLR SDA
0156 00 +1 77 NOP ;起始條件鎖定時大于4us
0157 00 +1 78 NOP
0158 00 +1 79 NOP
0159 00 +1 80 NOP
015A 00 +1 81 NOP
015B C296 +1 82 CLR SCL ;鉗住總線,準備發數據
015D 00 +1 83 NOP
015E 22 +1 84 RET
+1 85
+1 86 ;結束總線子程序
015F C297 +1 87 STOP: CLR SDA
0161 00 +1 88 NOP
0162 D296 +1 89 SETB SCL ;發送結束條件的時鐘信號
0164 00 +1 90 NOP ;結束總線時間大于4us
0165 00 +1 91 NOP
0166 00 +1 92 NOP
0167 00 +1 93 NOP
0168 00 +1 94 NOP
0169 D297 +1 95 SETB SDA ;結束總線
016B 00 +1 96 NOP ;保證一個終止信號和起始信號的空閑時間大于4.
7us
016C 00 +1 97 NOP
016D 00 +1 98 NOP
016E 00 +1 99 NOP
016F 22 +1 100 RET
+1 101
+1 102 ;發送應答信號子程序
0170 C297 +1 103 MACK: CLR SDA ;將SDA置0
0172 00 +1 104 NOP
0173 00 +1 105 NOP
0174 D296 +1 106 SETB SCL
0176 00 +1 107 NOP ;保持數據時間,即SCL為高時間大于4.7us
0177 00 +1 108 NOP
0178 00 +1 109 NOP
0179 00 +1 110 NOP
017A 00 +1 111 NOP
017B C296 +1 112 CLR SCL
017D 00 +1 113 NOP
017E 00 +1 114 NOP
017F 22 +1 115 RET
+1 116
+1 117 ;發送非應答信號
0180 D297 +1 118 MNACK: SETB SDA ;將SDA置1
0182 00 +1 119 NOP
0183 00 +1 120 NOP
0184 D296 +1 121 SETB SCL
A51 MACRO ASSEMBLER EX 11/07/2006 08:35:29 PAGE 3
0186 00 +1 122 NOP
0187 00 +1 123 NOP ;保持數據時間,即SCL為高時間大于4.7us
0188 00 +1 124 NOP
0189 00 +1 125 NOP
018A 00 +1 126 NOP
018B C296 +1 127 CLR SCL
018D 00 +1 128 NOP
018E 00 +1 129 NOP
018F 22 +1 130 RET
+1 131
+1 132 ;檢查應答位子程序
+1 133 ;返回值,ACK=1時表示有應答
0190 D297 +1 134 CACK: SETB SDA
0192 00 +1 135 NOP
0193 00 +1 136 NOP
0194 D296 +1 137 SETB SCL
0196 C210 +1 138 CLR ACK
0198 00 +1 139 NOP
0199 00 +1 140 NOP
019A A297 +1 141 MOV C,SDA
019C 4002 +1 142 JC CEND
019E D210 +1 143 SETB ACK ;判斷應答位
01A0 00 +1 144 CEND: NOP
01A1 C296 +1 145 CLR SCL
01A3 00 +1 146 NOP
01A4 22 +1 147 RET
+1 148
+1 149 ;發送字節子程序
+1 150 ;字節數據放入ACC
+1 151 ;每發送一字節要調用一次CACK子程序,取應答位
01A5 7808 +1 152 WRBYTE: MOV R0,#08H
01A7 33 +1 153 WLP: RLC A ;取數據位
01A8 4006 +1 154 JC WR1
01AA 8012 +1 155 SJMP WR0 ;判斷數據位
01AC D8F9 +1 156 WLP1: DJNZ R0,WLP
01AE 00 +1 157 NOP
01AF 22 +1 158 RET
01B0 D297 +1 159 WR1: SETB SDA ;發送1
01B2 00 +1 160 NOP
01B3 D296 +1 161 SETB SCL
01B5 00 +1 162 NOP
01B6 00 +1 163 NOP
01B7 00 +1 164 NOP
01B8 00 +1 165 NOP
01B9 00 +1 166 NOP
+1 167
01BA C296 +1 168 CLR SCL
01BC 80EE +1 169 SJMP WLP1
01BE C297 +1 170 WR0: CLR SDA ;發送0
01C0 00 +1 171 NOP
01C1 D296 +1 172 SETB SCL
01C3 00 +1 173 NOP
01C4 00 +1 174 NOP
01C5 00 +1 175 NOP
01C6 00 +1 176 NOP
01C7 00 +1 177 NOP
+1 178
+1 179
01C8 C296 +1 180 CLR SCL
01CA 80E0 +1 181 SJMP WLP1
+1 182
+1 183 ;讀取字節子程序
+1 184 ;讀出的值在ACC
+1 185 ;每取一字節要發送一個應答/非應答信號
01CC 7808 +1 186 RDBYTE: MOV R0,#08H
01CE D297 +1 187 RLP: SETB SDA
A51 MACRO ASSEMBLER EX 11/07/2006 08:35:29 PAGE 4
01D0 00 +1 188 NOP
01D1 00 +1 189 NOP
01D2 00 +1 190 NOP
01D3 00 +1 191 NOP
01D4 D296 +1 192 SETB SCL ;時鐘線為高,接收數據位
01D6 00 +1 193 NOP
01D7 00 +1 194 NOP
01D8 00 +1 195 NOP ;+1
01D9 00 +1 196 NOP ;+1
01DA 00 +1 197 NOP ;+1
01DB 00 +1 198 NOP ;+1
01DC 00 +1 199 NOP ;+1
+1 200
+1 201
01DD A297 +1 202 MOV C,SDA ;讀取數據位
01DF EA +1 203 MOV A,R2
01E0 C296 +1 204 CLR SCL ;將SCL拉低,時間大于4.7us
01E2 33 +1 205 RLC A ;進行數據位的處理
01E3 FA +1 206 MOV R2,A
01E4 00 +1 207 NOP
01E5 00 +1 208 NOP
01E6 00 +1 209 NOP
01E7 00 +1 210 NOP ;+1
01E8 00 +1 211 NOP ;+1
01E9 00 +1 212 NOP ;+1
01EA 00 +1 213 NOP
01EB 00 +1 214 NOP
01EC 00 +1 215 NOP ;+1
01ED 00 +1 216 NOP
01EE 00 +1 217 NOP ;+1
01EF 00 +1 218 NOP ;+1
+1 219
+1 220
01F0 D8DC +1 221 DJNZ R0,RLP ;未夠8位,再來一次
01F2 22 +1 222 RET
+1 223
+1 224
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -