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

📄 main.src

📁 实验7 在RAM中执行程序代码 实验7 在RAM中执行程序代码 实验7 在RAM中执行程序代码
💻 SRC
📖 第 1 页 / 共 2 页
字号:
	ADD  	A,#08H
	MOV  	R0,A
	MOVX 	A,@R0
	MOV  	R7,A
	LCALL	_toint
	POP  	ACC
	ADD  	A,R7
	MOV  	t?744,A
; 	if ( (t==0) || (t==1) )
			; SOURCE LINE # 155
	JZ   	?C0013
	CJNE 	A,#01H,?C0012
?C0013:
; 	{
			; SOURCE LINE # 156
; 		cc += t;
			; SOURCE LINE # 157
	MOV  	A,t?744
	ADD  	A,cc?746
	MOV  	cc?746,A
; 		IntelHEX->tt = t;
			; SOURCE LINE # 158
	MOV  	A,IntelHEX?740
	ADD  	A,#03H
	MOV  	R0,A
	MOV  	@R0,t?744
; 	}
			; SOURCE LINE # 159
	SJMP 	?C0014
?C0012:
; 	else
; 	{
			; SOURCE LINE # 161
; 		return 0;
			; SOURCE LINE # 162
	CLR  	C
	RET  	
; 	}
			; SOURCE LINE # 163
?C0014:
; //提取数据
; 	i = 9;
			; SOURCE LINE # 165
	MOV  	i?742,#09H
; 	if ( t == 0 )
			; SOURCE LINE # 166
	MOV  	A,t?744
	JNZ  	?C0015
; 	{
			; SOURCE LINE # 167
; 		j = 0;
			; SOURCE LINE # 168
	MOV  	j?743,A
; 		n = IntelHEX->ll;
			; SOURCE LINE # 169
	MOV  	R0,IntelHEX?740
	MOV  	A,@R0
	MOV  	n?745,A
?C0018:
; 		do
; 		{
			; SOURCE LINE # 171
; 			t = (toint(hex[i++])<<4);
			; SOURCE LINE # 172
	MOV  	R7,i?742
	INC  	i?742
	MOV  	A,hex?741
	ADD  	A,R7
	MOV  	R0,A
	MOVX 	A,@R0
	MOV  	R7,A
	LCALL	_toint
	MOV  	A,R7
	SWAP 	A
	ANL  	A,#0F0H
	MOV  	t?744,A
; 			t += toint(hex[i++]);
			; SOURCE LINE # 173
	MOV  	R7,i?742
	INC  	i?742
	MOV  	A,hex?741
	ADD  	A,R7
	MOV  	R0,A
	MOVX 	A,@R0
	MOV  	R7,A
	LCALL	_toint
	MOV  	A,R7
	ADD  	A,t?744
	MOV  	t?744,A
; 			cc += t;
			; SOURCE LINE # 174
	ADD  	A,cc?746
	MOV  	cc?746,A
; 			IntelHEX->dd[j++] = t;
			; SOURCE LINE # 175
	MOV  	R7,j?743
	INC  	j?743
	MOV  	A,IntelHEX?740
	ADD  	A,#04H
	ADD  	A,R7
	MOV  	R0,A
	MOV  	@R0,t?744
; 		} while ( --n != 0 );
			; SOURCE LINE # 176
	DJNZ 	n?745,?C0018
; 	}
			; SOURCE LINE # 177
?C0015:
; //提取校验和
; 	t = (toint(hex[i++])<<4);
			; SOURCE LINE # 179
	MOV  	R7,i?742
	INC  	i?742
	MOV  	A,hex?741
	ADD  	A,R7
	MOV  	R0,A
	MOVX 	A,@R0
	MOV  	R7,A
	LCALL	_toint
	MOV  	A,R7
	SWAP 	A
	ANL  	A,#0F0H
	MOV  	t?744,A
; 	t += toint(hex[i++]);
			; SOURCE LINE # 180
	MOV  	R7,i?742
	INC  	i?742
	MOV  	A,hex?741
	ADD  	A,R7
	MOV  	R0,A
	MOVX 	A,@R0
	MOV  	R7,A
	LCALL	_toint
	MOV  	A,R7
	ADD  	A,t?744
	MOV  	t?744,A
; 	cc += t;
			; SOURCE LINE # 181
	ADD  	A,cc?746
	MOV  	cc?746,A
; 	IntelHEX->cc = t;
			; SOURCE LINE # 182
	MOV  	A,IntelHEX?740
	ADD  	A,#024H
	MOV  	R0,A
	MOV  	@R0,t?744
; //检查校验和
; 	if ( cc == 0 )
			; SOURCE LINE # 184
	MOV  	A,cc?746
	JNZ  	?C0019
; 		return 1;
			; SOURCE LINE # 185
	SETB 	C
	RET  	
?C0019:
; 	else
; 		return 0;
			; SOURCE LINE # 187
	CLR  	C
; }
			; SOURCE LINE # 188
?C0009:
	RET  	
; END OF _AnalyseHEX

; 
; 
; //蜂鸣器鸣叫
; void Beep()

	RSEG  ?PR?Beep?MAIN
Beep:
	USING	0
			; SOURCE LINE # 192
; {
			; SOURCE LINE # 193
; 	unsigned int n;
; 	TMOD &= 0xF0;	//T0设置在方式1,即16位定时器(不改变T1的模式)
			; SOURCE LINE # 195
	ANL  	TMOD,#0F0H
; 	TMOD |= 0x01;
			; SOURCE LINE # 196
	ORL  	TMOD,#01H
; 	n = 800;
			; SOURCE LINE # 197
;---- Variable 'n?848' assigned to Register 'R6/R7' ----
	MOV  	R7,#020H
	MOV  	R6,#03H
?C0023:
; 	do
; 	{
			; SOURCE LINE # 199
; 		TH0 = 0xFC;			//设置T0初值=65536-(11059200/12)/(2*f)
			; SOURCE LINE # 200
	MOV  	TH0,#0FCH
; 		TL0 = 0x66;			//f为发声频率(500Hz)
			; SOURCE LINE # 201
	MOV  	TL0,#066H
; 		TR0 = 1;			//启动定时器
			; SOURCE LINE # 202
	SETB 	TR0
?C0024:
; 		while ( !TF0 );		//等待定时器溢出
			; SOURCE LINE # 203
	JNB  	TF0,?C0024
?C0025:
; 		TR0 = 0;			//停止定时器
			; SOURCE LINE # 204
	CLR  	TR0
; 		TF0 = 0;			//清除溢出标志
			; SOURCE LINE # 205
	CLR  	TF0
; 		BUZZER = !BUZZER;	//翻转I/O口,产生方波振荡,使蜂鸣器发声
			; SOURCE LINE # 206
	CPL  	BUZZER
; 	} while ( --n != 0 );
			; SOURCE LINE # 207
	MOV  	A,R7
	DEC  	R7
	JNZ  	?C0058
	DEC  	R6
?C0058:
	DEC  	A
	ORL  	A,R6
	JNZ  	?C0023
; 	BUZZER = 1;
			; SOURCE LINE # 208
	SETB 	BUZZER
; }
			; SOURCE LINE # 209
	RET  	
; END OF Beep

; 
; 
; /*******************************************************************************
; 函数:Delay()
; 功能:延时0.01s~2.56s
; 参数:t>0时,延时(t*0.01)s
;       t=0时,延时2.56s
; 说明:定时10ms的定时器初值=65536-0.01/(1/(f/12)),其中f为晶振频率
; *******************************************************************************/
; void Delay(unsigned char t)

	RSEG  ?PR?_Delay?MAIN
_Delay:
	USING	0
			; SOURCE LINE # 219
;---- Variable 't?949' assigned to Register 'R7' ----
; {
			; SOURCE LINE # 220
; 	TMOD &= 0xF0;	//T0设置在方式1,即16位定时器(不改变T1的模式)
			; SOURCE LINE # 221
	ANL  	TMOD,#0F0H
; 	TMOD |= 0x01;
			; SOURCE LINE # 222
	ORL  	TMOD,#01H
?C0029:
; 	do
; 	{
			; SOURCE LINE # 224
; 		TH0 = 0xDC;			//设置定时器初值(定时10ms)
			; SOURCE LINE # 225
	MOV  	TH0,#0DCH
; 		TL0 = 0x00;
			; SOURCE LINE # 226
	CLR  	A
	MOV  	TL0,A
; 		TR0 = 1;			//启动定时器
			; SOURCE LINE # 227
	SETB 	TR0
?C0030:
; 		while ( !TF0 );		//等待定时器溢出
			; SOURCE LINE # 228
	JNB  	TF0,?C0030
?C0031:
; 		TR0 = 0;			//停止定时器
			; SOURCE LINE # 229
	CLR  	TR0
; 		TF0 = 0;			//清除溢出标志
			; SOURCE LINE # 230
	CLR  	TF0
; 	} while ( --t != 0 );	//循环t次
			; SOURCE LINE # 231
	DJNZ 	R7,?C0029
; }
			; SOURCE LINE # 232
	RET  	
; END OF _Delay

; 
; 
; //跳到RAM执行程序
; void GotoRam()

	RSEG  ?PR?GotoRam?MAIN
GotoRam:
	USING	0
			; SOURCE LINE # 236
; {
			; SOURCE LINE # 237
; //下载完毕后,发送OK、蜂鸣器鸣叫
; 	printf("OK, press K4 to executing.\r\n");
			; SOURCE LINE # 239
	MOV  	R3,#0FFH
	MOV  	R2,#HIGH (?SC_0)
	MOV  	R1,#LOW (?SC_0)
	LCALL	_printf
; 	Beep();
			; SOURCE LINE # 240
	LCALL	Beep
?C0033:
; //等待按键K4按下,当K4抬起时,才运行RAM程序
; 	while ( K4 );
			; SOURCE LINE # 242
	JB   	K4,?C0033
?C0034:
; 	Delay(40);
			; SOURCE LINE # 243
	MOV  	R7,#028H
	LCALL	_Delay
?C0035:
; 	while ( !K4 );
			; SOURCE LINE # 244
	JNB  	K4,?C0035
?C0036:
; //复位重要SFR寄存器
; 	IE = 0x00;
			; SOURCE LINE # 246
	CLR  	A
	MOV  	IE,A
; 	TCON = 0x00;
			; SOURCE LINE # 247
	MOV  	TCON,A
; 	TMOD = 0x00;
			; SOURCE LINE # 248
	MOV  	TMOD,A
; 	IP = 0x00;
			; SOURCE LINE # 249
	MOV  	IP,A
; 	SCON = 0x00;
			; SOURCE LINE # 250
	MOV  	SCON,A
; //恢复堆栈指针SP默认值;跳到RAM地址0x8000处
; #pragma asm
; 	MOV		SP, #0x07
	  MOV		SP, #0x07
; 	LJMP	0x8000
	  LJMP	0x8000
; #pragma endasm
; }
			; SOURCE LINE # 256
	RET  	
; END OF GotoRam

; 
; 
; /*******************************************************************************
; 函数:GetString()
; 功能:从串行口读入一行HEX记录
; 参数:*s-字符缓冲区,保存读入的数据
;       size-最大限制长度
; *******************************************************************************/
; void GetString(char pdata *s, unsigned char size)

	RSEG  ?PR?_GetString?MAIN
_GetString:
	USING	0
			; SOURCE LINE # 265
	MOV  	s?1150,R7
	MOV  	size?1151,R5
; {
			; SOURCE LINE # 266
; 	char c;
; 	unsigned char n;
; 	n = 0;
			; SOURCE LINE # 269
	CLR  	A
	MOV  	n?1153,A
; 	for (;;)
			; SOURCE LINE # 270
?C0038:
; 	{
			; SOURCE LINE # 271
; 		c = _getkey();
			; SOURCE LINE # 272
	LCALL	_getkey
	MOV  	c?1152,R7
; 		if ( (c==':') || isxdigit(c) )
			; SOURCE LINE # 273
	MOV  	A,c?1152
	XRL  	A,#03AH
	JZ   	?C0041
	LCALL	_isxdigit
	JNC  	?C0040
?C0041:
; 		{
			; SOURCE LINE # 274
; 			if ( n < size )
			; SOURCE LINE # 275
	MOV  	A,n?1153
	CLR  	C
	SUBB 	A,size?1151
	JNC  	?C0038
; 			{
			; SOURCE LINE # 276
; 				s[n++] = c;
			; SOURCE LINE # 277
	MOV  	R7,n?1153
	INC  	n?1153
	MOV  	A,s?1150
	ADD  	A,R7
	MOV  	R0,A
	MOV  	A,c?1152
	MOVX 	@R0,A
; 			}
			; SOURCE LINE # 278
; 		}
			; SOURCE LINE # 279
	SJMP 	?C0038
?C0040:
; 		else if ( c == '\n' )
			; SOURCE LINE # 280
	MOV  	A,c?1152
	CJNE 	A,#0AH,?C0038
; 		{
			; SOURCE LINE # 281
; 			s[n] = '\0';
			; SOURCE LINE # 282
	MOV  	A,s?1150
	ADD  	A,n?1153
	MOV  	R0,A
	CLR  	A
	MOVX 	@R0,A
; 			return;
; 		}
			; SOURCE LINE # 284
; 	}
			; SOURCE LINE # 285
; }
			; SOURCE LINE # 286
?C0045:
	RET  	
; END OF _GetString

; 
; 
; //主程序
; void main()

	RSEG  ?PR?main?MAIN
main:
	USING	0
			; SOURCE LINE # 290
; {
			; SOURCE LINE # 291
; 	unsigned char n;
; 	unsigned char i;
; 	unsigned int addr;
; 	CIntelHEX idata IntelHEX;
; 	char pdata buf[76];
; 	UartInit();
			; SOURCE LINE # 297
	LCALL	UartInit
; 	printf("Ready\r\n");
			; SOURCE LINE # 298
	MOV  	R3,#0FFH
	MOV  	R2,#HIGH (?SC_29)
	MOV  	R1,#LOW (?SC_29)
	LCALL	_printf
; 	for (;;)
			; SOURCE LINE # 299
?C0046:
; 	{
			; SOURCE LINE # 300
; 		GetString(buf,sizeof(buf)-1);	//从串行口读入一行HEX记录
			; SOURCE LINE # 301
	MOV  	R7,#LOW (buf?1258)
	MOV  	R5,#04BH
	LCALL	_GetString
; 		if ( AnalyseHEX(&IntelHEX,buf) )	//分析HEX记录,转换成BIN格式
			; SOURCE LINE # 302
	MOV  	R7,#LOW (IntelHEX?1257)
	MOV  	R5,#LOW (buf?1258)
	LCALL	_AnalyseHEX
	JNC  	?C0046
; 		{
			; SOURCE LINE # 303
; 			switch ( IntelHEX.tt )
			; SOURCE LINE # 304
	MOV  	R0,#LOW (IntelHEX?1257+03H)
	MOV  	A,@R0
	DEC  	A
	JZ   	?C0054
	INC  	A
	JNZ  	?C0046
; 			{
			; SOURCE LINE # 305
; 			case 0x00:	//HEX类型:数据
			; SOURCE LINE # 306
?C0050:
; 			//保存BIN代码到RAM
; 				addr = IntelHEX.aaaa;
			; SOURCE LINE # 308
	MOV  	R0,#LOW (IntelHEX?1257+01H)
	MOV  	A,@R0
	MOV  	addr?1256,A
	INC  	R0
	MOV  	A,@R0
	MOV  	addr?1256+01H,A
; 				n = IntelHEX.ll;
			; SOURCE LINE # 309
	MOV  	R0,#LOW (IntelHEX?1257)
	MOV  	A,@R0
	MOV  	n?1254,A
; 				for ( i=0; i<n; i++ )
			; SOURCE LINE # 310
	CLR  	A
	MOV  	i?1255,A
?C0051:
	MOV  	A,i?1255
	CLR  	C
	SUBB 	A,n?1254
	JNC  	?C0046
; 				{
			; SOURCE LINE # 311
; 					XBYTE[addr+i] = IntelHEX.dd[i];
			; SOURCE LINE # 312
	MOV  	A,#LOW (IntelHEX?1257+04H)
	ADD  	A,i?1255
	MOV  	R0,A
	MOV  	A,@R0
	MOV  	R7,A
	MOV  	A,i?1255
	MOV  	R4,#00H
	ADD  	A,addr?1256+01H
	MOV  	R5,A
	MOV  	A,R4
	ADDC 	A,addr?1256
	MOV  	DPL,R5
	MOV  	DPH,A
	MOV  	A,R7
	MOVX 	@DPTR,A
; 				}
			; SOURCE LINE # 313
	INC  	i?1255
	SJMP 	?C0051
; 				break;
			; SOURCE LINE # 314
; 			case 0x01:	//HEX类型:结束
			; SOURCE LINE # 315
?C0054:
; 			//跳到RAM中运行程序代码
; 				GotoRam();
			; SOURCE LINE # 317
	LCALL	GotoRam
; 				break;
			; SOURCE LINE # 318
	SJMP 	?C0046
; END OF main

	END

⌨️ 快捷键说明

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