📄 chuankou.lst
字号:
__start:
__text_start:
59 EFCF LDI R28,0xFF
5A E1D0 LDI R29,0x10
5B BFCD OUT 0x3D,R28
5C BFDE OUT 0x3E,R29
5D 51C0 SUBI R28,0x10
5E 40D0 SBCI R29,0
5F EA0A LDI R16,0xAA
60 8308 ST Y,R16
61 2400 CLR R0
62 E2E5 LDI R30,0x25
63 E0F1 LDI R31,1
64 E011 LDI R17,1
65 32E5 CPI R30,0x25
66 07F1 CPC R31,R17
67 F011 BEQ 0x006A
68 9201 ST Z+,R0
69 CFFB RJMP 0x0065
6A 8300 ST Z,R16
6B E8EC LDI R30,0x8C
6C E0F0 LDI R31,0
6D E0A0 LDI R26,0
6E E0B1 LDI R27,1
6F E010 LDI R17,0
70 E000 LDI R16,0
71 BF0B OUT 0x3B,R16
72 3BE1 CPI R30,0xB1
73 07F1 CPC R31,R17
74 F021 BEQ 0x0079
75 95C8 LPM
76 9631 ADIW R30,1
77 920D ST X+,R0
78 CFF9 RJMP 0x0072
79 940E 00B9 CALL _main
_exit:
7B CFFF RJMP _exit
FILE: C:\DOCUME~1\wangqinbo\MYDOCU~1\avrc\chuankou.c
(0001) /***********************************************************/
(0002) //Title:ATMAGE128串口通信程序-查询方式
(0003) //ICC-AVR : 2009-2-22 13:37:40
(0004) // Target : M128
(0005) // Crystal: 8.0000Mhz
(0006) //Author :borlittle
(0007) //Function:usart0 test
(0008) //备注 :本程序经调试好使,如果程序不好使,请注意检查更改波特率和晶振频率以及
(0009) //检查调试助手和单片机的熔丝位设置,尤其注意不要编程103模式兼容位
(0010) /***********************************************************/
(0011) #include <iom128v.h>
(0012) #include <macros.h>
(0013)
(0014) #define uchar unsigned char //定义无符号字符为 uchar
(0015) #define uint unsigned int //定义无符号整型
(0016) #define Crystal 8000000 //晶振8MHZ
(0017) #define Baud 9600 //波特率
(0018)
(0019)
(0020) //函数声明
(0021) void port_init(void);
(0022) void usart0_init(void);
(0023) void init_devices(void);
(0024) void usart0_char_send(uchar i);
(0025) void usart0_str_send(char *s);
(0026) uchar usart0_char_receive(void);
(0027)
(0028) /******************端口初始化*******************************/
(0029) void port_init(void)
(0030) {
(0031) PORTA = 0xFF;
_port_init:
7C EF8F LDI R24,0xFF
7D BB8B OUT 0x1B,R24
(0032) DDRA = 0x00;
7E 2422 CLR R2
7F BA2A OUT 0x1A,R2
(0033) PORTB = 0xFF;
80 BB88 OUT 0x18,R24
(0034) DDRB = 0xFF;
81 BB87 OUT 0x17,R24
(0035) PORTC = 0xFF;
82 BB85 OUT 0x15,R24
(0036) DDRC = 0x00;
83 BA24 OUT 0x14,R2
(0037)
(0038) PORTE = 0xFF; //设置RXD0和TXD0
84 B983 OUT 0x03,R24
(0039) DDRE = 0x02;
85 E082 LDI R24,2
86 B982 OUT 0x02,R24
(0040)
(0041) PORTF = 0xFF;
87 EF8F LDI R24,0xFF
88 9380 0062 STS 0x0062,R24
(0042) DDRF = 0x00;
8A 9220 0061 STS 0x0061,R2
(0043) PORTG = 0xFF;
8C 9380 0065 STS 0x0065,R24
(0044) DDRG = 0xFF;
8E 9380 0064 STS 0x0064,R24
90 9508 RET
(0045) }
(0046) /*****************串口0初始化*********************************/
(0047) void usart0_init(void)
(0048) {
(0049) UCSR0B = 0x00; //禁止发送和接收
_usart0_init:
91 2422 CLR R2
92 B82A OUT 0x0A,R2
(0050) UCSR0A = 0x02; //倍速异步模式USX0=1
93 E082 LDI R24,2
94 B98B OUT 0x0B,R24
(0051) UCSR0C = 0x06; //0000 0110,UCSZ01=1,UCSZ00=1;8位字符,1位停止位
95 E086 LDI R24,6
96 9380 0095 STS 0x0095,R24
(0052) UBRR0L=(Crystal/8/(Baud+1))%256; //若为正常异步模式USX0=0则位(Crystal/16/(Baud+1))%256
98 E688 LDI R24,0x68
99 B989 OUT 0x09,R24
(0053) UBRR0H=(Crystal/8/(Baud+1))/256; //参见ATMAGE128使用手册
9A 9220 0090 STS 0x0090,R2
(0054) UCSR0B = 0x18; //允许发送和接收
9C E188 LDI R24,0x18
9D B98A OUT 0x0A,R24
9E 9508 RET
(0055) }
(0056) /******************初始器件**************************************/
(0057) void init_devices(void)
(0058) {
(0059) port_init();
_init_devices:
9F DFDC RCALL _port_init
(0060) usart0_init();
A0 CFF0 RJMP _usart0_init
(0061) }
(0062) //****************发送一个字符******************************
(0063) void usart0_char_send(uchar i)
(0064) {
(0065) while(!(UCSR0A&(1<<UDRE0)));
_usart0_char_send:
i --> R16
A1 9B5D SBIS 0x0B,5
A2 CFFE RJMP _usart0_char_send
(0066) UDR0=i;
A3 B90C OUT 0x0C,R16
A4 9508 RET
_usart0_str_send:
s --> R20
A5 934A ST -Y,R20
A6 935A ST -Y,R21
A7 01A8 MOVW R20,R16
(0067) }
(0068) /******************发送一个字符串*************************/
(0069) void usart0_str_send(char *s)
(0070) {
A8 C005 RJMP 0x00AE
(0071) while(*s)
(0072) {
(0073) usart0_char_send(*s);
A9 01FA MOVW R30,R20
AA 8100 LD R16,Z
AB DFF5 RCALL _usart0_char_send
(0074) s++;
AC 5F4F SUBI R20,0xFF
AD 4F5F SBCI R21,0xFF
AE 01FA MOVW R30,R20
AF 8020 LD R2,Z
B0 2022 TST R2
B1 F7B9 BNE 0x00A9
B2 9159 LD R21,Y+
B3 9149 LD R20,Y+
B4 9508 RET
(0075) }
(0076) }
(0077) /*****************接收一个字符****************************/
(0078) uchar usart0_char_receive(void)
(0079) {
(0080) while(!(UCSR0A&(1<<RXC0)));
_usart0_char_receive:
B5 9B5F SBIS 0x0B,7
B6 CFFE RJMP _usart0_char_receive
(0081) return UDR0;
B7 B10C IN R16,0x0C
B8 9508 RET
(0082) }
(0083) /***************主函数*****************************/
(0084) void main(void)
(0085) {
(0086) uchar usart0_temp;
(0087) init_devices();
_main:
usart0_temp --> R10
B9 DFE5 RCALL _init_devices
(0088) usart0_str_send("usart0 WORKS WELL ");
BA E100 LDI R16,0x10
BB E011 LDI R17,1
BC DFE8 RCALL _usart0_str_send
BD C00A RJMP 0x00C8
(0089) while(1)
(0090) {
(0091) usart0_temp=usart0_char_receive(); //等待接收数据
BE DFF6 RCALL _usart0_char_receive
BF 2EA0 MOV R10,R16
(0092) usart0_str_send("当前数据是:"); //发送数据
C0 E003 LDI R16,3
C1 E011 LDI R17,1
C2 DFE2 RCALL _usart0_str_send
(0093) usart0_char_send(usart0_temp);
C3 2D0A MOV R16,R10
C4 DFDC RCALL _usart0_char_send
(0094) usart0_str_send(" ");
FILE: <library>
C5 E000 LDI R16,0
C6 E011 LDI R17,1
C7 DFDD RCALL _usart0_str_send
C8 CFF5 RJMP 0x00BE
C9 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -