📄 24c04-p0-p2-led.lst
字号:
A51 MACRO ASSEMBLER 24C04_P0_P2_LED 01/09/2007 19:55:39 PAGE 1
MACRO ASSEMBLER A51 V8.00
OBJECT MODULE PLACED IN 24C04-P0-P2-LED.OBJ
ASSEMBLER INVOKED BY: C:\Keil\C51\BIN\A51.EXE 24C04-P0-P2-LED.asm SET(SMALL) DEBUG EP
LOC OBJ LINE SOURCE
1 ;*******************************************************************
2 ;* *
3 ;* ME500单片机开发系统演示程序 - 多花样流水灯 *
4 ;* *
5 ;* P0,P2 LED显示 *
6 ;* *
7 ;* 用数据块写方式将数据写入24C04芯片内,再将其数据读出送LED显示。 *
8 ;* *
9 ;* 邮箱: gguoqing@willar.com *
10 ;* 网站: http://www.willar.com *
11 ;* 作者: gguoqing *
12 ;* 时间: 2007/01/08 *
13 ;* *
14 ;*【版权】Copyright(C)伟纳电子 www.willar.com All Rights Reserved *
15 ;*【声明】此程序仅用于学习与参考,引用请注明版权和作者信息! *
16 ;* *
17 ;*******************************************************************
18 ;* *
19 ;* 24C04的写入数据块最大字节数n为16,一次写入的字节数m不能多于n. *
20 ;* *
21 ;*******************************************************************
22
00B5 23 SDA BIT P3.5 ;定义24C04数据线
00B4 24 SCL BIT P3.4 ;定义24C04时钟线
25
002A 26 TEMP EQU 2AH
0030 27 DISP EQU 30H ;数据存放首地址
28
00A0 29 SLAW DATA 0A0H ;写控制字节 (第一页)
00A1 30 SLAR DATA 0A1H ;读控制字节
31
32 ; SLAW DATA 0A2H ;写控制字节 (第二页)
33 ; SLAR DATA 0A3H ;读控制字节
34
35 ;**********************************************************
36
0000 37 ORG 0000H
0000 0130 38 AJMP MAIN
0030 39 ORG 0030H
40
41 ;**********************************************************
0030 42 MAIN:
0030 758170 43 MOV SP,#70H
0033 7580FF 44 MOV P0,#0FFH
45
0036 752A00 46 MOV TEMP,#00H
0039 900143 47 MOV DPTR,#TAB1
003C 116A 48 ACALL WRITE_DATA
49
003E 752A10 50 MOV TEMP,#10H
0041 900153 51 MOV DPTR,#TAB2
0044 116A 52 ACALL WRITE_DATA
53
0046 752A20 54 MOV TEMP,#20H
0049 900163 55 MOV DPTR,#TAB3
004C 116A 56 ACALL WRITE_DATA
57
004E 752A30 58 MOV TEMP,#30H
A51 MACRO ASSEMBLER 24C04_P0_P2_LED 01/09/2007 19:55:39 PAGE 2
0051 900173 59 MOV DPTR,#TAB4
0054 116A 60 ACALL WRITE_DATA
61
0056 1194 62 ACALL READ_DATA
0058 63 MAIN1:
0058 7830 64 MOV R0,#DISP
005A 7940 65 MOV R1,#64
005C 66 MAIN2:
005C E6 67 MOV A,@R0
005D F580 68 MOV P0,A
005F F5A0 69 MOV P2,A
0061 7C3C 70 MOV R4,#60
0063 3138 71 CALL DELAY_5MS
0065 08 72 INC R0
0066 D9F4 73 DJNZ R1,MAIN2
0068 80EE 74 JMP MAIN1
75
76 ;**********************************************************
77
78 ; 写16字节数据子程序
79 ; 查表写数据入24C04
80
81 ;**********************************************************
006A 82 WRITE_DATA:
006A 7910 83 MOV R1,#16 ;写入16个字节的数据
84
006C 3118 85 CALL I2C_START
86
006E 74A0 87 MOV A,#SLAW ;写入控制字节
0070 11DC 88 CALL SENDBYTE
0072 3106 89 CALL I2C_CASK
0074 20D5F3 90 JB F0,WRITE_DATA
91
0077 E52A 92 MOV A,TEMP ;写入I2C单元地址
0079 11DC 93 CALL SENDBYTE
007B 3106 94 CALL I2C_CASK
007D 20D5EA 95 JB F0,WRITE_DATA
0080 96 WR_LOOP:
0080 E4 97 CLR A
0081 93 98 MOVC A,@A+DPTR
0082 11DC 99 CALL SENDBYTE ;写入数据
0084 3106 100 CALL I2C_CASK
0086 20D5E1 101 JB F0,WRITE_DATA
0089 08 102 INC R0 ;地址+1
008A A3 103 INC DPTR ;数据指针+1
008B D9F3 104 DJNZ R1,WR_LOOP ;16个数写入完毕?
105
008D 3126 106 CALL I2C_STOP
008F 7C02 107 MOV R4,#2 ;延时若干MS
0091 3138 108 CALL DELAY_5MS
0093 22 109 RET
110
111 ;**********************************************************
112
113 ; 读N字节数据子程序
114 ; 从24C04读出数据,存放在首地址为30H的单元内。
115
116 ;**********************************************************
0094 117 READ_DATA:
0094 3118 118 CALL I2C_START
119
0096 74A0 120 MOV A,#SLAW ;写入写控制字节
0098 11DC 121 CALL SENDBYTE
009A 3106 122 CALL I2C_CASK
009C 20D5F5 123 JB F0,READ_DATA
124
A51 MACRO ASSEMBLER 24C04_P0_P2_LED 01/09/2007 19:55:39 PAGE 3
009F 7400 125 MOV A,#00H ;写入I2C单元地址
00A1 11DC 126 CALL SENDBYTE
00A3 3106 127 CALL I2C_CASK
00A5 20D5EC 128 JB F0,READ_DATA
129
00A8 3118 130 CALL I2C_START
131
00AA 74A1 132 MOV A,#SLAR ;写入读控制字节
00AC 11DC 133 CALL SENDBYTE
00AE 3106 134 CALL I2C_CASK
00B0 20D5E1 135 JB F0,READ_DATA
136
00B3 7830 137 MOV R0,#DISP ;设定存放数据单元
00B5 7940 138 MOV R1,#64 ;设定读取个数
00B7 139 RE_LOOP:
00B7 11CA 140 CALL RCVBYTE ;读取字节数据
00B9 F6 141 MOV @R0,A ;存放数据
00BA D905 142 DJNZ R1,RE_LOOP1
00BC 11F9 143 CALL I2C_NACK ;发送非应答位
00BE 3126 144 CALL I2C_STOP
00C0 22 145 RET
00C1 146 RE_LOOP1:
00C1 11EC 147 CALL I2C_ACK ;发送应答位
00C3 08 148 INC R0
00C4 7C01 149 MOV R4,#1 ;延时若干MS
00C6 3138 150 CALL DELAY_5MS
00C8 80ED 151 JMP RE_LOOP
152
153 ;**********************************************************
154
155 ;从IIC总线上接收一个字节数据
156 ;出口参数:A---接收数据存放在A中
157
158 ;**********************************************************
00CA 159 RCVBYTE:
00CA 7F08 160 MOV R7,#08 ;一个字节共接收8位数据
00CC 161 R_BYTE:
00CC D2B5 162 SETB SDA ;置SDA为输入方式
00CE D2B4 163 SETB SCL
00D0 00 164 NOP
00D1 00 165 NOP
00D2 00 166 NOP
00D3 00 167 NOP
00D4 A2B5 168 MOV C,SDA ;将SDA状态读入C
00D6 33 169 RLC A ;结果移入A
00D7 C2B4 170 CLR SCL ;SCL=0,继续接收数据
00D9 DFF1 171 DJNZ R7,R_BYTE ;判断8位数据是否接收完全?
00DB 22 172 RET
173
174 ;**********************************************************
175
176 ;向IIC总线发送一个字节数据
177 ;入口参数:A---待发送数据存放在A中
178
179 ;**********************************************************
00DC 180 SENDBYTE:
00DC 7F08 181 MOV R7,#08 ;8位数据长度送R7
00DE 182 S_BYTE:
00DE 33 183 RLC A ;A左移,发送位加入C
00DF 92B5 184 MOV SDA,C
00E1 D2B4 185 SETB SCL
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -