⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 i2cslave.lst

📁 大量ADuc831的程序员代码
💻 LST
字号:
I2CSLAVE                                                                                                      PAGE 1

                       1    ;======================================================================
                       2    ;
                       3    ; Author        : ADI - Apps              www.analog.com/MicroConverter
                       4    ;
                       5    ; Date          : Oct 2000
                       6    ;
                       7    ; File          : i2cslave.asm
                       8    ;
                       9    ; Hardware      : ADuC831
                      10    ;
                      11    ; Description   : Code for a slave in an I2C system. This code will
                      12    ;               continuously receive and transmit a byte over the I2C
                      13    ;               interface, then send the received byte out the UART, 
                      14    ;               then check if a character had been entered in the UART.
                      15    ;               If so, it will send the ASCII value of the character
                      16    ;               entered to the slave, the next time it transmits a byte.
                      17    ;
                      18    ; Reference     : Tech Note, uC001: "MicroConverter I2C Compatible
                      19    ;               Interface" find it at www.analog.com/microconverter
                      20    ;
                      21    ;======================================================================
                      22    
                      23    $MOD831
                      24    
                      25    ;____________________________________________________________________
                      26                                       ; DEFINE VARIABLES IN INTERNAL RAM
                      27    
  0030                28    BYTECNT         DATA    30h       ; byte counter for I2C routines
  0031                29    INPUT           DATA    31h       ; data recieved from master
  0032                30    OUTPUT          DATA    32h       ; data to be transmitted to master
                      31    
  0000                32    GO              BIT     00h       ; flag to wait for interrupts
  0001                33    FIRST           BIT     01h       ; flag to indicate first receive Int
                      34    
  00B4                35    LED             EQU     P3.4      ; P3.4 drives the LED on eval board
                      36    
                      37    ;____________________________________________________________________
                      38                                                      ; BEGINNING OF CODE
----                  39    CSEG
0000                  40    ORG 0000h
0000 020060           41            JMP MAIN
                      42    ;____________________________________________________________________
                      43                                                               ; INT0 ISR
0003                  44    ORG 0003h
0003 0532             45            INC     OUTPUT
0005 32               46            RETI
                      47    ;____________________________________________________________________
                      48                                                                ; I2C ISR
003B                  49    ORG 003Bh  
                      50    
003B 20E90B           51          JB      I2CTX, SLAVE_TRANSMITTER
                      52    
003E                  53    SLAVE_RECEIVER:
003E 200110           54          JB      FIRST, ENDINT1  ; if first INT then wait for next int
0041 D200             55          SETB    GO              ; reception complete 
0043 859A31           56          MOV     INPUT, I2CDAT   ; store data received in INPUT
0046 020051           57          JMP     ENDINT1
                      58    
I2CSLAVE                                                                                                      PAGE 2

0049                  59    SLAVE_TRANSMITTER:
0049 D200             60          SETB    GO              ; transmission complete
004B 85329A           61          MOV     I2CDAT, OUTPUT  ; move data to be transmitted into I2CDAT
004E 020053           62          JMP     ENDINT2         ; Note: On the ADuC824/816 the read or
                      63                                  ;       write of I2CDAT register 
                      64                                  ;       automatically clears i2ci. If
                      65                                  ;       I2CI is cleared twice then the
                      66                                  ;       microconverter will hang.)
                      67    
0051                  68    ENDINT1:
0051 C2E8             69          CLR     I2CI            ; clear I2C interrupt bit (812 only)
0053                  70    ENDINT2:
0053 C201             71          CLR     FIRST           ; address has already been received
0055 32               72          RETI
                      73    
                      74    ;____________________________________________________________________
                      75                                                           ; MAIN PROGRAM
0060                  76    ORG 0060h
0060                  77    MAIN:
                      78    
0060 759E85           79            MOV     T3CON,#085H
0063 759D08           80            MOV     T3FD,#08H
0066 759852           81            MOV     SCON,#52H
                      82    
                      83    ;configure and enable interrupts
                      84    ;      MOV     IE2,#01h       ; enable I2C interrupt
0069 75A901           85          MOV     IEIP2,#01h    ; enable I2C interrupt
006C D2A8             86          SETB    EX0            ; enable INT0
006E D288             87          SETB    IT0            ; INT0 edge triggered
0070 D2AF             88          SETB    EA             ; allow all the interrupts
                      89    
                      90    ;initialize settings
0072 759B44           91          MOV     I2CADD,#044h   ; slave address is 44h
0075 75E800           92          MOV     I2CCON,#00h    ; slave mode (default=>not necessary)
0078 C200             93          CLR     GO             ; clear flag to wait for interrupt
                      94                                 ; GO is set once data is TX'd or RX'd
007A D201             95          SETB    FIRST          ; FIRST is cleared after receiving the
                      96                                 ; first SLAVE receiver interrupt
                      97    
007C 753200           98          MOV     OUTPUT,#0      ; first byte to be transmitted is 40h 
007F D2B4             99          SETB     LED
                     100    
0081                 101    WAITFORDATA:  
0081 3000FD          102          JNB     GO,$           ; ----- wait for i2c interrupt ------
                     103                                 ; If it is in receive mode, it will 
                     104                                 ; wait here for a second interrupt (as 
                     105                                 ; the first interrupt only contains the
                     106                                 ; slave address in I2CDAT).
                     107                                 ; In transmit mode the tranmission will
                     108                                 ; occur after the first interrupt.
0084 D201            109          SETB    FIRST          ; re-initialise flags
0086 C200            110          CLR     GO
0088 20E9F6          111          JB      I2CTX,WAITFORDATA
                     112                                 ; if the slave has just transmitted then
                     113                                 ; wait to receive a byte 
                     114                                 ; if the slave has just received then
                     115                                 ; send input up the UART
                     116            
I2CSLAVE                                                                                                      PAGE 3

008B                 117    SENDUART:
008B B2B4            118          CPL     LED            ; LED changes each time one byte has been 
                     119                                 ; received and another transmitted
                     120    
008D E531            121          MOV     A,INPUT        ; send value received out the UART
008F 1200BA          122          CALL    SENDVAL
0092 740A            123          MOV     A,#10
0094 1200A6          124          CALL    SENDCHAR       ; send LF + CR
0097 740D            125          MOV     A,#13
0099 1200A6          126          CALL    SENDCHAR
                     127    
009C 3098E2          128          JNB     RI, WAITFORDATA      ; repeat (unless UART data received)
                     129    
                     130    ; WHEN UART DATA RECEIVED, MOVE DATA TO I2C OUTPUT...
                     131    
009F 859932          132          MOV     OUTPUT, SBUF    ; update OUTPUT byte to new value
00A2 C298            133          CLR     RI              ; must clear RI
00A4 80DB            134          JMP     WAITFORDATA     ; back to main loop
                     135    
                     136    
                     137    ;======================================================================
                     138    ;                             SUBROUTINES
                     139    ;======================================================================
                     140    
                     141    ;____________________________________________________________________
                     142                                                               ; SENDCHAR
                     143    ; sends ASCII value contained in A to UART
                     144    
00A6                 145    SENDCHAR: 
00A6 3099FD          146            JNB     TI,$            ; wait 'til present char gone
00A9 C299            147            CLR     TI              ; must clear TI
00AB F599            148            MOV     SBUF,A
00AD 22              149            RET
                     150    ;____________________________________________________________________
                     151                                                              ; HEX2ASCII
                     152    ; converts A into the hex character representing the value of A's 
                     153    ; least significant nibble
                     154    
00AE                 155    HEX2ASCII:      
00AE 540F            156            ANL     A,#00Fh
00B0 B40A00          157            CJNE    A,#00Ah,$+3
00B3 4002            158            JC      IO0030
00B5 2407            159            ADD     A,#007h
00B7 2430            160    IO0030: ADD     A,#'0'
00B9 22              161            RET
                     162    ;____________________________________________________________________
                     163                                                                ; SENDVAL
                     164    ; converts the hex value of A into two ASCII chars, and then spits 
                     165    ; these two characters up the UART. does not change the value of A.
                     166    
00BA                 167    SENDVAL: 
00BA C0E0            168            PUSH    ACC
00BC C4              169            SWAP    A
00BD 11AE            170            CALL    HEX2ASCII
00BF 11A6            171            CALL    SENDCHAR        ; send high nibble
00C1 D0E0            172            POP     ACC
00C3 C0E0            173            PUSH    ACC
00C5 11AE            174            CALL    HEX2ASCII
I2CSLAVE                                                                                                      PAGE 4

00C7 11A6            175            CALL    SENDCHAR        ; send low nibble
00C9 D0E0            176            POP     ACC
00CB 22              177            RET
                     178    ;____________________________________________________________________
                     179    
                     180    END

VERSION 1.2h ASSEMBLY COMPLETE, 0 ERRORS FOUND
I2CSLAVE                                                                                                      PAGE 5

ACC. . . . . . . . . . . . . . .  D ADDR  00E0H  PREDEFINED  
BYTECNT. . . . . . . . . . . . .  D ADDR  0030H  NOT USED  
EA . . . . . . . . . . . . . . .  B ADDR  00AFH  PREDEFINED  
ENDINT1. . . . . . . . . . . . .  C ADDR  0051H  
ENDINT2. . . . . . . . . . . . .  C ADDR  0053H  
EX0. . . . . . . . . . . . . . .  B ADDR  00A8H  PREDEFINED  
FIRST. . . . . . . . . . . . . .  B ADDR  0001H  
GO . . . . . . . . . . . . . . .  B ADDR  0000H  
HEX2ASCII. . . . . . . . . . . .  C ADDR  00AEH  
I2CADD . . . . . . . . . . . . .  D ADDR  009BH  PREDEFINED  
I2CCON . . . . . . . . . . . . .  D ADDR  00E8H  PREDEFINED  
I2CDAT . . . . . . . . . . . . .  D ADDR  009AH  PREDEFINED  
I2CI . . . . . . . . . . . . . .  B ADDR  00E8H  PREDEFINED  
I2CTX. . . . . . . . . . . . . .  B ADDR  00E9H  PREDEFINED  
IEIP2. . . . . . . . . . . . . .  D ADDR  00A9H  PREDEFINED  
INPUT. . . . . . . . . . . . . .  D ADDR  0031H  
IO0030 . . . . . . . . . . . . .  C ADDR  00B7H  
IT0. . . . . . . . . . . . . . .  B ADDR  0088H  PREDEFINED  
LED. . . . . . . . . . . . . . .    NUMB  00B4H  
MAIN . . . . . . . . . . . . . .  C ADDR  0060H  
OUTPUT . . . . . . . . . . . . .  D ADDR  0032H  
P3 . . . . . . . . . . . . . . .  D ADDR  00B0H  PREDEFINED  
RI . . . . . . . . . . . . . . .  B ADDR  0098H  PREDEFINED  
SBUF . . . . . . . . . . . . . .  D ADDR  0099H  PREDEFINED  
SCON . . . . . . . . . . . . . .  D ADDR  0098H  PREDEFINED  
SENDCHAR . . . . . . . . . . . .  C ADDR  00A6H  
SENDUART . . . . . . . . . . . .  C ADDR  008BH  NOT USED  
SENDVAL. . . . . . . . . . . . .  C ADDR  00BAH  
SLAVE_RECEIVER . . . . . . . . .  C ADDR  003EH  NOT USED  
SLAVE_TRANSMITTER. . . . . . . .  C ADDR  0049H  
T3CON. . . . . . . . . . . . . .  D ADDR  009EH  PREDEFINED  
T3FD . . . . . . . . . . . . . .  D ADDR  009DH  PREDEFINED  
TI . . . . . . . . . . . . . . .  B ADDR  0099H  PREDEFINED  
WAITFORDATA. . . . . . . . . . .  C ADDR  0081H  

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -