?? chuankou.lst
字號(hào):
__text_start:
__start:
47 EFCF LDI R28,0xFF
48 E1D0 LDI R29,0x10
49 BFCD OUT 0x3D,R28
4A BFDE OUT 0x3E,R29
4B 51C0 SUBI R28,0x10
4C 40D0 SBCI R29,0
4D EA0A LDI R16,0xAA
4E 8308 ST Y,R16
4F 2400 CLR R0
50 E0E1 LDI R30,1
51 E0F1 LDI R31,1
52 E011 LDI R17,1
53 30E2 CPI R30,2
54 07F1 CPC R31,R17
55 F011 BEQ 0x0058
56 9201 ST Z+,R0
57 CFFB RJMP 0x0053
58 8300 ST Z,R16
59 E8EC LDI R30,0x8C
5A E0F0 LDI R31,0
5B E0A0 LDI R26,0
5C E0B1 LDI R27,1
5D E010 LDI R17,0
5E E000 LDI R16,0
5F BF0B OUT 0x3B,R16
60 38ED CPI R30,0x8D
61 07F1 CPC R31,R17
62 F021 BEQ 0x0067
63 95C8 LPM
64 9631 ADIW R30,1
65 920D ST X+,R0
66 CFF9 RJMP 0x0060
67 940E 00D7 CALL _main
_exit:
69 CFFF RJMP _exit
FILE: C:\DOCUME~1\wangqinbo\MYDOCU~1\avrc\chuankou.c
(0001) /***********************************************************/
(0002) //Title:ATMAGE128串口通信程序-中斷方式
(0003) //ICC-AVR : 2009-2-20 15:30:43
(0004) // Target : M16
(0005) // Crystal: 8.0000Mhz
(0006) //Author :borlittle
(0007) //Function:UART test
(0008) //備注 :本程序經(jīng)調(diào)試好使,如果程序不好使,請(qǐng)注意檢查
(0009) //更改波特率和晶振頻率以及檢查調(diào)試助手和單片機(jī)的熔絲位
(0010) //設(shè)置,尤其是103兼容模式的熔絲位不編程M128和M16串口通
(0011) //信程序大同小異,M128有兩個(gè)串口UART0、UART1而M16只有一
(0012) //個(gè)串口UART,只需要修改相應(yīng)的寄存器和引腳設(shè)置即可
(0013) /***********************************************************/
(0014) /*********************************************/
(0015) #include <iom128v.h>
(0016) #include <macros.h>
(0017)
(0018) #define uchar unsigned char //定義無(wú)符號(hào)字符為 uchar
(0019) #define uint unsigned int //定義無(wú)符號(hào)整型
(0020) #define Crystal 8000000 //晶振8MHZ
(0021) #define Baud 9600 //波特率
(0022)
(0023) volatile uchar data_temp;
(0024) volatile uchar data=59; //‘;’號(hào)的ASCII碼
(0025)
(0026) //函數(shù)聲明
(0027) void port_init(void);
(0028) void uart0_init(void);
(0029) void init_devices(void);
(0030) void usart0_char_send(uchar i);
(0031) void usart0_str_send(char *s);
(0032) void usart0_str_sendArray(uchar *p,uchar len);
(0033)
(0034) //****************發(fā)送一個(gè)字符******************************
(0035) void usart0_char_send(uchar i)
(0036) {
(0037) while(!(UCSR0A&(1<<UDRE0)));
_usart0_char_send:
i --> R16
6A 9B5D SBIS 0x0B,5
6B CFFE RJMP _usart0_char_send
(0038) UDR0=i;
6C B90C OUT 0x0C,R16
6D 9508 RET
_usart0_str_send:
s --> R20
6E 934A ST -Y,R20
6F 935A ST -Y,R21
70 01A8 MOVW R20,R16
(0039) }
(0040) /******************發(fā)送一個(gè)字符串*************************/
(0041) void usart0_str_send(char *s)
(0042) {
71 C005 RJMP 0x0077
(0043) while(*s)
(0044) {
(0045) usart0_char_send(*s);
72 01FA MOVW R30,R20
73 8100 LD R16,Z
74 DFF5 RCALL _usart0_char_send
(0046) s++;
75 5F4F SUBI R20,0xFF
76 4F5F SBCI R21,0xFF
77 01FA MOVW R30,R20
78 8020 LD R2,Z
79 2022 TST R2
7A F7B9 BNE 0x0072
7B 9159 LD R21,Y+
7C 9149 LD R20,Y+
7D 9508 RET
_usart0_str_sendArray:
i --> R10
len --> R12
p --> R20
7E 940E 00DC CALL push_xgset303C
80 2EC2 MOV R12,R18
81 01A8 MOVW R20,R16
(0047) }
(0048) }
(0049) /*********************發(fā)送一個(gè)字符串**********************/
(0050) void usart0_str_sendArray(uchar *p,uchar len)
(0051) {
(0052) uchar i;
(0053) for(i=0;i<len;i++) //控制字符個(gè)數(shù)
82 24AA CLR R10
83 C006 RJMP 0x008A
(0054) {
(0055) usart0_char_send(*p);
84 01FA MOVW R30,R20
85 8100 LD R16,Z
86 DFE3 RCALL _usart0_char_send
(0056) p++;
87 5F4F SUBI R20,0xFF
88 4F5F SBCI R21,0xFF
89 94A3 INC R10
8A 14AC CP R10,R12
8B F3C0 BCS 0x0084
8C 940C 00E3 JMP pop_xgset303C
(0057) }
(0058) }
(0059)
(0060)
(0061) /******************端口初始化*******************************/
(0062) void port_init(void)
(0063) {
(0064) PORTA = 0xFF;
_port_init:
8E EF8F LDI R24,0xFF
8F BB8B OUT 0x1B,R24
(0065) DDRA = 0x00;
90 2422 CLR R2
91 BA2A OUT 0x1A,R2
(0066) PORTB = 0xFF;
92 BB88 OUT 0x18,R24
(0067) DDRB = 0xFF;
93 BB87 OUT 0x17,R24
(0068) PORTC = 0xFF;
94 BB85 OUT 0x15,R24
(0069) DDRC = 0x00;
95 BA24 OUT 0x14,R2
(0070)
(0071) PORTE = 0xFF; //設(shè)置RXD0和TXD0
96 B983 OUT 0x03,R24
(0072) DDRE = 0x02;
97 E082 LDI R24,2
98 B982 OUT 0x02,R24
(0073)
(0074) PORTF = 0xFF;
99 EF8F LDI R24,0xFF
9A 9380 0062 STS 0x0062,R24
(0075) DDRF = 0xFF;
9C 9380 0061 STS 0x0061,R24
(0076) PORTG = 0xFF;
9E 9380 0065 STS 0x0065,R24
(0077) DDRG = 0x00;
A0 9220 0064 STS 0x0064,R2
A2 9508 RET
(0078) }
(0079) /*****************串口初始化*********************************/
(0080) void usart0_init(void)
(0081) {
(0082) UCSR0B = 0x00; //禁止發(fā)送和接收
_usart0_init:
A3 2422 CLR R2
A4 B82A OUT 0x0A,R2
(0083) UCSR0A = 0x02; //倍速異步模式USX0=1
A5 E082 LDI R24,2
A6 B98B OUT 0x0B,R24
(0084) UCSR0C = 0x06; //0000 0110,UCSZ01=1,UCSZ00=1;8位字符,1位停止位
A7 E086 LDI R24,6
A8 9380 0095 STS 0x0095,R24
(0085) UBRR0L=(Crystal/8/(Baud+1))%256; //若為正常異步模式USX0=0則位(Crystal/16/(Baud+1))%256
AA E688 LDI R24,0x68
AB B989 OUT 0x09,R24
(0086) UBRR0H=(Crystal/8/(Baud+1))/256; //參見ATMAGE128使用手冊(cè)
AC 9220 0090 STS 0x0090,R2
(0087) UCSR0B=0xD8 ; //允許發(fā)送和接收,接收和發(fā)送結(jié)束中斷使能
AE ED88 LDI R24,0xD8
AF B98A OUT 0x0A,R24
B0 9508 RET
(0088) }
(0089) /******************初始器件**************************************/
(0090) void init_devices(void)
(0091) {
(0092) port_init();
_init_devices:
B1 DFDC RCALL _port_init
(0093) usart0_init();
B2 CFF0 RJMP _usart0_init
_usart0_RX_interrupt:
B3 922A ST -Y,R2
B4 938A ST -Y,R24
B5 B62F IN R2,0x3F
B6 922A ST -Y,R2
(0094) }
(0095)
(0096) /****************中斷接收服務(wù)處理子程序*******************************/
(0097) #pragma interrupt_handler usart0_RX_interrupt:iv_USART0_RX // 19
(0098) void usart0_RX_interrupt(void)
(0099) {
(0100)
(0101) UCSR0B=0x00; //禁止發(fā)送和接收
B7 2422 CLR R2
B8 B82A OUT 0x0A,R2
(0102) data_temp = UDR0; //從數(shù)據(jù)緩沖器中接收數(shù)據(jù)
B9 B02C IN R2,0x0C
BA 9220 0101 STS data_temp,R2
(0103) UCSR0B=0xD8 ; //允許發(fā)送和接收,接收和發(fā)送結(jié)束中斷使能
BC ED88 LDI R24,0xD8
BD B98A OUT 0x0A,R24
(0104) if(data_temp=='0') //如果接收到的字符為'0'
BE 9180 0101 LDS R24,data_temp
C0 3380 CPI R24,0x30
C1 F421 BNE 0x00C6
(0105) UDR0 = data; //將數(shù)據(jù)data放入緩沖器,發(fā)送數(shù)據(jù)
C2 9020 0100 LDS R2,data
C4 B82C OUT 0x0C,R2
C5 C003 RJMP 0x00C9
(0106) else
(0107) UDR0=data_temp; //否則將接收到的數(shù)據(jù)返回
C6 9020 0101 LDS R2,data_temp
C8 B82C OUT 0x0C,R2
C9 9029 LD R2,Y+
CA BE2F OUT 0x3F,R2
CB 9189 LD R24,Y+
CC 9029 LD R2,Y+
CD 9518 RETI
_usart0_TX_interrupt:
CE 920A ST -Y,R0
CF B60F IN R0,0x3F
D0 920A ST -Y,R0
(0108)
(0109) }
(0110)
(0111) /*********************中斷發(fā)送服務(wù)處理子程序**************************/
(0112) #pragma interrupt_handler usart0_TX_interrupt:iv_USART0_TX // 21
(0113) void usart0_TX_interrupt(void)
(0114) {
(0115) _NOP();
D1 0000 NOP
(0116) UCSR0A |= (1<<6); //發(fā)送結(jié)束清零
D2 9A5E SBI 0x0B,6
D3 9009 LD R0,Y+
D4 BE0F OUT 0x3F,R0
D5 9009 LD R0,Y+
D6 9518 RETI
(0117) }
(0118) /*******************主程序****************************/
(0119) void main(void)
(0120) {
(0121)
(0122) CLI(); //總中斷禁止
_main:
D7 94F8 BCLR 7
(0123) init_devices();
D8 DFD8 RCALL _init_devices
(0124) SEI(); //總中斷允許
D9 9478 BSET 7
(0125)
(0126) while(1) //循環(huán)等待中斷處理
FILE: <library>
DA CFFF RJMP 0x00DA
DB 9508 RET
push_xgset303C:
DC 935A ST -Y,R21
DD 934A ST -Y,R20
DE 92DA ST -Y,R13
DF 92CA ST -Y,R12
E0 92BA ST -Y,R11
E1 92AA ST -Y,R10
E2 9508 RET
pop_xgset303C:
E3 90A9 LD R10,Y+
E4 90B9 LD R11,Y+
E5 90C9 LD R12,Y+
E6 90D9 LD R13,Y+
E7 9149 LD R20,Y+
E8 9159 LD R21,Y+
E9 9508 RET
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -