📄 main.lst
字号:
__start:
__text_start:
0031 E5CF LDI R28,0x5F
0032 E0D4 LDI R29,4
0033 BFCD OUT 0x3D,R28
0034 BFDE OUT 0x3E,R29
0035 51C0 SUBI R28,0x10
0036 40D0 SBCI R29,0
0037 EA0A LDI R16,0xAA
0038 8308 STD Y+0,R16
0039 2400 CLR R0
003A E6ED LDI R30,0x6D
003B E0F0 LDI R31,0
003C E010 LDI R17,0
003D 38E9 CPI R30,0x89
003E 07F1 CPC R31,R17
003F F011 BEQ 0x0042
0040 9201 ST R0,Z+
0041 CFFB RJMP 0x003D
0042 8300 STD Z+0,R16
0043 E5E4 LDI R30,0x54
0044 E0F0 LDI R31,0
0045 E6A0 LDI R26,0x60
0046 E0B0 LDI R27,0
0047 E010 LDI R17,0
0048 36E1 CPI R30,0x61
0049 07F1 CPC R31,R17
004A F021 BEQ 0x004F
004B 95C8 LPM
004C 9631 ADIW R30,1
004D 920D ST R0,X+
004E CFF9 RJMP 0x0048
004F 940E007A CALL _main
_exit:
0051 CFFF RJMP _exit
FILE: D:\桌面\avr程序设计\串口通讯范例\main.c
(0001) //ICC-AVR application builder : 2006-11-11 12:55:39
(0002) // Target : M16
(0003) // Crystal: 7.3728Mhz
(0004)
(0005) #include "config.h"
(0006)
(0007) void port_init(void)
(0008) {
(0009) PORTA = 0x03;
_port_init:
0052 E083 LDI R24,3
0053 BB8B OUT 0x1B,R24
(0010) DDRA = 0x03;
0054 BB8A OUT 0x1A,R24
(0011) PORTB = 0x00;
0055 2422 CLR R2
0056 BA28 OUT 0x18,R2
(0012) DDRB = 0x00;
0057 BA27 OUT 0x17,R2
(0013) PORTC = 0x00; //m103 output only
0058 BA25 OUT 0x15,R2
(0014) DDRC = 0x00;
0059 BA24 OUT 0x14,R2
(0015) PORTD = 0x00;
005A BA22 OUT 0x12,R2
(0016) DDRD = 0x00;
005B BA21 OUT 0x11,R2
005C 9508 RET
(0017) }
(0018)
(0019) //call this routine to initialize all peripherals
(0020) void init_devices(void)
(0021) {
(0022) //stop errant interrupts until set up
(0023) CLI(); //disable all interrupts
_init_devices:
005D 94F8 BCLR 7
(0024) port_init();
005E DFF3 RCALL _port_init
(0025)
(0026) MCUCR = 0x00;
005F 2422 CLR R2
0060 BE25 OUT 0x35,R2
(0027) GICR = 0x00;
0061 BE2B OUT 0x3B,R2
(0028) TIMSK = 0x00; //timer interrupt sources
0062 BE29 OUT 0x39,R2
(0029) Com_init(); //串行口初始化
0063 940E00C3 CALL _Com_init
(0030) SEI(); //re-enable interrupts
0065 9478 BSET 7
0066 9508 RET
(0031) //all peripherals are now initialized
(0032) }
(0033)
(0034) void Delay(void) //软件延时
(0035) {
(0036) unsigned char i,j;
(0037) for(i=200;i>0;i--)
_Delay:
i --> R16
j --> R18
0067 EC08 LDI R16,0xC8
0068 C00D RJMP 0x0076
(0038) {
(0039) for(j=200;j>0;j--)
0069 EC28 LDI R18,0xC8
006A C001 RJMP 0x006C
006B 952A DEC R18
006C 2422 CLR R2
006D 1622 CP R2,R18
006E F3E0 BCS 0x006B
(0040) ;
(0041) for(j=200;j>0;j--)
006F EC28 LDI R18,0xC8
0070 C001 RJMP 0x0072
0071 952A DEC R18
0072 2422 CLR R2
0073 1622 CP R2,R18
0074 F3E0 BCS 0x0071
0075 950A DEC R16
0076 2422 CLR R2
0077 1620 CP R2,R16
0078 F380 BCS 0x0069
0079 9508 RET
_main:
SIO_buff --> Y+2
007A 9726 SBIW R28,6
(0042) ;
(0043) }
(0044) }
(0045)
(0046) void main(void)
(0047) {
(0048) uint8 SIO_buff[4]; //定义串口数据缓冲区
(0049) init_devices();
007B DFE1 RCALL _init_devices
(0050) //指示单片机正常开始工作,一亮,二亮,都亮,都灭
(0051) PORTA = 0x02; //1脚为高,0脚为低,0脚灯亮
007C E082 LDI R24,2
007D BB8B OUT 0x1B,R24
(0052) Delay(); //延时
007E DFE8 RCALL _Delay
(0053) PORTA = 0x01; //0脚为高,1脚为低,1脚灯亮
007F E081 LDI R24,1
0080 BB8B OUT 0x1B,R24
(0054) Delay(); //延时
0081 DFE5 RCALL _Delay
(0055) PORTA = 0x00; //同时亮
0082 2422 CLR R2
0083 BA2B OUT 0x1B,R2
(0056) Delay(); //延时
0084 DFE2 RCALL _Delay
(0057) PORTA = 0x03; //同时灭
0085 E083 LDI R24,3
0086 BB8B OUT 0x1B,R24
(0058)
(0059) Com_putstring ("ww",2,&RTbuf_UART0); //输出一个字符串到串行口
0087 E68D LDI R24,0x6D
0088 E090 LDI R25,0
0089 8399 STD Y+1,R25
008A 8388 STD Y+0,R24
008B E022 LDI R18,2
008C E60A LDI R16,0x6A
008D E010 LDI R17,0
008E 940E0113 CALL _Com_putstring
0090 C02F RJMP 0x00C0
(0060)
(0061) while(1)
(0062) {
(0063) if(Com_R_count(&RTbuf_UART0)!=0)
0091 E60D LDI R16,0x6D
0092 E010 LDI R17,0
0093 940E0173 CALL _Com_R_count
0095 2300 TST R16
0096 F0F9 BEQ 0x00B6
(0064) {
(0065) Com_getstring (SIO_buff,1,&RTbuf_UART0);
0097 E68D LDI R24,0x6D
0098 E090 LDI R25,0
0099 8399 STD Y+1,R25
009A 8388 STD Y+0,R24
009B E021 LDI R18,1
009C 018E MOVW R16,R28
009D 5F0E SUBI R16,0xFE
009E 4F1F SBCI R17,0xFF
009F 940E014D CALL _Com_getstring
(0066) Com_Rbuf_Clear(&RTbuf_UART0); //清空buffer
00A1 E60D LDI R16,0x6D
00A2 E010 LDI R17,0
00A3 940E0145 CALL _Com_Rbuf_Clear
(0067) if(SIO_buff[0]==1) //接收到一个一
00A5 818A LDD R24,Y+2
00A6 3081 CPI R24,1
00A7 F471 BNE 0x00B6
(0068) {
(0069) Com_putstring ("ok!!",4,&RTbuf_UART0); //输出一个字符串到串行口
00A8 E68D LDI R24,0x6D
00A9 E090 LDI R25,0
00AA 8399 STD Y+1,R25
00AB 8388 STD Y+0,R24
00AC E024 LDI R18,4
00AD E605 LDI R16,0x65
00AE E010 LDI R17,0
00AF 940E0113 CALL _Com_putstring
(0070) PORTA = 0x00; //同时亮
00B1 2422 CLR R2
00B2 BA2B OUT 0x1B,R2
(0071) Delay(); //延时
00B3 DFB3 RCALL _Delay
(0072) PORTA = 0x03; //同时灭
00B4 E083 LDI R24,3
00B5 BB8B OUT 0x1B,R24
(0073) }
(0074) } //end of if(Com_R_count(&RTbuf_UART0)!=0)
(0075) Delay();//延时
00B6 DFB0 RCALL _Delay
(0076) Com_putstring ("ww00",4,&RTbuf_UART0); //输出一个字符串到串行口
00B7 E68D LDI R24,0x6D
00B8 E090 LDI R25,0
00B9 8399 STD Y+1,R25
00BA 8388 STD Y+0,R24
00BB E024 LDI R18,4
00BC E600 LDI R16,0x60
00BD E010 LDI R17,0
00BE 940E0113 CALL _Com_putstring
00C0 CFD0 RJMP 0x0091
00C1 9626 ADIW R28,6
00C2 9508 RET
FILE: D:\桌面\avr程序设计\串口通讯范例\sio.c
(0001)
(0002)
(0003) #include "config.h"
(0004)
(0005) #if USEUART0
(0006) siocirqueue RTbuf_UART0;
(0007) #endif
(0008) #if USEUART1
(0009) siocirqueue RTbuf_UART1;
(0010) #endif
(0011)
(0012)
(0013)
(0014) #if (CPU_TYPE == M32)||(CPU_TYPE == M16)||(CPU_TYPE == M8)
(0015) #define USEUART0 TRUE
(0016) #define USEUART1 FALSE
(0017) #define iv_USART0_RXC iv_USART_RXC
(0018) #define iv_USART0_TXC iv_USART_TXC
(0019) #define UDR0 UDR
(0020) #define UCSR0A UCSRA
(0021) #define UCSR0B UCSRB
(0022) #define UCSR0C UCSRC
(0023) #define UBRR0H UBRRH
(0024) #define UBRR0L UBRRL
(0025) #define RXCIE0 RXCIE
(0026) #define TXCIE0 TXCIE
(0027) #endif
(0028)
(0029)
(0030) /*********************************************************************************************************
(0031) ** 函数名称: Com_init
(0032) ** 功能描述: 初始化串行口
(0033) ** 输 入:
(0034) ** 全局变量: 无
(0035) ** 调用模块: Com_baudrate
(0036) ** 说明:
(0037) ** 注意:
(0038) ********************************************************************************************************/
(0039) void Com_init (void) {
(0040) //WDR(); //喂狗
(0041) //CLI(); // 关中断
(0042) #if USEUART0
(0043) Tbuf_init(&RTbuf_UART0); //初始化接收缓冲
_Com_init:
00C3 E60D LDI R16,0x6D
00C4 E010 LDI R17,0
00C5 D0B9 RCALL _Tbuf_init
(0044) Rbuf_init(&RTbuf_UART0);
00C6 E60D LDI R16,0x6D
00C7 E010 LDI R17,0
00C8 D0AD RCALL _Rbuf_init
(0045) UCSR0B = 0x00; //disable while setting baud rate
00C9 2422 CLR R2
00CA B82A OUT 0x0A,R2
(0046) UCSR0A=0x00;
00CB B82B OUT 0x0B,R2
(0047)
(0048) #if CPU_TYPE <= M32
(0049) UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
00CC E886 LDI R24,0x86
00CD BD80 OUT 0x20,R24
(0050) UCSR0B = (1<<RXCIE)|(1<<TXCIE)|(1<<RXEN)|(1<<TXEN); // RXCIE=1;TXCIE=1;UDREIE=0;RXEN=1;TXEN=1
00CE ED88 LDI R24,0xD8
00CF B98A OUT 0x0A,R24
(0051) #else
(0052) UCSR0C=0x06; //8 DATA ,1 STOP, NO PARITY
(0053) UCSR0B = (1<<RXCIE0)|(1<<TXCIE0)|(1<<RXEN0)|(1<<TXEN0); // RXCIE=1;TXCIE=1;UDREIE=0;RXEN=1;TXEN=1
(0054) #endif
(0055)
(0056) #endif
(0057)
(0058)
(0059) #if USEUART1
(0060) Tbuf_init(&RTbuf_B); //初始化接收缓冲
(0061) Rbuf_init(&RTbuf_B);
(0062) UCSR1B = 0x00; //disable while setting baud rate
(0063) UCSR1A = 0x00;
(0064) UCSR1C = 0x06;
(0065) UCSR1B = 0xD8;
(0066) #endif
(0067) Com_baudrate (9600); //
00D0 E800 LDI R16,0x80
00D1 E215 LDI R17,0x25
00D2 D001 RCALL _Com_baudrate
00D3 9508 RET
_Com_baudrate:
tmp --> R10
baudrate --> R10
00D4 940E0314 CALL push_gset3
00D6 0158 MOVW R10,R16
(0068)
(0069) //SEI(); // 开中断
(0070) }
(0071) /*********************************************************************************************************
(0072) ** 函数名称: Com_baudrate
(0073) ** 功能描述: 利用定时器T1产生由参数baudrate指定的波特率
(0074) ** 输 入: baudrate指定的波特率
(0075) ** 全局变量: 无
(0076) ** 调用模块: 无
(0077) ** 说明:
(0078) ** 注意:
(0079) ********************************************************************************************************/
(0080) void Com_baudrate (uint16 baudrate) {
(0081) uint16 tmp;
(0082) tmp= F_CPU/baudrate/16-1;
00D7 0115 MOVW R2,R10
00D8 2444 CLR R4
00D9 2455 CLR R5
00DA E040 LDI R20,0
00DB E850 LDI R21,0x80
00DC E760 LDI R22,0x70
00DD E070 LDI R23,0
00DE 925A ST R5,-Y
00DF 924A ST R4,-Y
00E0 923A ST R3,-Y
00E1 922A ST R2,-Y
00E2 018A MOVW R16,R20
00E3 019B MOVW R18,R22
00E4 940E0284 CALL div32s
00E6 E140 LDI R20,0x10
00E7 E050 LDI R21,0
00E8 E060 LDI R22,0
00E9 E070 LDI R23,0
00EA 937A ST R23,-Y
00EB 936A ST R22,-Y
00EC 935A ST R21,-Y
00ED 934A ST R20,-Y
00EE 940E0284 CALL div32s
00F0 0118 MOVW R2,R16
00F1 0129 MOVW R4,R18
00F2 E041 LDI R20,1
00F3 E050 LDI R21,0
00F4 E060 LDI R22,0
00F5 E070 LDI R23,0
00F6 1A24 SUB R2,R20
00F7 0A35 SBC R3,R21
00F8 0A46 SBC R4,R22
00F9 0A57 SBC R5,R23
00FA 0151 MOVW R10,R2
(0083) #if USEUART0
(0084) UBRR0H=(uint8)(tmp>>8);
00FB 2C23 MOV R2,R3
00FC 2433 CLR R3
00FD BC20 OUT 0x20,R2
(0085) UBRR0L=(uint8)tmp;
00FE B8A9 OUT 0x09,R10
00FF 940E030A CALL pop_gset3
0101 9508 RET
_Com_putchar:
RTbuf --> R22
c --> R20
0102 940E0316 CALL push_gset2
0104 01B9 MOVW R22,R18
0105 2F40 MOV R20,R16
(0086) #endif
(0087) #if USEUART1
(0088) UBRR1H=(uint8)(tmp>>8);
(0089) UBRR1L=(uint8)tmp;
(0090) #endif
(0091) }
(0092) /*********************************************************************************************************
(0093) ** 函数名称: Com_putchar
(0094) ** 功能描述: 从串行口输出一个字符c
(0095) ** 输 入: c:输出字符
(0096) ** 输出 : 0:失败 1:成功
(0097) ** 全局变量: 无
(0098) ** 调用模块:
(0099) ** 说明:
(0100) ** 注意:
(0101) ********************************************************************************************************/
(0102) uint8 Com_putchar (uint8 c,siocirqueue *RTbuf) {
(0103) //WDR(); //喂狗
(0104) if (Tbuf_full(RTbuf))
0106 018B MOVW R16,R22
0107 D091 RCALL _Tbuf_full
0108 2300 TST R16
0109 F011 BEQ 0x010C
(0105) return(0);
010A 2700 CLR R16
010B C004 RJMP 0x0110
(0106) else{
(0107) Tbuf_putchar(c,RTbuf); // 将数据加入到发送缓冲区并开中断
010C 019B MOVW R18,R22
010D 2F04 MOV R16,R20
010E D099 RCALL _Tbuf_putchar
(0108) return(1);
010F E001 LDI R16,1
0110 940E0307 CALL pop_gset2
0112 9508 RET
_Com_putstring:
i --> R12
RTbuf --> R22
len --> R10
p --> R20
0113 940E0312 CALL push_gset4
0115 2EA2 MOV R10,R18
0116 01A8 MOVW R20,R16
0117 8568 LDD R22,Y+8
0118 8579 LDD R23,Y+9
(0109) }
(0110) }
(0111) /*********************************************************************************************************
(0112) ** 函数名称: Com_putstring
(0113) ** 功能描述: 从串行口输出一个字符串
(0114) ** 输 入: p:指向输出字符串 len:输出长度
(0115) ** 输出 :
(0116) ** 全局变量: 无
(0117) ** 调用模块:
(0118) ** 说明:
(0119) ** 注意:
(0120) ********************************************************************************************************/
(0121) void Com_putstring (uint8 *p,uint8 len,siocirqueue *RTbuf) {
(0122) uint8 i;
(0123) //WDR(); //喂狗
(0124) if (len!=0 ){
0119 20AA TST R10
011A F079 BEQ 0x012A
(0125) for(i=0;i<len;i++)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -