📄 main.lst
字号:
__text_start:
__start:
0046 EFCF LDI R28,0xFF
0047 E1D0 LDI R29,0x10
0048 BFCD OUT 0x3D,R28
0049 BFDE OUT 0x3E,R29
004A 51C0 SUBI R28,0x10
004B 40D0 SBCI R29,0
004C EA0A LDI R16,0xAA
004D 8308 STD Y+0,R16
004E 2400 CLR R0
004F E0E0 LDI R30,0
0050 E0F1 LDI R31,1
0051 E011 LDI R17,1
0052 3DE0 CPI R30,0xD0
0053 07F1 CPC R31,R17
0054 F011 BEQ 0x0057
0055 9201 ST R0,Z+
0056 CFFB RJMP 0x0052
0057 8300 STD Z+0,R16
0058 E8EC LDI R30,0x8C
0059 E0F0 LDI R31,0
005A E0A0 LDI R26,0
005B E0B1 LDI R27,1
005C E010 LDI R17,0
005D 38EC CPI R30,0x8C
005E 07F1 CPC R31,R17
005F F021 BEQ 0x0064
0060 95C8 LPM
0061 9631 ADIW R30,1
0062 920D ST R0,X+
0063 CFF9 RJMP 0x005D
0064 940E0067 CALL _main
_exit:
0066 CFFF RJMP _exit
_main:
SIO_buff --> Y+2
0067 9726 SBIW R28,6
FILE: D:\avrvi\AVRVi_m128_Starter_Kit\USART\source\main.c
(0001) /************************************************
(0002) 文件:main.c
(0003) 用途:
(0004) 注意:内部8M晶振
(0005) 创建:2008.4.1
(0006) 修改:2008.4.1
(0007) Copy Right (c) www.avrvi.com AVR与虚拟仪器
(0008) ************************************************/
(0009)
(0010) #include "config.h"
(0011)
(0012) void main(void)
(0013) {
(0014) unsigned char SIO_buff[4];
(0015) CLI();
0068 94F8 BCLR 7
(0016) Com_init();
0069 940E0084 CALL _Com_init
(0017) SEI();
006B 9478 BSET 7
006C C014 RJMP 0x0081
(0018) while(1)
(0019) {
(0020) Com_getstring (SIO_buff,1,&RTbuf_UART0);
006D E080 LDI R24,0
006E E091 LDI R25,1
006F 8399 STD Y+1,R25
0070 8388 STD Y+0,R24
0071 E021 LDI R18,1
0072 018E MOVW R16,R28
0073 5F0E SUBI R16,0xFE
0074 4F1F SBCI R17,0xFF
0075 940E0110 CALL _Com_getstring
(0021) Com_putstring (SIO_buff,1,&RTbuf_UART0); //输出一个字符串到串行口
0077 E080 LDI R24,0
0078 E091 LDI R25,1
0079 8399 STD Y+1,R25
007A 8388 STD Y+0,R24
007B E021 LDI R18,1
007C 018E MOVW R16,R28
007D 5F0E SUBI R16,0xFE
007E 4F1F SBCI R17,0xFF
007F 940E00D6 CALL _Com_putstring
0081 CFEB RJMP 0x006D
0082 9626 ADIW R28,6
0083 9508 RET
FILE: D:\avrvi\AVRVi_m128_Starter_Kit\USART\source\lib\sio.c
(0001) /************************************************
(0002) 文件:sio.c
(0003) 用途:结构化串口通信程序
(0004) 注意:
(0005) 创建:2008.1.26
(0006) 修改:2008.1.26
(0007) Copy Right (c) www.avrvi.com AVR与虚拟仪器
(0008) ************************************************/
(0009) #include "..\config.h"
(0010)
(0011) #if USEUART0
(0012) siocirqueue RTbuf_UART0;
(0013) #endif
(0014) #if USEUART1
(0015) siocirqueue RTbuf_UART1;
(0016) #endif
(0017)
(0018) #if (CPU_TYPE == M32)||(CPU_TYPE == M16)||(CPU_TYPE == M8)
(0019) #define USEUART0 TRUE
(0020) #define USEUART1 FALSE
(0021) #define iv_USART0_RXC iv_USART_RXC
(0022) #define iv_USART0_TXC iv_USART_TXC
(0023) #define UDR0 UDR
(0024) #define UCSR0A UCSRA
(0025) #define UCSR0B UCSRB
(0026) #define UCSR0C UCSRC
(0027) #define UBRR0H UBRRH
(0028) #define UBRR0L UBRRL
(0029) #define RXCIE0 RXCIE
(0030) #define TXCIE0 TXCIE
(0031) #endif
(0032)
(0033)
(0034) /*********************************************************************************************************
(0035) ** 函数名称: Com_init
(0036) ** 功能描述: 初始化串行口
(0037) ** 输 入:
(0038) ** 全局变量: 无
(0039) ** 调用模块: Com_baudrate
(0040) ** 说明:
(0041) ** 注意:
(0042) ********************************************************************************************************/
(0043) void Com_init (void) {
(0044) //WDR(); //喂狗
(0045) //CLI(); // 关中断
(0046) #if USEUART0
(0047) Tbuf_init(&RTbuf_UART0); //初始化接收缓冲
_Com_init:
0084 E000 LDI R16,0
0085 E011 LDI R17,1
0086 D0BB RCALL _Tbuf_init
(0048) Rbuf_init(&RTbuf_UART0);
0087 E000 LDI R16,0
0088 E011 LDI R17,1
0089 D0AF RCALL _Rbuf_init
(0049) UCSR0B = 0x00; //disable while setting baud rate
008A 2422 CLR R2
008B B82A OUT 0x0A,R2
(0050) UCSR0A=0x00;
008C B82B OUT 0x0B,R2
(0051)
(0052) #if CPU_TYPE <= M32
(0053) UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
(0054) UCSR0B = (1<<RXCIE)|(1<<TXCIE)|(1<<RXEN)|(1<<TXEN); // RXCIE=1;TXCIE=1;UDREIE=0;RXEN=1;TXEN=1
(0055) #else
(0056) UCSR0C=0x06; //8 DATA ,1 STOP, NO PARITY
008D E086 LDI R24,6
008E 93800095 STS 0x95,R24
(0057) UCSR0B = (1<<RXCIE0)|(1<<TXCIE0)|(1<<RXEN0)|(1<<TXEN0); // RXCIE=1;TXCIE=1;UDREIE=0;RXEN=1;TXEN=1
0090 ED88 LDI R24,0xD8
0091 B98A OUT 0x0A,R24
(0058) #endif
(0059)
(0060) #endif
(0061)
(0062)
(0063) #if USEUART1
(0064) Tbuf_init(&RTbuf_B); //初始化接收缓冲
(0065) Rbuf_init(&RTbuf_B);
(0066) UCSR1B = 0x00; //disable while setting baud rate
(0067) UCSR1A = 0x00;
(0068) UCSR1C = 0x06;
(0069) UCSR1B = 0xD8;
(0070) #endif
(0071) Com_baudrate (9600); //
0092 E800 LDI R16,0x80
0093 E215 LDI R17,0x25
0094 D001 RCALL _Com_baudrate
0095 9508 RET
_Com_baudrate:
tmp --> R10
baudrate --> R10
0096 940E031D CALL push_gset3
0098 0158 MOVW R10,R16
(0072)
(0073) //SEI(); // 开中断
(0074) }
(0075) /*********************************************************************************************************
(0076) ** 函数名称: Com_baudrate
(0077) ** 功能描述: 利用定时器T1产生由参数baudrate指定的波特率
(0078) ** 输 入: baudrate指定的波特率
(0079) ** 全局变量: 无
(0080) ** 调用模块: 无
(0081) ** 说明:
(0082) ** 注意:
(0083) ********************************************************************************************************/
(0084) void Com_baudrate (unsigned int baudrate) {
(0085) unsigned int tmp;
(0086) tmp= F_CPU/baudrate/16-1;
0099 0115 MOVW R2,R10
009A 2444 CLR R4
009B 2455 CLR R5
009C E040 LDI R20,0
009D E152 LDI R21,0x12
009E E76A LDI R22,0x7A
009F E070 LDI R23,0
00A0 925A ST R5,-Y
00A1 924A ST R4,-Y
00A2 923A ST R3,-Y
00A3 922A ST R2,-Y
00A4 018A MOVW R16,R20
00A5 019B MOVW R18,R22
00A6 940E028D CALL div32s
00A8 E140 LDI R20,0x10
00A9 E050 LDI R21,0
00AA E060 LDI R22,0
00AB E070 LDI R23,0
00AC 937A ST R23,-Y
00AD 936A ST R22,-Y
00AE 935A ST R21,-Y
00AF 934A ST R20,-Y
00B0 940E028D CALL div32s
00B2 0118 MOVW R2,R16
00B3 0129 MOVW R4,R18
00B4 E041 LDI R20,1
00B5 E050 LDI R21,0
00B6 E060 LDI R22,0
00B7 E070 LDI R23,0
00B8 1A24 SUB R2,R20
00B9 0A35 SBC R3,R21
00BA 0A46 SBC R4,R22
00BB 0A57 SBC R5,R23
00BC 0151 MOVW R10,R2
(0087) #if USEUART0
(0088) UBRR0H=(unsigned char)(tmp>>8);
00BD 2C23 MOV R2,R3
00BE 2433 CLR R3
00BF 92200090 STS 0x90,R2
(0089) UBRR0L=(unsigned char)tmp;
00C1 B8A9 OUT 0x09,R10
00C2 940E0313 CALL pop_gset3
00C4 9508 RET
_Com_putchar:
RTbuf --> R22
c --> R20
00C5 940E031F CALL push_gset2
00C7 01B9 MOVW R22,R18
00C8 2F40 MOV R20,R16
(0090) #endif
(0091) #if USEUART1
(0092) UBRR1H=(unsigned char)(tmp>>8);
(0093) UBRR1L=(unsigned char)tmp;
(0094) #endif
(0095) }
(0096) /*********************************************************************************************************
(0097) ** 函数名称: Com_putchar
(0098) ** 功能描述: 从串行口输出一个字符c
(0099) ** 输 入: c:输出字符
(0100) ** 输出 : 0:失败 1:成功
(0101) ** 全局变量: 无
(0102) ** 调用模块:
(0103) ** 说明:
(0104) ** 注意:
(0105) ********************************************************************************************************/
(0106) unsigned char Com_putchar (unsigned char c,siocirqueue *RTbuf) {
(0107) //WDR(); //喂狗
(0108) if (Tbuf_full(RTbuf))
00C9 018B MOVW R16,R22
00CA D099 RCALL _Tbuf_full
00CB 2300 TST R16
00CC F011 BEQ 0x00CF
(0109) return(0);
00CD 2700 CLR R16
00CE C004 RJMP 0x00D3
(0110) else{
(0111) Tbuf_putchar(c,RTbuf); // 将数据加入到发送缓冲区并开中断
00CF 019B MOVW R18,R22
00D0 2F04 MOV R16,R20
00D1 D0A3 RCALL _Tbuf_putchar
(0112) return(1);
00D2 E001 LDI R16,1
00D3 940E0310 CALL pop_gset2
00D5 9508 RET
_Com_putstring:
i --> R12
RTbuf --> R22
len --> R10
p --> R20
00D6 940E031B CALL push_gset4
00D8 2EA2 MOV R10,R18
00D9 01A8 MOVW R20,R16
00DA 8568 LDD R22,Y+8
00DB 8579 LDD R23,Y+9
(0113) }
(0114) }
(0115) /*********************************************************************************************************
(0116) ** 函数名称: Com_putstring
(0117) ** 功能描述: 从串行口输出一个字符串
(0118) ** 输 入: p:指向输出字符串 len:输出长度
(0119) ** 输出 :
(0120) ** 全局变量: 无
(0121) ** 调用模块:
(0122) ** 说明:
(0123) ** 注意:
(0124) ********************************************************************************************************/
(0125) void Com_putstring (unsigned char *p,unsigned char len,siocirqueue *RTbuf) {
(0126) unsigned char i;
(0127) //WDR(); //喂狗
(0128) if (len!=0 ){
00DC 20AA TST R10
00DD F079 BEQ 0x00ED
(0129) for(i=0;i<len;i++)
00DE 24CC CLR R12
00DF C00A RJMP 0x00EA
(0130) while(Com_putchar(p[i],RTbuf)==0);//WDR(); //喂狗;
00E0 019B MOVW R18,R22
00E1 2DEC MOV R30,R12
00E2 27FF CLR R31
00E3 0FE4 ADD R30,R20
00E4 1FF5 ADC R31,R21
00E5 8100 LDD R16,Z+0
00E6 DFDE RCALL _Com_putchar
00E7 2300 TST R16
00E8 F3B9 BEQ 0x00E0
00E9 94C3 INC R12
00EA 14CA CP R12,R10
00EB F3A0 BCS 0x00E0
(0131) }
00EC C00B RJMP 0x00F8
(0132) else {
(0133) do{
(0134) while(Com_putchar(*p,RTbuf)==0);//WDR(); //喂狗;
00ED 019B MOVW R18,R22
00EE 01FA MOVW R30,R20
00EF 8100 LDD R16,Z+0
00F0 DFD4 RCALL _Com_putchar
00F1 2300 TST R16
00F2 F3D1 BEQ 0x00ED
(0135) }while(*p++!='\n');
00F3 01FA MOVW R30,R20
00F4 9181 LD R24,Z+
00F5 01AF MOVW R20,R30
00F6 308A CPI R24,0xA
00F7 F7A9 BNE 0x00ED
(0136) }
00F8 940E0316 CALL pop_gset4
00FA 9508 RET
_Com_getchar:
RTbuf --> R20
mode --> R22
00FB 940E031F CALL push_gset2
00FD 01A9 MOVW R20,R18
00FE 2F60 MOV R22,R16
(0137)
(0138) }
(0139) /*********************************************************************************************************
(0140) ** 函数名称: Com_getchar
(0141) ** 功能描述: 从串行口输入一个字符
(0142) ** 输 入: mode:0不需等待,在调用函数前检测Com_R_count的值
(0143) ** 1 等待数据到来
(0144) ** 输出 : 读入的字符
(0145) ** 全局变量: 无
(0146) ** 调用模块:
(0147) ** 说明:
(0148) ** 注意:
(0149) ********************************************************************************************************/
(0150)
(0151) unsigned char Com_getchar (unsigned char mode,siocirqueue *RTbuf) {
(0152) //WDR(); //喂狗
(0153) // Delay(Delay_Comget,MaxLimit_Comget_Delay);
(0154) // if (mode>0) while(Com_R_count(RTbuf)==0 && !DelayOvf(Delay_Comget))//WDR(); //喂狗;
(0155) // if (DelayOvf(Delay_Comget))
(0156) // return 0; //时间超时
(0157) // else
(0158)
(0159) while(!Com_R_count(RTbuf));
00FF 018A MOVW R16,R20
0100 D035 RCALL _Com_R_count
0101 2300 TST R16
0102 F3E1 BEQ 0x00FF
(0160) return (Rbuf_getchar(RTbuf));// 串行口输入正确,返回输入的字符
0103 018A MOVW R16,R20
0104 D0A9 RCALL _Rbuf_getchar
0105 940E0310 CALL pop_gset2
0107 9508 RET
_Com_Rbuf_Clear:
RTbuf --> R20
0108 940E0321 CALL push_gset1
010A 01A8 MOVW R20,R16
(0161) }
(0162)
(0163)
(0164)
(0165) void Com_Rbuf_Clear(siocirqueue *RTbuf){
(0166) Rbuf_init(RTbuf);
010B 018A MOVW R16,R20
010C D02C RCALL _Rbuf_init
010D 940E0324 CALL pop_gset1
010F 9508 RET
_Com_getstring:
i --> R20
RTbuf --> R22
len --> R12
p --> R10
0110 940E031B CALL push_gset4
0112 2EC2 MOV R12,R18
0113 0158 MOVW R10,R16
0114 8568 LDD R22,Y+8
0115 8579 LDD R23,Y+9
(0167) }
(0168)
(0169)
(0170)
(0171) unsigned char Com_getstring (unsigned char *p,unsigned char len,siocirqueue *RTbuf) {
(0172) unsigned char i=0;
0116 2744 CLR R20
(0173) //WDR(); //喂狗
(0174) if (len>0 ){
0117 2422 CLR R2
0118 142C CP R2,R12
0119 F460 BCC 0x0126
(0175) for(i=0;i<len;i++){
011A C007 RJMP 0x0122
(0176) //WDR(); //喂狗
(0177) *p++=Com_getchar(1,RTbuf);
011B 019B MOVW R18,R22
011C E001 LDI R16,1
011D DFDD RCALL _Com_getchar
011E 01F5 MOVW R30,R10
011F 9301 ST R16,Z+
0120 015F MOVW R10,R30
0121 9543 INC R20
0122 154C CP R20,R12
0123 F3B8 BCS 0x011B
(0178) }
(0179) return(len);
0124 2D0C MOV R16,R12
0125 C00D RJMP 0x0133
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -