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

📄 24i2c.lst

📁 01单片机网站51单片机开发板全部配套程序
💻 LST
📖 第 1 页 / 共 2 页
字号:
A51 MACRO ASSEMBLER  24I2C                                                                  12/05/03 19:09:36 PAGE     1


DOS MACRO ASSEMBLER A51 X4.86
OBJECT MODULE PLACED IN 24I2C.OBJ
ASSEMBLER INVOKED BY: C:\C51EVAL\BIN\A51.EXE 24I2C.A51 DB EP

LOC  OBJ            LINE     SOURCE

                       1     ;程序名:  MCS51实验板配套程序-24系列EEPROM读写
                       2     ;电路介绍:由p1.7=sda,p1.6=scl;显示电路同前面例子
                       3     ;功能操作:按S3加数,按S1将i2c指定地址数据读出、显示,按S2将指定数据写入
                       4     ;www.01mcu.net www.01mcu.com 2003/5/12编写
                       5     ;********************************************************************
  0094                 6     xsdat bit p1.4    ;定义驱动74164的数据脚为p1.4
  0095                 7     xsclk bit p1.5    ;74164的时钟
  0090                 8     gw    bit p1.0    ;个位显示控制脚
  0091                 9     sw    bit p1.1    ;十位
  0092                10     bw    bit p1.2    ;百位
  0093                11     qw    bit p1.3    ;千位
  0097                12     sda   bit p1.7
  0096                13     scl   bit p1.6
  00B2                14     read  bit p3.2    ;读按键
  00B3                15     wri   bit p3.3    ;写按键
  00B4                16     sadd  bit p3.4    ;+数键
  0030                17     sjgw  equ 30h     ;显示数据存储器
  0031                18     sjsw  equ 31h
  0032                19     sjbw  equ 32h
  0033                20     sjqw  equ 33h
  0020                21     i2cadd equ 20h     ;i2c的地址
  0021                22     jstem  equ 21h     ;i2c的数据
                      23     ;*****************************************************
                      24     
0000 758140           25               mov sp,#40h
0003 752010           26               mov i2cadd,#10h   ;对i2c的10H地址进行操作
0006 753000           27               mov sjgw,#0
0009 753100           28               mov sjsw,#0
000C 753200           29               mov sjbw,#0
000F 753300           30               mov sjqw,#0
0012 1200C4           31               lcall i2cread
0015 8F21             32               mov jstem,r7      ;开始显示为读i2c 10H的数据
0017 1169             33               acall b2c
0019 12011F           34     main :    lcall display
001C 20B403           35               jb sadd,n1
001F 020034           36               ljmp addkey
0022 12011F           37     n1:       lcall display
0025 20B203           38               jb read,n2
0028 020045           39               ljmp readkey
002B 12011F           40     n2:       lcall display
002E 20B3E8           41               jb wri,main
0031 020059           42               ljmp wrikey
                      43               
                      44     ;-+1----------------------------
0034 7C05             45     addkey:   mov r4,#5
0036 12011F           46     addl1:    lcall display
0039 30B4FA           47               jnb sadd,addl1 
003C DCF8             48               djnz r4,addl1
003E 0521             49               inc jstem         ;+1
0040 1169             50               acall b2c         ;转换
0042 020019           51               ljmp main
                      52     ;--read------------------------
0045 7C05             53     readkey:  mov r4,#5
0047 12011F           54     readl1:   lcall display
004A 30B2FA           55               jnb read,readl1 
004D DCF8             56               djnz r4,readl1
004F 1200C4           57               lcall i2cread     ;将i2cadd地址指定的数据读出
0052 8F21             58               mov jstem,r7
A51 MACRO ASSEMBLER  24I2C                                                                  12/05/03 19:09:36 PAGE     2

0054 1169             59               acall b2c         ;转换
0056 020019           60               ljmp main
                      61     ;--wri-------------------------
0059 7C05             62     wrikey:   mov r4,#5
005B 12011F           63     wril1:    lcall display
005E 30B3FA           64               jnb wri,wril1
0061 DCF8             65               djnz r4,wril1
0063 12007D           66               lcall i2cwri      ;将jstmp写到i2cadd 
0066 020019           67               ljmp main             
                      68     ;***转换程序**********************************
0069 E521             69     b2c:      mov a,jstem
006B 75F064           70               mov b,#100
006E 84               71               div ab
006F F532             72               mov sjbw,a
0071 E5F0             73               mov a,b
0073 75F00A           74               mov b,#10
0076 84               75               div ab
0077 F531             76               mov sjsw,a
0079 85F030           77               mov sjgw,b
007C 22               78               ret
                      79     ;$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
                      80     ;写24C01.(传递的地址在I2CADD,数据在JSTEM中,子程序内用R7).
                      81     ;**************************************************************
007D D297             82     I2CWRI:    SETB SDA
007F D296             83                SETB SCL                     ;置SDA/SCL=1
0081 11DE             84                ACALL R2STAR                 ;写开始状态字
0083 7FA0             85                MOV R7,#10100000B            ;SET 2401=写
0085 119C             86                ACALL R2SEND                 ;送
0087 8520E0           87                MOV ACC,I2CADD               ;I2CADD指向2401的起始地址
008A AFE0             88                MOV R7,ACC                   ;将要写2401的起始地址送到R7
008C 119C             89                ACALL R2SEND
008E A820             90                MOV R0,I2CADD
0090 8521E0           91                MOV ACC,JSTEM                ;写第一个号
0093 AFE0             92                MOV R7,ACC                   ;数据传递到R7
0095 119C             93                ACALL R2SEND                 ;写具体号码
0097 3107             94                ACALL R2STOP                 ;停止
0099 3170             95                ACALL D10MS                  ;等待一定时间使24C01内部写完成
009B 22               96                RET
                      97     ;------------------------------------------
                      98     ;写到2401 本程序开始及结束SDA & SCL 均=0 ,发送数据在R7
                      99     ;------------------------------------------
009C C0E0            100     R2SEND:    PUSH ACC                     ;保存ACC
009E 8FE0            101                MOV ACC,R7                   ;将R7中的数发送出去
00A0 7E08            102                MOV R6,#08H                  ;往2401发送数据
00A2 33              103     R2SLOP1:   RLC A                        ;将ACC中的数据移到数据线上
00A3 9297            104                MOV SDA,C                    ;送出数据
00A5 3112            105                ACALL D15US
00A7 D296            106                SETB SCL                     ;发送串行时钟进行写操作
00A9 3112            107                ACALL D15US
00AB C296            108                CLR SCL
00AD DEF3            109                DJNZ R6,R2SLOP1              ;串行发送8 BIT
00AF D297            110                SETB SDA                     ;准备接收ACK
00B1 3112            111                ACALL D15US
00B3 D296            112                SETB SCL                     ;接收ACK的时钟
00B5 3112            113                ACALL D15US
00B7 A297            114     R2SLOP2:   MOV C,SDA                    ;写完后等待确认信号 ACK
00B9 40FC            115                JC R2SLOP2
00BB C296            116                CLR SCL                      ;为下一步其它操作做准备
00BD C297            117                CLR SDA
00BF D0E0            118                POP ACC                      ;还原ACC
00C1 3181            119                ACALL D1MS                   ;等待内部写完
00C3 22              120                RET
                     121     ;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
                     122     ;读2401.地址在I2CADD;读出数据在R7
                     123     ;------------------------------------------------------------------
00C4 11DE            124     I2CREAD:   ACALL R2STAR                 ;写状态字
A51 MACRO ASSEMBLER  24I2C                                                                  12/05/03 19:09:36 PAGE     3

00C6 7FA0            125                MOV R7,#10100000B            ;SET 2401=WRI
00C8 119C            126                ACALL R2SEND                 ;送出状态字
00CA E520            127                MOV A,I2CADD                 ;上程序传来的读取地址
00CC FF              128                MOV R7,A                     ;地址数据送R7
00CD 119C            129                ACALL R2SEND                 ;送出数据
00CF D297            130                SETB SDA
00D1 D296            131                SETB SCL                     ;保证SDA/SCL起始=1
00D3 11DE            132                ACALL R2STAR
00D5 7FA1            133                MOV R7,#10100001B            ;0A1H                 ;读状态
00D7 119C            134                ACALL R2SEND
00D9 11E9            135                ACALL R2READ                 ;读所需的数
00DB 3107            136                ACALL R2STOP
00DD 22              137                RET
                     138     ;**************************************************************
                     139     ;设置开始 ,初始SDA &SCL=1,结束 SDA & SCL=0
                     140     ;--------------------------------------------------------------
00DE 3112            141     R2STAR:    ACALL D15US                  ;对2401操作开始
00E0 C297            142                CLR SDA                      ;在SCL=1时,SDA由1变为0表示开始
00E2 3112            143                ACALL D15US
00E4 C296            144                CLR SCL
00E6 3112            145                ACALL D15US
00E8 22              146                RET
                     147     ;----------------------------------------------------------------
                     148     ;读取1字节数据
                     149     ;----------------------------------------------------------------
00E9 C0E0            150     R2READ:    PUSH ACC                     ;保存ACC
00EB 7E08            151                MOV R6,#08H
00ED D297            152     R2RLOP1:   SETB SDA                     ;置数据线=1
00EF 3112            153                ACALL D15US
00F1 D296            154                SETB SCL                     ;输出一个串行时钟
00F3 3112            155                ACALL D15US
00F5 A297            156                MOV C,SDA                    ;读数据线上的数据到 C
00F7 33              157                RLC A                        ;移到 ACC
00F8 3112            158                ACALL D15US
00FA C296            159                CLR SCL
00FC DEEF            160                DJNZ R6,R2RLOP1              ;读 8 BIT 数据
00FE 3112            161                ACALL D15US

⌨️ 快捷键说明

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