📄 uart.lst
字号:
__start:
__text_start:
2A E5CF LDI R28,0x5F
2B E0D4 LDI R29,4
2C BFCD OUT 0x3D,R28
2D BFDE OUT 0x3E,R29
2E 51C0 SUBI R28,0x10
2F 40D0 SBCI R29,0
30 EA0A LDI R16,0xAA
31 8308 STD Y+0,R16
32 2400 CLR R0
33 E6E0 LDI R30,0x60
34 E0F0 LDI R31,0
35 E010 LDI R17,0
36 36E0 CPI R30,0x60
37 07F1 CPC R31,R17
38 F011 BEQ 0x003B
39 9201 ST R0,Z+
3A CFFB RJMP 0x0036
3B 8300 STD Z+0,R16
3C E5E4 LDI R30,0x54
3D E0F0 LDI R31,0
3E E6A0 LDI R26,0x60
3F E0B0 LDI R27,0
40 E010 LDI R17,0
41 E000 LDI R16,0
42 BF0B OUT 0x3B,R16
43 35E4 CPI R30,0x54
44 07F1 CPC R31,R17
45 F021 BEQ 0x004A
46 95C8 LPM
47 9631 ADIW R30,1
48 920D ST R0,X+
49 CFF9 RJMP 0x0043
4A 940E 008A CALL _main
_exit:
4C CFFF RJMP _exit
FILE: D:\iccavr\mega16\11\UART\uart.h
(0001) /**********串口端口定义**********/
(0002) #define RxD PD0
(0003) #define TxD PD1
(0004)
(0005) #define baudrate 9600 //波特率
(0006) #define F_CPU 8000000UL //定义晶振频率
(0007)
(0008) void uart_init(void)
(0009) {
(0010) /*****RS232口线设置*****/
(0011) PORTD|=BIT(RxD)|BIT(TxD);
_uart_init:
4D B382 IN R24,0x12
4E 6083 ORI R24,3
4F BB82 OUT 0x12,R24
(0012) DDRD&=~BIT(RxD);
50 9888 CBI 0x11,0
(0013) DDRD|=BIT(TxD);
51 9A89 SBI 0x11,1
(0014)
(0015) /* 设置波特率*/
(0016) UBRRL=(F_CPU/baudrate/16-1)%256; //本设置波特率不加倍及U2X=0
52 E383 LDI R24,0x33
53 B989 OUT 0x09,R24
(0017) UBRRH=(F_CPU/baudrate/16-1)/256;
54 2422 CLR R2
55 BC20 OUT 0x20,R2
(0018) /*U2X=1的设置波特率*/
(0019) //UBRRL= (F_CPU/BAUDRATE/8-1)%256;
(0020) //UBRRH= (F_CPU/BAUDRATE/8-1)/256;
(0021)
(0022) /* 接收器与发送器使能*/
(0023) //UCSRB=(1<<RXEN)|(1<<TXEN);
(0024) UCSRB|=BIT(4)|BIT(3);
56 B18A IN R24,0x0A
57 6188 ORI R24,0x18
58 B98A OUT 0x0A,R24
(0025)
(0026) /*设置传输格式*/
(0027) //异步,8位数据,无奇偶校验,一个停止位,无倍速
(0028) //UCSRC=(1<<URSEL)|(1<<UCSZ0)|(1<<UCSZ1);
(0029) UCSRC|=BIT(7)|BIT(2)|BIT(1);
59 B580 IN R24,0x20
5A 6886 ORI R24,0x86
5B BD80 OUT 0x20,R24
5C 9508 RET
(0030) }
(0031)
(0032) //串口数据发送,查询方式
(0033) void putc(unsigned char c)
(0034) {
(0035) /* 等待发送缓冲器为空 */
(0036) while (!(UCSRA&(1<<UDRE)));
_putc:
c --> R16
5D 9B5D SBIS 0x0B,5
5E CFFE RJMP _putc
(0037) /* 将数据放入缓冲器,发送数据 */
(0038) UDR = c;
5F B90C OUT 0x0C,R16
60 9508 RET
_puts:
s --> R20
61 934A ST R20,-Y
62 935A ST R21,-Y
63 01A8 MOVW R20,R16
(0039) }
(0040)
(0041) //串口字符串发送,查询方式
(0042) void puts(unsigned char *s)
(0043) {
64 C005 RJMP 0x006A
(0044) while(*s)
(0045) {
(0046) putc(*s);
65 01FA MOVW R30,R20
66 8100 LDD R16,Z+0
67 DFF5 RCALL _putc
(0047) s++;
68 5F4F SUBI R20,0xFF
69 4F5F SBCI R21,0xFF
6A 01FA MOVW R30,R20
6B 8020 LDD R2,Z+0
6C 2022 TST R2
6D F7B9 BNE 0x0065
(0048) }
(0049) putc('\n');
6E E00A LDI R16,0xA
6F DFED RCALL _putc
70 9159 LD R21,Y+
71 9149 LD R20,Y+
72 9508 RET
(0050) //return 1;
(0051) }
(0052)
(0053) //串口数据接收,查询方式
(0054) unsigned char getc(void)
(0055) {
(0056) /* 等待接收数据*/
(0057) while (!(UCSRA&(1<<RXC)));
_getc:
73 9B5F SBIS 0x0B,7
74 CFFE RJMP _getc
(0058) /* 从缓冲器中获取并返回数据*/
(0059) return UDR;
75 B10C IN R16,0x0C
76 9508 RET
_get_s:
i --> R20
num --> R10
js --> R12
77 940E 0090 CALL push_xgset303C
79 0159 MOVW R10,R18
7A 0168 MOVW R12,R16
(0060) }
(0061)
(0062) //串口接收数据存储,存储到数组中
(0063) void get_s(unsigned char *js,unsigned int num)
(0064) {
(0065) unsigned int i;
(0066) for(i=0;i<num;i++)
7B 2744 CLR R20
7C 2755 CLR R21
7D C007 RJMP 0x0085
(0067) {
(0068) js[i]=getc(); //保存数据到数组里面
7E DFF4 RCALL _getc
7F 01FA MOVW R30,R20
80 0DEC ADD R30,R12
81 1DFD ADC R31,R13
82 8300 STD Z+0,R16
83 5F4F SUBI R20,0xFF
84 4F5F SBCI R21,0xFF
85 154A CP R20,R10
86 055B CPC R21,R11
87 F3B0 BCS 0x007E
88 940C 0097 JMP pop_xgset303C
FILE: D:\iccavr\mega16\11\UART\TEST.C
(0001) //ICC-AVR application builder : 2008-11-4 12:34:31
(0002) // Target : M16
(0003) // Crystal: 8.0000Mhz
(0004)
(0005) #include <iom16v.h>
(0006) #include <macros.h>
(0007)
(0008) #include "uart.h"
(0009)
(0010) void main(void)
(0011) {
(0012) uart_init();
_main:
8A DFC2 RCALL _uart_init
8B C002 RJMP 0x008E
(0013) while(1)
(0014) {
(0015) putc(getc());
FILE: <library>
8C DFE6 RCALL _getc
8D DFCF RCALL _putc
8E CFFD RJMP 0x008C
8F 9508 RET
push_xgset303C:
90 935A ST R21,-Y
91 934A ST R20,-Y
92 92DA ST R13,-Y
93 92CA ST R12,-Y
94 92BA ST R11,-Y
95 92AA ST R10,-Y
96 9508 RET
pop_xgset303C:
97 90A9 LD R10,Y+
98 90B9 LD R11,Y+
99 90C9 LD R12,Y+
9A 90D9 LD R13,Y+
9B 9149 LD R20,Y+
9C 9159 LD R21,Y+
9D 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -