📄 main.src
字号:
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 + -