📄 串口发送接收.lst
字号:
__start:
__text_start:
19 E5CF LDI R28,0x5F
1A E0D4 LDI R29,4
1B BFCD OUT 0x3D,R28
1C BFDE OUT 0x3E,R29
1D 51CE SUBI R28,0x1E
1E 40D0 SBCI R29,0
1F EA0A LDI R16,0xAA
20 8308 STD Y+0,R16
21 2400 CLR R0
22 E6EC LDI R30,0x6C
23 E0F0 LDI R31,0
24 E010 LDI R17,0
25 36EC CPI R30,0x6C
26 07F1 CPC R31,R17
27 F011 BEQ 0x002A
28 9201 ST R0,Z+
29 CFFB RJMP 0x0025
2A 8300 STD Z+0,R16
2B E2E6 LDI R30,0x26
2C E0F0 LDI R31,0
2D E6A0 LDI R26,0x60
2E E0B0 LDI R27,0
2F E010 LDI R17,0
30 E000 LDI R16,0
31 BF0B OUT 0x3B,R16
32 33E2 CPI R30,0x32
33 07F1 CPC R31,R17
34 F021 BEQ 0x0039
35 95C8 LPM
36 9631 ADIW R30,1
37 920D ST R0,X+
38 CFF9 RJMP 0x0032
39 D08D RCALL _main
_exit:
3A CFFF RJMP _exit
FILE: E:\xiaozhiyong2009\设计资料\项目设计\ICCAVR_mega8_C\ICCAVR_mega8_串口发送接收\串口发送接收.c
(0001) //ICC-AVR application builder : 2009-3-11 14:28:07
(0002) // Target : M8
(0003) // Crystal: 8.0000Mhz
(0004)
(0005) #include <iom8v.h>
(0006) #include <macros.h>
(0007)
(0008) void port_init(void)
(0009) {
(0010) PORTB = 0x00;
_port_init:
3B 2422 CLR R2
3C BA28 OUT 0x18,R2
(0011) DDRB = 0x00;
3D BA27 OUT 0x17,R2
(0012) PORTC = 0x00; //m103 output only
3E BA25 OUT 0x15,R2
(0013) DDRC = 0x00;
3F BA24 OUT 0x14,R2
(0014) PORTD = 0x00;
40 BA22 OUT 0x12,R2
(0015) DDRD = 0x00;
41 BA21 OUT 0x11,R2
42 9508 RET
(0016) }
(0017)
(0018) //call this routine to initialize all peripherals
(0019) void init_devices(void)
(0020) {
(0021) //stop errant interrupts until set up
(0022) CLI(); //disable all interrupts
_init_devices:
43 94F8 BCLR 7
(0023) port_init();
44 DFF6 RCALL _port_init
(0024)
(0025) MCUCR = 0x00;
45 2422 CLR R2
46 BE25 OUT 0x35,R2
(0026) GICR = 0x00;
47 BE2B OUT 0x3B,R2
(0027) TIMSK = 0x00; //timer interrupt sources
48 BE29 OUT 0x39,R2
(0028) SEI(); //re-enable interrupts
49 9478 BSET 7
4A 9508 RET
(0029) //all peripherals are now initialized
(0030) }
(0031)
(0032) /************************************
(0033) Name :小延时程序
(0034) Target :atmega8
(0035) Crystal(晶振):8M
(0036) ************************************/
(0037) void delay()
(0038) {
(0039) unsigned int i;//最大值65536
(0040) for (i=0;i<40000;i++)
_delay:
i --> R16
4B 2700 CLR R16
4C 2711 CLR R17
4D C002 RJMP 0x0050
4E 5F0F SUBI R16,0xFF
4F 4F1F SBCI R17,0xFF
50 E480 LDI R24,0x40
51 E99C LDI R25,0x9C
52 E0A0 LDI R26,0
53 E0B0 LDI R27,0
54 0118 MOVW R2,R16
55 2444 CLR R4
56 2455 CLR R5
57 1628 CP R2,R24
58 0639 CPC R3,R25
59 064A CPC R4,R26
5A 065B CPC R5,R27
5B F394 BLT 0x004E
5C 9508 RET
(0041) {;}
(0042) }
(0043)
(0044) /***********************************************************
(0045) 用 途:串口发送接收程序
(0046) Taget :mega8
(0047) crystal :8M
(0048) 介 绍:
(0049) **********************************************************/
(0050) //晶振和波特率
(0051) #define fosc 8000000
(0052) #define baud 9600
(0053) //UART初始化函数
(0054) void init_uart()
(0055) {
(0056) UCSRB=(1<<RXEN)|(1<<TXEN)|(1<<RXCIE);//允许收发,打开接收中断
_init_uart:
5D E988 LDI R24,0x98
5E B98A OUT 0x0A,R24
(0057) UBRRL=(fosc/16/(baud+1))%256;//设置波特率寄存器
5F E384 LDI R24,0x34
60 B989 OUT 0x09,R24
(0058) UBRRH=(fosc/16/(baud+1))/256;
61 2422 CLR R2
62 BC20 OUT 0x20,R2
(0059) UCSRC=(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);//8位数据+1位STOP
63 E886 LDI R24,0x86
64 BD80 OUT 0x20,R24
65 9508 RET
(0060) }
(0061) //字符输出
(0062) void uart_putchar(unsigned char c)
(0063) {
(0064) while(!(UCSRA&(1<<UDRE)));//上次发送有没有完成
_uart_putchar:
c --> R16
66 9B5D SBIS 0x0B,5
67 CFFE RJMP _uart_putchar
(0065) UDR=c;
68 B90C OUT 0x0C,R16
69 9508 RET
(0066) }
(0067) //字符输入
(0068) unsigned char uart_getchar()
(0069) {
(0070) while(!(UCSRA&(1<<RXC))){;}//有没有接收到数据
_uart_getchar:
6A 9B5F SBIS 0x0B,7
6B CFFE RJMP _uart_getchar
(0071) return UDR;
6C B10C IN R16,0x0C
6D 9508 RET
_uart_print:
s --> R20
6E 934A ST R20,-Y
6F 935A ST R21,-Y
70 01A8 MOVW R20,R16
(0072) }
(0073) //带回车的字符串输出
(0074) int uart_print(char *s)
(0075) {
71 C005 RJMP 0x0077
(0076) while(*s)
(0077) {
(0078) uart_putchar(*s);
72 01FA MOVW R30,R20
73 8100 LDD R16,Z+0
74 DFF1 RCALL _uart_putchar
(0079) s++;
75 5F4F SUBI R20,0xFF
76 4F5F SBCI R21,0xFF
77 01FA MOVW R30,R20
78 8020 LDD R2,Z+0
79 2022 TST R2
7A F7B9 BNE 0x0072
(0080) }
(0081) uart_putchar(0x0a);//回车换行
7B E00A LDI R16,0xA
7C DFE9 RCALL _uart_putchar
(0082) uart_putchar(0x0d);
7D E00D LDI R16,0xD
7E DFE7 RCALL _uart_putchar
(0083) return 1;
7F E001 LDI R16,1
80 E010 LDI R17,0
81 9159 LD R21,Y+
82 9149 LD R20,Y+
83 9508 RET
_uart_prints:
s --> R20
84 934A ST R20,-Y
85 935A ST R21,-Y
86 01A8 MOVW R20,R16
(0084) }
(0085) //不带回车换行的字符串输出
(0086) void uart_prints(char *s)
(0087) {
87 C005 RJMP 0x008D
(0088) while(*s)
(0089) {
(0090) uart_putchar(*s);
88 01FA MOVW R30,R20
89 8100 LDD R16,Z+0
8A DFDB RCALL _uart_putchar
(0091) s++;
8B 5F4F SUBI R20,0xFF
8C 4F5F SBCI R21,0xFF
8D 01FA MOVW R30,R20
8E 8020 LDD R2,Z+0
8F 2022 TST R2
90 F7B9 BNE 0x0088
91 9159 LD R21,Y+
92 9149 LD R20,Y+
93 9508 RET
_uart_rec_int:
94 920A ST R0,-Y
95 921A ST R1,-Y
96 922A ST R2,-Y
97 923A ST R3,-Y
98 924A ST R4,-Y
99 925A ST R5,-Y
9A 926A ST R6,-Y
9B 927A ST R7,-Y
9C 928A ST R8,-Y
9D 929A ST R9,-Y
9E 930A ST R16,-Y
9F 931A ST R17,-Y
A0 932A ST R18,-Y
A1 933A ST R19,-Y
A2 938A ST R24,-Y
A3 939A ST R25,-Y
A4 93AA ST R26,-Y
A5 93BA ST R27,-Y
A6 93EA ST R30,-Y
A7 93FA ST R31,-Y
A8 B60F IN R0,0x3F
A9 920A ST R0,-Y
(0092) }
(0093) }
(0094) //接收中断
(0095) #pragma interrupt_handler uart_rec_int:iv_USART_RX
(0096) void uart_rec_int()
(0097) {
(0098) uart_putchar(UDR);
AA B10C IN R16,0x0C
AB DFBA RCALL _uart_putchar
(0099) uart_putchar(0x0a);//回车换行
AC E00A LDI R16,0xA
AD DFB8 RCALL _uart_putchar
(0100) uart_putchar(0x0d);
AE E00D LDI R16,0xD
AF DFB6 RCALL _uart_putchar
B0 9009 LD R0,Y+
B1 BE0F OUT 0x3F,R0
B2 91F9 LD R31,Y+
B3 91E9 LD R30,Y+
B4 91B9 LD R27,Y+
B5 91A9 LD R26,Y+
B6 9199 LD R25,Y+
B7 9189 LD R24,Y+
B8 9139 LD R19,Y+
B9 9129 LD R18,Y+
BA 9119 LD R17,Y+
BB 9109 LD R16,Y+
BC 9099 LD R9,Y+
BD 9089 LD R8,Y+
BE 9079 LD R7,Y+
BF 9069 LD R6,Y+
C0 9059 LD R5,Y+
C1 9049 LD R4,Y+
C2 9039 LD R3,Y+
C3 9029 LD R2,Y+
C4 9019 LD R1,Y+
C5 9009 LD R0,Y+
C6 9518 RETI
(0101) }
(0102) //**************************************************************************
(0103)
(0104) void main()
(0105) {
(0106) port_init();
_main:
C7 DF73 RCALL _port_init
(0107) init_devices();
C8 DF7A RCALL _init_devices
(0108)
(0109) init_uart();
C9 DF93 RCALL _init_uart
(0110) uart_print("xiaozhiyong");
CA E600 LDI R16,0x60
CB E010 LDI R17,0
CC DFA1 RCALL _uart_print
(0111) while(1)
FILE: <library>
CD CFFF RJMP 0x00CD
CE 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -