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

📄 main.src

📁 《Proteus在MCS-51&ARM7系统中的应用百例》逆向之 Chapter 8 《Proteus在MCS-51&ARM7系统中的应用百例》MCS-51例子的C语言版本。 最
💻 SRC
字号:
; .\main.SRC generated from: main.c
; COMPILER INVOKED BY:
;        D:\Program Files\Keil 8.08\C51\BIN\C51.EXE main.c BROWSE DEBUG OBJECTEXTEND SRC(.\main.SRC)

$NOMOD51

NAME	MAIN

P0	DATA	080H
P1	DATA	090H
P2	DATA	0A0H
P3	DATA	0B0H
T0	BIT	0B0H.4
AC	BIT	0D0H.6
T1	BIT	0B0H.5
EA	BIT	0A8H.7
IE	DATA	0A8H
RD	BIT	0B0H.7
ES	BIT	0A8H.4
IP	DATA	0B8H
RI	BIT	098H.0
INT0	BIT	0B0H.2
CY	BIT	0D0H.7
TI	BIT	098H.1
INT1	BIT	0B0H.3
PS	BIT	0B8H.4
SP	DATA	081H
OV	BIT	0D0H.2
WR	BIT	0B0H.6
SBUF	DATA	099H
PCON	DATA	087H
SCON	DATA	098H
TMOD	DATA	089H
TCON	DATA	088H
IE0	BIT	088H.1
IE1	BIT	088H.3
B	DATA	0F0H
ACC	DATA	0E0H
ET0	BIT	0A8H.1
ET1	BIT	0A8H.3
TF0	BIT	088H.5
TF1	BIT	088H.7
RB8	BIT	098H.2
TH0	DATA	08CH
EX0	BIT	0A8H.0
IT0	BIT	088H.0
TH1	DATA	08DH
TB8	BIT	098H.3
EX1	BIT	0A8H.2
IT1	BIT	088H.2
P	BIT	0D0H.0
SM0	BIT	098H.7
TL0	DATA	08AH
SM1	BIT	098H.6
TL1	DATA	08BH
SM2	BIT	098H.5
PT0	BIT	0B8H.1
PT1	BIT	0B8H.3
RS0	BIT	0D0H.3
TR0	BIT	088H.4
RS1	BIT	0D0H.4
TR1	BIT	088H.6
SDA	BIT	090H.5
PX0	BIT	0B8H.0
PX1	BIT	0B8H.2
DPH	DATA	083H
DPL	DATA	082H
SCL	BIT	090H.4
REN	BIT	098H.4
RXD	BIT	0B0H.0
TXD	BIT	0B0H.1
F0	BIT	0D0H.5
PSW	DATA	0D0H
?PR?main?MAIN        SEGMENT CODE 
?PR?IWRNBYTE?MAIN    SEGMENT CODE 
?DT?IWRNBYTE?MAIN    SEGMENT DATA OVERLAYABLE 
?PR?IRDNBYTE?MAIN    SEGMENT CODE 
?DT?IRDNBYTE?MAIN    SEGMENT DATA OVERLAYABLE 
?PR?START?MAIN       SEGMENT CODE 
?PR?STOP?MAIN        SEGMENT CODE 
?PR?MACK?MAIN        SEGMENT CODE 
?PR?MNACK?MAIN       SEGMENT CODE 
?PR?CACK?MAIN        SEGMENT CODE 
?PR?_WRBYTE?MAIN     SEGMENT CODE 
?PR?RDBYTE?MAIN      SEGMENT CODE 
?DT?MAIN             SEGMENT DATA 
?BI?MAIN             SEGMENT BIT 
	EXTRN	CODE (?C_STARTUP)
	PUBLIC	MTD
	PUBLIC	MRD
	PUBLIC	SLA
	PUBLIC	ACK
	PUBLIC	SUBA
	PUBLIC	NUMBYTE
	PUBLIC	RDBYTE
	PUBLIC	_WRBYTE
	PUBLIC	CACK
	PUBLIC	MNACK
	PUBLIC	MACK
	PUBLIC	STOP
	PUBLIC	START
	PUBLIC	IRDNBYTE
	PUBLIC	IWRNBYTE
	PUBLIC	main

	RSEG  ?DT?IRDNBYTE?MAIN
?IRDNBYTE?BYTE:
     offset?247:   DS   1
	ORG  1
        num?248:   DS   1

	RSEG  ?DT?IWRNBYTE?MAIN
?IWRNBYTE?BYTE:
          i?145:   DS   1
	ORG  1
     offset?146:   DS   1

	RSEG  ?DT?MAIN
        NUMBYTE:   DS   1
           SUBA:   DS   1
            SLA:   DS   1
            MRD:   DS   15
            MTD:   DS   15

	RSEG  ?BI?MAIN
            ACK:   DBIT   1
; #include <reg51.h>
; #include <intrins.h>
; 
; typedef unsigned char BYTE;
; 
; sbit SDA=P1^5;
; sbit SCL=P1^4;
; bit ACK;
; BYTE SLA;
; BYTE SUBA;
; BYTE NUMBYTE;
; 
; BYTE MTD[0x0F];
; BYTE MRD[0x0F];
; 
; 
; void IWRNBYTE();
; void IRDNBYTE();
; void START();
; void STOP();
; void MACK();
; void MNACK();
; void CACK();
; void WRBYTE(BYTE in);
; BYTE RDBYTE();
; 
; 
; 
; main()

	RSEG  ?PR?main?MAIN
main:
	USING	0
			; SOURCE LINE # 29
; {
			; SOURCE LINE # 30
; 	BYTE delay=0xF0;
			; SOURCE LINE # 31
;---- Variable 'delay?040' assigned to Register 'R7' ----
	MOV  	R7,#0F0H
; 	BYTE offset=0;
			; SOURCE LINE # 32
;---- Variable 'offset?041' assigned to Register 'R6' ----
	CLR  	A
	MOV  	R6,A
?C0001:
; 	BYTE i,j,k;
; 
; 	while(--delay);
			; SOURCE LINE # 35
	DJNZ 	R7,?C0001
?C0003:
; 
; 	while(offset<0x10)
			; SOURCE LINE # 37
	MOV  	A,R6
	CLR  	C
	SUBB 	A,#010H
	JNC  	?C0004
; 	{
			; SOURCE LINE # 38
; 		MTD[offset]=offset;	
			; SOURCE LINE # 39
	MOV  	A,#LOW (MTD)
	ADD  	A,R6
	MOV  	R0,A
	MOV  	@R0,AR6
; 	}
			; SOURCE LINE # 40
	SJMP 	?C0003
?C0004:
; 
; 	SLA=0xA0;
			; SOURCE LINE # 42
	MOV  	SLA,#0A0H
; 	SUBA=0x30;
			; SOURCE LINE # 43
	MOV  	SUBA,#030H
; 	NUMBYTE=16;
			; SOURCE LINE # 44
	MOV  	NUMBYTE,#010H
; 	IWRNBYTE();
			; SOURCE LINE # 45
	LCALL	IWRNBYTE
; 
; 	i=20;
			; SOURCE LINE # 47
;---- Variable 'i?042' assigned to Register 'R7' ----
	MOV  	R7,#014H
?C0007:
; 
; 	do
; 	{
			; SOURCE LINE # 50
; 		j=248;
			; SOURCE LINE # 51
;---- Variable 'j?043' assigned to Register 'R6' ----
	MOV  	R6,#0F8H
?C0010:
; 		do
; 		{
			; SOURCE LINE # 53
; 			k=248;
			; SOURCE LINE # 54
;---- Variable 'k?044' assigned to Register 'R5' ----
	MOV  	R5,#0F8H
; 			do
; 			{}while(--k);
			; SOURCE LINE # 56
?C0011:
	DJNZ 	R5,?C0011
; 		}while(--j);
			; SOURCE LINE # 57
	DJNZ 	R6,?C0010
; 	}while(--i);
			; SOURCE LINE # 58
	DJNZ 	R7,?C0007
; 
; 	SLA=0xA0;
			; SOURCE LINE # 60
	MOV  	SLA,#0A0H
; 	SUBA=0x30;
			; SOURCE LINE # 61
	MOV  	SUBA,#030H
; 	NUMBYTE=16;
			; SOURCE LINE # 62
	MOV  	NUMBYTE,#010H
; 	IRDNBYTE();
			; SOURCE LINE # 63
	LJMP 	IRDNBYTE
; END OF main

; }
; 
; 
; void IWRNBYTE()

	RSEG  ?PR?IWRNBYTE?MAIN
IWRNBYTE:
	USING	0
			; SOURCE LINE # 67
; {
			; SOURCE LINE # 68
; 	BYTE i;
; 	BYTE offset;
; 
; dd:
			; SOURCE LINE # 72
?IWRNBYTE?dd:
; 	i=NUMBYTE;
			; SOURCE LINE # 73
	MOV  	i?145,NUMBYTE
; 	offset=0;
			; SOURCE LINE # 74
	CLR  	A
	MOV  	offset?146,A
; 
; 	START();
			; SOURCE LINE # 76
	LCALL	START
; 	WRBYTE(SLA);
			; SOURCE LINE # 77
	MOV  	R7,SLA
	LCALL	_WRBYTE
; 	CACK();
			; SOURCE LINE # 78
	LCALL	CACK
; 	if(!ACK)
			; SOURCE LINE # 79
	JB   	ACK,?C0016
; 	{
			; SOURCE LINE # 80
; 		STOP(); return;	
			; SOURCE LINE # 81
	SJMP 	?C0045
; 	}
			; SOURCE LINE # 82
?C0016:
; 	WRBYTE(SUBA);
			; SOURCE LINE # 83
	MOV  	R7,SUBA
	LCALL	_WRBYTE
; 	CACK();
			; SOURCE LINE # 84
	LCALL	CACK
?C0020:
; 
; 	do
; 	{	
			; SOURCE LINE # 87
; 		WRBYTE(MTD[offset]);
			; SOURCE LINE # 88
	MOV  	A,#LOW (MTD)
	ADD  	A,offset?146
	MOV  	R0,A
	MOV  	A,@R0
	MOV  	R7,A
	LCALL	_WRBYTE
; 		CACK();
			; SOURCE LINE # 89
	LCALL	CACK
; 		if(!ACK) goto dd;
			; SOURCE LINE # 90
	JNB  	ACK,?IWRNBYTE?dd
?C0021:
; 		offset++; 		
			; SOURCE LINE # 91
	INC  	offset?146
; 	}while(--i);
			; SOURCE LINE # 92
	DJNZ 	i?145,?C0020
; 
; 	STOP();
			; SOURCE LINE # 94
?C0045:
	LCALL	STOP
; }
			; SOURCE LINE # 95
?C0017:
	RET  	
; END OF IWRNBYTE

; 
; void IRDNBYTE()

	RSEG  ?PR?IRDNBYTE?MAIN
IRDNBYTE:
	USING	0
			; SOURCE LINE # 97
; {
			; SOURCE LINE # 98
; 	BYTE offset;
; 	BYTE num;
; qq:
			; SOURCE LINE # 101
?IRDNBYTE?qq:
; 	offset=0;
			; SOURCE LINE # 102
	CLR  	A
	MOV  	offset?247,A
; 	num=NUMBYTE;
			; SOURCE LINE # 103
	MOV  	num?248,NUMBYTE
; 	
; 
; 	START();
			; SOURCE LINE # 106
	LCALL	START
; 	WRBYTE(SLA);
			; SOURCE LINE # 107
	MOV  	R7,SLA
	LCALL	_WRBYTE
; 	CACK();
			; SOURCE LINE # 108
	LCALL	CACK
; 	if(!ACK) 
			; SOURCE LINE # 109
	JB   	ACK,?C0023
; 	{
			; SOURCE LINE # 110
; 		STOP();
			; SOURCE LINE # 111
	SJMP 	?C0046
; 		return;	
; 	}
			; SOURCE LINE # 113
?C0023:
; 	WRBYTE(SUBA);
			; SOURCE LINE # 114
	MOV  	R7,SUBA
	LCALL	_WRBYTE
;     CACK();
			; SOURCE LINE # 115
	LCALL	CACK
; 	START();
			; SOURCE LINE # 116
	LCALL	START
;     WRBYTE(++SLA);
			; SOURCE LINE # 117
	INC  	SLA
	MOV  	R7,SLA
	LCALL	_WRBYTE
; 	CACK();
			; SOURCE LINE # 118
	LCALL	CACK
; 	if(!ACK) goto qq;
			; SOURCE LINE # 119
	JNB  	ACK,?IRDNBYTE?qq
?C0028:
; 
; 	do
; 	{
			; SOURCE LINE # 122
; 		MRD[offset]=RDBYTE;	
			; SOURCE LINE # 123
	MOV  	A,#LOW (MRD)
	ADD  	A,offset?247
	MOV  	R0,A
	MOV  	@R0,#LOW (RDBYTE)
; 		MACK();
			; SOURCE LINE # 124
	LCALL	MACK
; 		offset++;
			; SOURCE LINE # 125
	INC  	offset?247
; 	}while(--num);
			; SOURCE LINE # 126
	DJNZ 	num?248,?C0028
; 
; 	MNACK();
			; SOURCE LINE # 128
	LCALL	MNACK
; 	STOP();
			; SOURCE LINE # 129
?C0046:
	LCALL	STOP
; }
			; SOURCE LINE # 130
?C0024:
	RET  	
; END OF IRDNBYTE

; 
; void START()

	RSEG  ?PR?START?MAIN
START:
			; SOURCE LINE # 132
; {
			; SOURCE LINE # 133
; 	SDA=1;		//发送起始条件数据信号
			; SOURCE LINE # 134
	SETB 	SDA
; 	_nop_();	//起始条件建立时间大于4.7us
			; SOURCE LINE # 135
	NOP  	
; 	SCL=1;		//发送起始条件的时钟信号
			; SOURCE LINE # 136
	SETB 	SCL
; 	_nop_();					
			; SOURCE LINE # 137
	NOP  	
; 	_nop_();
			; SOURCE LINE # 138
	NOP  	
; 	_nop_();
			; SOURCE LINE # 139
	NOP  	
; 	_nop_();
			; SOURCE LINE # 140
	NOP  	
; 	_nop_();	//起始条件锁定时间大于4.7us
			; SOURCE LINE # 141
	NOP  	
; 	SDA=0;		//发送起始信号
			; SOURCE LINE # 142
	CLR  	SDA
; 	_nop_();
			; SOURCE LINE # 143
	NOP  	
; 	_nop_();
			; SOURCE LINE # 144
	NOP  	
; 	_nop_();
			; SOURCE LINE # 145
	NOP  	
; 	_nop_();	//起始条件锁定时间大于4.7us
			; SOURCE LINE # 146
	NOP  	
; 	SCL=0;		//钳住I2C总线,准备发送或接收数据
			; SOURCE LINE # 147
	CLR  	SCL
; 	_nop_();
			; SOURCE LINE # 148
	NOP  	
; }
			; SOURCE LINE # 149
	RET  	
; END OF START

; 
; void STOP()

	RSEG  ?PR?STOP?MAIN
STOP:
			; SOURCE LINE # 151
; {
			; SOURCE LINE # 152
; 	SDA=0; 		//发送停止条件的数据信号
			; SOURCE LINE # 153
	CLR  	SDA
; 	_nop_();			   	
			; SOURCE LINE # 154
	NOP  	
; 	_nop_();
			; SOURCE LINE # 155
	NOP  	
; 	SCL=1; 		//发送停止条件的时钟信号
			; SOURCE LINE # 156
	SETB 	SCL
; 	_nop_();
			; SOURCE LINE # 157
	NOP  	
; 	_nop_();
			; SOURCE LINE # 158
	NOP  	
; 	_nop_();
			; SOURCE LINE # 159
	NOP  	
; 	_nop_();
			; SOURCE LINE # 160
	NOP  	
; 	_nop_();	//起始条件建立时间大于4.7us
			; SOURCE LINE # 161
	NOP  	
; 	SDA=1; 		//发送I2C总线停止信号
			; SOURCE LINE # 162
	SETB 	SDA
; 	_nop_();
			; SOURCE LINE # 163
	NOP  	
; 	_nop_();
			; SOURCE LINE # 164
	NOP  	
; 	_nop_();
			; SOURCE LINE # 165
	NOP  	
; 	_nop_();
			; SOURCE LINE # 166
	NOP  	
; 	_nop_();	
			; SOURCE LINE # 167
	NOP  	
; }
			; SOURCE LINE # 168
	RET  	
; END OF STOP

; 
; void MACK()

	RSEG  ?PR?MACK?MAIN
MACK:
			; SOURCE LINE # 170
; {
			; SOURCE LINE # 171
; 	SDA=0;		//将SDA置0
			; SOURCE LINE # 172
	CLR  	SDA
; 	_nop_();
			; SOURCE LINE # 173
	NOP  	
; 	_nop_();
			; SOURCE LINE # 174
	NOP  	
; 	SCL=1;
			; SOURCE LINE # 175
	SETB 	SCL
; 	_nop_();
			; SOURCE LINE # 176
	NOP  	
; 	_nop_();
			; SOURCE LINE # 177
	NOP  	
; 	_nop_();
			; SOURCE LINE # 178
	NOP  	
; 	_nop_();
			; SOURCE LINE # 179
	NOP  	
; 	_nop_();	//保持数据时间,大于4.7us
			; SOURCE LINE # 180
	NOP  	
; 	SCL=0;
			; SOURCE LINE # 181
	CLR  	SCL
; 	_nop_();
			; SOURCE LINE # 182
	NOP  	
; 	_nop_();
			; SOURCE LINE # 183
	NOP  	
; }
			; SOURCE LINE # 184
	RET  	
; END OF MACK

; 
; void MNACK()

	RSEG  ?PR?MNACK?MAIN
MNACK:
			; SOURCE LINE # 186
; {
			; SOURCE LINE # 187
; 	SDA=1;		//将SDA置1
			; SOURCE LINE # 188
	SETB 	SDA
; 	_nop_();
			; SOURCE LINE # 189
	NOP  	
; 	_nop_();
			; SOURCE LINE # 190
	NOP  	
; 	SCL=1;
			; SOURCE LINE # 191
	SETB 	SCL
; 	_nop_();
			; SOURCE LINE # 192
	NOP  	
; 	_nop_();
			; SOURCE LINE # 193
	NOP  	
; 	_nop_();
			; SOURCE LINE # 194
	NOP  	
; 	_nop_();
			; SOURCE LINE # 195
	NOP  	
; 	_nop_();
			; SOURCE LINE # 196
	NOP  	
; 	SCL=0;		//保持数据时间,大于4.7us
			; SOURCE LINE # 197
	CLR  	SCL
; 	_nop_();
			; SOURCE LINE # 198
	NOP  	
; 	_nop_();
			; SOURCE LINE # 199
	NOP  	
; }
			; SOURCE LINE # 200
	RET  	
; END OF MNACK

; 
; void CACK()

	RSEG  ?PR?CACK?MAIN
CACK:
			; SOURCE LINE # 202
; {
			; SOURCE LINE # 203
; 	SDA=1;
			; SOURCE LINE # 204
	SETB 	SDA
; 	_nop_();
			; SOURCE LINE # 205
	NOP  	
; 	_nop_();
			; SOURCE LINE # 206
	NOP  	
; 	SCL=1;
			; SOURCE LINE # 207
	SETB 	SCL
; 	ACK=0;
			; SOURCE LINE # 208
	CLR  	ACK
; 	_nop_();
			; SOURCE LINE # 209
	NOP  	
; 	_nop_();
			; SOURCE LINE # 210
	NOP  	
; 
; 	if(SDA)
			; SOURCE LINE # 212
	JNB  	SDA,?C0033
; 		ACK=1;
			; SOURCE LINE # 213
	SETB 	ACK
?C0033:
; 	_nop_();
			; SOURCE LINE # 214
	NOP  	
; 	SCL=0;
			; SOURCE LINE # 215
	CLR  	SCL
; 	_nop_();			
			; SOURCE LINE # 216
	NOP  	
; }
			; SOURCE LINE # 217
	RET  	
; END OF CACK

; 
; void WRBYTE(BYTE in)

	RSEG  ?PR?_WRBYTE?MAIN
_WRBYTE:
	USING	0
			; SOURCE LINE # 219
;---- Variable 'in?849' assigned to Register 'R7' ----
; {
			; SOURCE LINE # 220
; 	BYTE num=8;
			; SOURCE LINE # 221
;---- Variable 'num?850' assigned to Register 'R6' ----
	MOV  	R6,#08H
; 	ACC=in;
			; SOURCE LINE # 222
	MOV  	A,R7
?C0037:
; 
; 	do
; 	{
			; SOURCE LINE # 225
; 		#pragma asm
; 			RLC A
	  RLC A
; 		#pragma endasm
; 	
; 		if(CY)
			; SOURCE LINE # 230
	JNB  	CY,?C0038
; 		{
			; SOURCE LINE # 231
; 			SDA=1;			
			; SOURCE LINE # 232
	SETB 	SDA
; 			_nop_();
			; SOURCE LINE # 233
; 			SCL=1;
			; SOURCE LINE # 234
; 			_nop_();
			; SOURCE LINE # 235
; 			_nop_();
			; SOURCE LINE # 236
; 			_nop_();
			; SOURCE LINE # 237
; 			_nop_();
			; SOURCE LINE # 238
; 			_nop_();
			; SOURCE LINE # 239
; 			SCL=0;
			; SOURCE LINE # 240
; 		}
			; SOURCE LINE # 241
	SJMP 	?C0047
?C0038:
; 		else
; 		{
			; SOURCE LINE # 243
; 			SDA=0;		
			; SOURCE LINE # 244
	CLR  	SDA
; 			_nop_();
			; SOURCE LINE # 245
?C0047:
	NOP  	
; 			SCL=1;
			; SOURCE LINE # 246
	SETB 	SCL
; 			_nop_();
			; SOURCE LINE # 247
	NOP  	
; 			_nop_();
			; SOURCE LINE # 248
	NOP  	
; 			_nop_();
			; SOURCE LINE # 249
	NOP  	
; 			_nop_();
			; SOURCE LINE # 250
	NOP  	
; 			_nop_();
			; SOURCE LINE # 251
	NOP  	
; 			SCL=0;	
			; SOURCE LINE # 252
	CLR  	SCL
; 		}
			; SOURCE LINE # 253
; 	}while(--num);
			; SOURCE LINE # 254
?C0035:
	DJNZ 	R6,?C0037
; 	
; 		
; }
			; SOURCE LINE # 257
	RET  	
; END OF _WRBYTE

; 
; BYTE RDBYTE()

	RSEG  ?PR?RDBYTE?MAIN
RDBYTE:
	USING	0
			; SOURCE LINE # 259
; {
			; SOURCE LINE # 260
; 	BYTE num=8;
			; SOURCE LINE # 261
;---- Variable 'num?951' assigned to Register 'R7' ----
	MOV  	R7,#08H
?C0043:
; 	
; 	do
; 	{
			; SOURCE LINE # 264
; 		SDA=1;
			; SOURCE LINE # 265
	SETB 	SDA
; 		_nop_();
			; SOURCE LINE # 266
	NOP  	
; 		SCL=1;		//	时钟线为高,接收数据位
			; SOURCE LINE # 267
	SETB 	SCL
; 		_nop_();
			; SOURCE LINE # 268
	NOP  	
; 		_nop_();
			; SOURCE LINE # 269
	NOP  	
; 		CY=SDA;
			; SOURCE LINE # 270
	MOV  	C,SDA
; 		SCL=0;
			; SOURCE LINE # 271
	CLR  	SCL
; 		
; 		#pragma asm
; 			RLC A
	  RLC A
; 		#pragma endasm
; 		
; 		_nop_();
			; SOURCE LINE # 277
	NOP  	
; 		_nop_();
			; SOURCE LINE # 278
	NOP  	
; 		_nop_();
			; SOURCE LINE # 279
	NOP  	
; 	}while(--num);
			; SOURCE LINE # 280
	DJNZ 	R7,?C0043
; 
; 	return ACC;	
			; SOURCE LINE # 282
	MOV  	R7,A
; }			; SOURCE LINE # 283
?C0044:
	RET  	
; END OF RDBYTE

	END

⌨️ 快捷键说明

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