📄 51pro.lis
字号:
.module _51pro.c
.area text(rom, con, rel)
0000 .dbfile E:\学习专区\AVR专区\个人创作区\ICC\51pro.c
0000 .dbfunc e Delay_us _Delay_us fV
0000 ; a -> R20
0000 ; b -> R22
0000 ; us -> R16
.even
0000 _Delay_us::
0000 00D0 rcall push_gset2
0002 .dbline -1
0002 .dbline 16
0002 ; //////////////////////////////////////////////////////////////////////////////////////////////////
0002 ; //E51Pro.c
0002 ; //Easy 51Pro编程器主程序,负责通讯,管理编程操作
0002 ; ///////////////////////////////////////////////////////////////////////////////////////////////////
0002 ;
0002 ; #include <iom8v.h>
0002 ; #include <macros.h>
0002 ; #include <e51pro.h>
0002 ; #include <signal.h>
0002 ; #define uchar unsigned char
0002 ; //BYTE ComBuf[18];//串口通讯数据缓存,发送和接收都使用
0002 ; UINT nAddress;//ROM中地址计数
0002 ; UINT nTimeOut;//超时计数
0002 ; ProWork pw;//编程器一般操作
0002 ; void Delay_us(BYTE us)//微秒级延时<255us
0002 ; {
0002 .dbline 17
0002 ; char a=0;
0002 4427 clr R20
0004 .dbline 18
0004 ; char b=0;
0004 6627 clr R22
0006 .dbline 19
0006 ; for (a=0;a<7;a++)
0006 06C0 rjmp L5
0008 L2:
0008 .dbline 20
0008 ; for (b=0;b<us;b++)
0008 6627 clr R22
000A 01C0 rjmp L9
000C L6:
000C .dbline 21
000C L7:
000C .dbline 20
000C 6395 inc R22
000E L9:
000E .dbline 20
000E 6017 cp R22,R16
0010 E8F3 brlo L6
0012 L3:
0012 .dbline 19
0012 4395 inc R20
0014 L5:
0014 .dbline 19
0014 4730 cpi R20,7
0016 C0F3 brlo L2
0018 .dbline -2
0018 L1:
0018 00D0 rcall pop_gset2
001A .dbline 0 ; func end
001A 0895 ret
001C .dbsym r a 20 c
001C .dbsym r b 22 c
001C .dbsym r us 16 c
001C .dbend
001C .dbfunc e Delay_ms _Delay_ms fV
001C ; a -> R20,R21
001C ; b -> R22,R23
001C ; ms -> R16,R17
.even
001C _Delay_ms::
001C 00D0 rcall push_gset2
001E .dbline -1
001E .dbline 24
001E ; ;
001E ; }
001E ; void Delay_ms(UINT ms)//豪秒级的延时<65535ms
001E ; {
001E .dbline 25
001E ; int a=0;
001E 4427 clr R20
0020 5527 clr R21
0022 .dbline 26
0022 ; int b=0;
0022 6627 clr R22
0024 7727 clr R23
0026 .dbline 27
0026 ; for (a=0;a<4000;a++)
0026 L11:
0026 .dbline 28
0026 ; for (b=0;b<ms;b++)
0026 6627 clr R22
0028 7727 clr R23
002A 02C0 rjmp L18
002C L15:
002C .dbline 29
002C L16:
002C .dbline 28
002C 6F5F subi R22,255 ; offset = 1
002E 7F4F sbci R23,255
0030 L18:
0030 .dbline 28
0030 6017 cp R22,R16
0032 7107 cpc R23,R17
0034 D8F3 brlo L15
0036 L12:
0036 .dbline 27
0036 4F5F subi R20,255 ; offset = 1
0038 5F4F sbci R21,255
003A .dbline 27
003A 403A cpi R20,160
003C EFE0 ldi R30,15
003E 5E07 cpc R21,R30
0040 94F3 brlt L11
0042 .dbline -2
0042 L10:
0042 00D0 rcall pop_gset2
0044 .dbline 0 ; func end
0044 0895 ret
0046 .dbsym r a 20 I
0046 .dbsym r b 22 I
0046 .dbsym r ms 16 i
0046 .dbend
0046 .dbfunc e uart_init _uart_init fV
.even
0046 _uart_init::
0046 .dbline -1
0046 .dbline 34
0046 ; ;
0046 ; }
0046 ;
0046 ;
0046 ; void uart_init(void) //串口通信
0046 ; {
0046 .dbline 35
0046 ; UCSRB|=(TXEN)|(1<<RXEN);
0046 8AB1 in R24,0xa
0048 8361 ori R24,19
004A 8AB9 out 0xa,R24
004C .dbline 36
004C ; UBRRL=7; //设置波特率 57600
004C 87E0 ldi R24,7
004E 89B9 out 0x9,R24
0050 .dbline 37
0050 ; UBRRH=0x00;
0050 2224 clr R2
0052 20BC out 0x20,R2
0054 .dbline 38
0054 ; UCSRC|=(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
0054 80B5 in R24,0x20
0056 8668 ori R24,134
0058 80BD out 0x20,R24
005A .dbline -2
005A L19:
005A .dbline 0 ; func end
005A 0895 ret
005C .dbend
005C .dbfunc e uart_putchar _uart_putchar fV
005C ; x -> R16
.even
005C _uart_putchar::
005C .dbline -1
005C .dbline 41
005C ; }
005C ; void uart_putchar(char x)//发送数据
005C ; {
005C L21:
005C .dbline 43
005C L22:
005C .dbline 42
005C ; while (!(UCSRA&0x20))
005C 5D9B sbis 0xb,5
005E FECF rjmp L21
0060 .dbline 44
0060 ; ;
0060 ; UDR=x;
0060 0CB9 out 0xc,R16
0062 .dbline -2
0062 L20:
0062 .dbline 0 ; func end
0062 0895 ret
0064 .dbsym r x 16 c
0064 .dbend
0064 .dbfunc e WaitComm _WaitComm fc
0064 ; n -> R16
.even
0064 _WaitComm::
0064 .dbline -1
0064 .dbline 48
0064 ; }
0064 ;
0064 ; BOOL WaitComm()//等待上位机的命令,18字节
0064 ; {
0064 .dbline 49
0064 ; BYTE n=0;
0064 0027 clr R16
0066 L25:
0066 .dbline 50
0066 .dbline 50
0066 L26:
0066 .dbline 50
0066 ; while(!(UCSRA&0x80)){}//等待第一个字节
0066 5F9B sbis 0xb,7
0068 FECF rjmp L25
006A .dbline 51
006A ; ComBuf[n]=UDR;
006A 80E0 ldi R24,<_ComBuf
006C 90E0 ldi R25,>_ComBuf
006E E02F mov R30,R16
0070 FF27 clr R31
0072 E80F add R30,R24
0074 F91F adc R31,R25
0076 2CB0 in R2,0xc
0078 2082 std z+0,R2
007A .dbline 52
007A ; n++;
007A 0395 inc R16
007C .dbline 53
007C ; for(n;n<=17;n++)
007C 26C0 rjmp L31
007E L28:
007E .dbline 54
007E ; {
007E .dbline 55
007E ; nTimeOut=0;
007E 2224 clr R2
0080 3324 clr R3
0082 30920F00 sts _nTimeOut+1,R3
0086 20920E00 sts _nTimeOut,R2
008A 14C0 rjmp L33
008C L32:
008C .dbline 57
008C ; while(!(UCSRA&0x80))
008C ; {
008C .dbline 58
008C ; nTimeOut++;
008C 80910E00 lds R24,_nTimeOut
0090 90910F00 lds R25,_nTimeOut+1
0094 0196 adiw R24,1
0096 90930F00 sts _nTimeOut+1,R25
009A 80930E00 sts _nTimeOut,R24
009E .dbline 59
009E ; if(nTimeOut>10000)//后17个字节都有超时限制
009E 80E1 ldi R24,10000
00A0 97E2 ldi R25,39
00A2 20900E00 lds R2,_nTimeOut
00A6 30900F00 lds R3,_nTimeOut+1
00AA 8215 cp R24,R2
00AC 9305 cpc R25,R3
00AE 10F4 brsh L35
00B0 .dbline 60
00B0 ; return 0;
00B0 0027 clr R16
00B2 0FC0 rjmp L24
00B4 L35:
00B4 .dbline 61
00B4 L33:
00B4 .dbline 56
00B4 5F9B sbis 0xb,7
00B6 EACF rjmp L32
00B8 .dbline 62
00B8 80E0 ldi R24,<_ComBuf
00BA 90E0 ldi R25,>_ComBuf
00BC E02F mov R30,R16
00BE FF27 clr R31
00C0 E80F add R30,R24
00C2 F91F adc R31,R25
00C4 2CB0 in R2,0xc
00C6 2082 std z+0,R2
00C8 .dbline 64
00C8 L29:
00C8 .dbline 53
00C8 0395 inc R16
00CA L31:
00CA .dbline 53
00CA 81E1 ldi R24,17
00CC 8017 cp R24,R16
00CE B8F6 brsh L28
00D0 .dbline 65
00D0 ; }
00D0 ; ComBuf[n]=UDR;
00D0 ;
00D0 ; }
00D0 ; return 1;
00D0 01E0 ldi R16,1
00D2 .dbline -2
00D2 L24:
00D2 .dbline 0 ; func end
00D2 0895 ret
00D4 .dbsym r n 16 c
00D4 .dbend
00D4 .dbfunc e WaitResp _WaitResp fc
.even
00D4 _WaitResp::
00D4 .dbline -1
00D4 .dbline 68
00D4 ; }
00D4 ; BOOL WaitResp()//等待上位机回应,1字节,有超时限制
00D4 ; {
00D4 .dbline 69
00D4 ; nTimeOut=0;
00D4 2224 clr R2
00D6 3324 clr R3
00D8 30920F00 sts _nTimeOut+1,R3
00DC 20920E00 sts _nTimeOut,R2
00E0 14C0 rjmp L39
00E2 L38:
00E2 .dbline 71
00E2 ; while(!(UCSRA&0x80))
00E2 ; {
00E2 .dbline 72
00E2 ; nTimeOut++;
00E2 80910E00 lds R24,_nTimeOut
00E6 90910F00 lds R25,_nTimeOut+1
00EA 0196 adiw R24,1
00EC 90930F00 sts _nTimeOut+1,R25
00F0 80930E00 sts _nTimeOut,R24
00F4 .dbline 73
00F4 ; if(nTimeOut>50000)
00F4 80E5 ldi R24,50000
00F6 93EC ldi R25,195
00F8 20900E00 lds R2,_nTimeOut
00FC 30900F00 lds R3,_nTimeOut+1
0100 8215 cp R24,R2
0102 9305 cpc R25,R3
0104 10F4 brsh L41
0106 .dbline 74
0106 ; {
0106 .dbline 75
0106 ; return 0;
0106 0027 clr R16
0108 06C0 rjmp L37
010A L41:
010A .dbline 77
010A L39:
010A .dbline 70
010A 5F9B sbis 0xb,7
010C EACF rjmp L38
010E .dbline 79
010E ; }
010E ; }
010E ;
010E ; ComBuf[0]=UDR;
010E 2CB0 in R2,0xc
0110 20920000 sts _ComBuf,R2
0114 .dbline 80
0114 ; return 1;
0114 01E0 ldi R16,1
0116 .dbline -2
0116 L37:
0116 .dbline 0 ; func end
0116 0895 ret
0118 .dbend
0118 .dbfunc e WaitData _WaitData fc
0118 ; n -> R16
.even
0118 _WaitData::
0118 .dbline -1
0118 .dbline 84
0118 ; }
0118 ;
0118 ; BOOL WaitData()//写器件时等待上位机数据,18字节,有超时限制
0118 ; {
0118 .dbline 86
0118 ; BYTE n;
0118 ; for(n=0;n<=17;n++)
0118 0027 clr R16
011A 26C0 rjmp L47
011C L44:
011C .dbline 87
011C ; {
011C .dbline 88
011C ; nTimeOut=0;
011C 2224 clr R2
011E 3324 clr R3
0120 30920F00 sts _nTimeOut+1,R3
0124 20920E00 sts _nTimeOut,R2
0128 14C0 rjmp L49
012A L48:
012A .dbline 90
012A ; while(!(UCSRA&0x80))
012A ; {
012A .dbline 91
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -