📄 24i2c.lst
字号:
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 + -