📄 slave.lst
字号:
SLAVE PAGE 1
1 ;======================================================================
2 ;
3 ; Author : ADI - Apps www.analog.com/MicroConverter
4 ;
5 ; Date : 30 April 1999
6 ;
7 ; File : slave.asm
8 ;
9 ; Hardware : ADuC812
10 ;
11 ; Description : Code for a slave in an I2C system.
12 ;
13 ; Reference : Tech Note, uC001: "Using the ADuC812 I2C Interface"
14 ; find it at www.analog.com/microconverter
15 ;
16 ;======================================================================
17
18 $MOD812 ; use ADuC812 & 8052 predefined symbols
19
0030 20 BYTECNT DATA 030h ; byte counter for I2C routines
21
0028 22 FLAGS DATA 28h
0040 23 GO BIT FLAGS.0 ; flag for all the interrupts
0041 24 RC BIT FLAGS.1 ; flag for Write mode interrupt
0042 25 TR BIT FLAGS.2 ; flag for Read mode interrupt
26
27 ;======================================================================
28
---- 29 CSEG
30
0000 31 ORG 0000H
32
0000 0200AB 33 JMP START
34
35 ;======================================================================
36
003B 37 ORG 003Bh ; I2C slave interrupt
38
003B 20413D 39 JB RC,RECEIVE ; depending on flags there
003E 204241 40 JB TR,TRANSMIT ; are two different interrupts
41
42 ;======================================================================
43
007B 44 ORG 007BH ; Subroutines
45
46 ;----------------------------------------------------------------------
47 ; RECEIVE: receive interrupt routine
48 ;----------------------------------------------------------------------
49
007B 50 RECEIVE:
007B D240 51 SETB GO
007D A79A 52 MOV @R1,I2CDAT ; move data on internal RAM
007F C2E8 53 CLR I2CI ; clear interrupt bit
0081 32 54 RETI
55
56 ;----------------------------------------------------------------------
57 ; TRANSMIT: transmit interrupt routine
58 ;----------------------------------------------------------------------
SLAVE PAGE 2
59
0082 60 TRANSMIT:
0082 D240 61 SETB GO
0084 889A 62 MOV I2CDAT,R0
0086 C2E8 63 CLR I2CI ; clear interrupt bit
0088 32 64 RETI
65
66 ;----------------------------------------------------------------------
67 ; RCVBYTE2: receive byte routine for read mode
68 ;----------------------------------------------------------------------
69
0089 70 RCVBYTE2:
71
0089 00 72 NOP
008A 22 73 RET
74
75 ;----------------------------------------------------------------------
76 ; RCVBYTE: receive byte routine
77 ;----------------------------------------------------------------------
78
008B 79 RCVBYTE:
80
008B 3040FD 81 JNB GO,$ ; wait for the interrupt
008E 09 82 INC R1 ; next storage will be on 41h then 42h
008F C240 83 CLR GO ; flag cleared for the next interrupt
0091 22 84 RET
85
86 ;----------------------------------------------------------------------
87 ; RCVDATA: receive bytes routine
88 ;----------------------------------------------------------------------
89
0092 90 RCVDATA:
91
0092 753004 92 MOV BYTECNT,#4 ; 4 bytes : address + 3 datas
0095 118B 93 LOOP2: ACALL RCVBYTE
0097 D530FB 94 DJNZ BYTECNT,LOOP2
009A 22 95 RET
96
97 ;----------------------------------------------------------------------
98 ; SENDBYTE: byte transmit routine
99 ;----------------------------------------------------------------------
100
009B 101 SENDBYTE:
102
009B 3040FD 103 JNB GO,$ ; wait for the interrupt
009E 08 104 INC R0 ; 2nd data is 34h and 3rd data is 35h
009F C240 105 CLR GO
00A1 22 106 RET
107
108 ;----------------------------------------------------------------------
109 ;SENDATA:bytes transmit routine
110 ;----------------------------------------------------------------------
111
00A2 112 SENDATA:
113
00A2 753003 114 MOV BYTECNT,#3 ; 3 data will be send by the slave
00A5 119B 115 LOOP: ACALL SENDBYTE
00A7 D530FB 116 DJNZ BYTECNT,LOOP
SLAVE PAGE 3
00AA 22 117 RET
118
119 ;======================================================================
120 ;Main program
121 ;======================================================================
122
00AB 123 START:
124
00AB C240 125 CLR GO ; clear flag used in the interrupt
00AD 759B44 126 MOV I2CADD,#044h ; slave address
00B0 758120 127 MOV SP,#020h
00B3 75A880 128 MOV IE,#80h ; enable all the interrupts
00B6 75A901 129 MOV IE2,#01h ; enable I2C interrupt
00B9 75E800 130 MOV I2CCON,#000h ; slave mode
131
132 ; code for write mode ( master-transmitter to slave-receiver )
133
134 ; SETB RC ; specific flag for interrupt routine
135 ; MOV R1,#040h ; first data to be stored in RAM at 40h
136 ; ACALL RCVDATA ; slave receives his address + 3 datas
137
138 ; code for read mode ( master reads slave immediately after 1st byte )
139
00BC D241 140 SETB RC ; specific flag for interrupt routine
00BE 7833 141 MOV R0,#033h ; first data send is 33h
00C0 1189 142 ACALL RCVBYTE2 ; slave receives address send by master
00C2 C241 143 CLR RC
00C4 D242 144 SETB TR
00C6 11A2 145 ACALL SENDATA ; slave sends 3 datas
146
00C8 D2B4 147 SETB P3.4 ; led is off, everything is OK
148
149 END
VERSION 1.2h ASSEMBLY COMPLETE, 0 ERRORS FOUND
SLAVE PAGE 4
BYTECNT. . . . . . . . . . . . . D ADDR 0030H
FLAGS. . . . . . . . . . . . . . D ADDR 0028H
GO . . . . . . . . . . . . . . . B ADDR 0040H
I2CADD . . . . . . . . . . . . . D ADDR 009BH PREDEFINED
I2CCON . . . . . . . . . . . . . D ADDR 00E8H PREDEFINED
I2CDAT . . . . . . . . . . . . . D ADDR 009AH PREDEFINED
I2CI . . . . . . . . . . . . . . B ADDR 00E8H PREDEFINED
IE . . . . . . . . . . . . . . . D ADDR 00A8H PREDEFINED
IE2. . . . . . . . . . . . . . . D ADDR 00A9H PREDEFINED
LOOP . . . . . . . . . . . . . . C ADDR 00A5H
LOOP2. . . . . . . . . . . . . . C ADDR 0095H
P3 . . . . . . . . . . . . . . . D ADDR 00B0H PREDEFINED
RC . . . . . . . . . . . . . . . B ADDR 0041H
RCVBYTE. . . . . . . . . . . . . C ADDR 008BH
RCVBYTE2 . . . . . . . . . . . . C ADDR 0089H
RCVDATA. . . . . . . . . . . . . C ADDR 0092H NOT USED
RECEIVE. . . . . . . . . . . . . C ADDR 007BH
SENDATA. . . . . . . . . . . . . C ADDR 00A2H
SENDBYTE . . . . . . . . . . . . C ADDR 009BH
SP . . . . . . . . . . . . . . . D ADDR 0081H PREDEFINED
START. . . . . . . . . . . . . . C ADDR 00ABH
TR . . . . . . . . . . . . . . . B ADDR 0042H
TRANSMIT . . . . . . . . . . . . C ADDR 0082H
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -