📄 uart.lst
字号:
__start:
__text_start:
002B E5CF LDI R28,0x5F
002C E0D4 LDI R29,4
002D BFCD OUT P3D,R28
002E BFDE OUT P3E,R29
002F 51C0 SUBI R28,0x10
0030 40D0 SBCI R29,0
0031 EA0A LDI R16,0xAA
0032 8308 STD R16,0+Y
0033 2400 CLR R0
0034 E6E2 LDI R30,0x62
0035 E0F0 LDI R31,0
0036 E010 LDI R17,0
0037 36E2 CPI R30,0x62
0038 07F1 CPC R31,R17
0039 F011 BEQ 0x003C
003A 9201 ST R0,Z+
003B CFFB RJMP 0x0037
003C 8300 STD R16,0+Z
003D E5E4 LDI R30,0x54
003E E0F0 LDI R31,0
003F E6A0 LDI R26,0x60
0040 E0B0 LDI R27,0
0041 E010 LDI R17,0
0042 35E6 CPI R30,0x56
0043 07F1 CPC R31,R17
0044 F021 BEQ 0x0049
0045 95C8 LPM
0046 9631 ADIW R30,1
0047 920D ST R0,X+
0048 CFF9 RJMP 0x0042
0049 940E004C CALL _main
_exit:
004B CFFF RJMP _exit
FILE: D:\ELECTRICS\MCU\AVR\ICC_EXAM\UART\uart.c
(0001) // **************************************************************
(0002) // *** AVR单片机应用程序 ***
(0003) // *** RS232通信演示程序 ***
(0004) // *** 2005年10月 ***
(0005) // *** 目标MCU:MEGA16,晶振:内部(INT)8MHZ,19200,8bit,N,1 ***
(0006) // *** 实现将PC机串行给MEGA16的数送回给PCS机 ***
(0007) // **************************************************************
(0008) #include<iom16v.h>
(0009) #include<macros.h>
(0010) #include "uart.h"
(0011)
(0012) /*声明串口接收中断入口*/
(0013) #pragma interrupt_handler uart_rx:12
(0014) unsigned char data_tx=0,data_rx=0; //定义发送缓存和接收缓存
(0015)
(0016)
(0017)
(0018) /*RS232通信main函数*/
(0019) void main(void)
(0020) {
(0021) CLI(); //关中断
_main:
004C 94F8 BCLR 7
(0022) uart_init(); //串口初始化
004D D00F RCALL _uart_init
(0023) SEI(); //开中断
004E 9478 BSET 7
(0024) while(1)
004F CFFF RJMP 0x004F
(0025) {uart_rx;}
(0026) }
0050 9508 RET
_uart_rx:
0051 940E006C CALL push_lset
(0027)
(0028) /*串口接收函数*/
(0029) void uart_rx(void)
(0030) {
(0031) data_rx = UDR;
0053 B02C IN R2,P0C
0054 92200061 STS 0x61,R2
(0032) data_tx=data_rx;
0056 92200060 STS 0x60,R2
(0033) putchar(data_tx);
0058 2D02 MOV R16,R2
0059 D00E RCALL _putchar
(0034) }
005A 940E0083 CALL pop_lset
005C 9518 RETI
(0035)
(0036)
(0037) /*串口初始化函数*/
(0038) void uart_init(void)
(0039) {
(0040) UCSRB = 0x00; //设置波特率时关闭发送和接收
_uart_init:
005D 2422 CLR R2
005E B82A OUT P0A,R2
(0041) UBRRL = 0x19;
005F E189 LDI R24,0x19
0060 B989 OUT P09,R24
(0042) UBRRH = 0x00; //设定波特率,19200
0061 BC20 OUT P20,R2
(0043) UCSRA = 0x00; //初始化
0062 B82B OUT P0B,R2
(0044) UCSRC = 0x86; //设置帧格式,8位数据,无奇偶校验,1位停止位
0063 E886 LDI R24,0x86
0064 BD80 OUT P20,R24
(0045) UCSRB =(1<<RXCIE)|(1<<RXEN)|(1<<TXEN); //允许发送和接收,接收中断使能
0065 E988 LDI R24,0x98
0066 B98A OUT P0A,R24
(0046) }
0067 9508 RET
(0047)
(0048)
(0049) /*字节输出函数*/
(0050) void putchar(unsigned char data)
(0051) {
(0052) while (!(UCSRA&(1<<UDRE))); //判断上次发送是否完成
_putchar:
data --> R16
0068 9B5D SBIS P0B,5
0069 CFFE RJMP _putchar
(0053) UDR=data; //发送数据
006A B90C OUT P0C,R16
(0054) }
FILE: <library>
006B 9508 RET
push_lset:
006C 93FA ST R31,-Y
006D 93EA ST R30,-Y
006E 93BA ST R27,-Y
006F 93AA ST R26,-Y
0070 939A ST R25,-Y
0071 938A ST R24,-Y
0072 933A ST R19,-Y
0073 932A ST R18,-Y
0074 931A ST R17,-Y
0075 930A ST R16,-Y
0076 929A ST R9,-Y
0077 928A ST R8,-Y
0078 927A ST R7,-Y
0079 926A ST R6,-Y
007A 925A ST R5,-Y
007B 924A ST R4,-Y
007C 923A ST R3,-Y
007D 922A ST R2,-Y
007E 921A ST R1,-Y
007F 920A ST R0,-Y
0080 B60F IN R0,P3F
0081 920A ST R0,-Y
0082 9508 RET
pop_lset:
0083 9009 LD R0,Y+
0084 BE0F OUT P3F,R0
0085 9009 LD R0,Y+
0086 9019 LD R1,Y+
0087 9029 LD R2,Y+
0088 9039 LD R3,Y+
0089 9049 LD R4,Y+
008A 9059 LD R5,Y+
008B 9069 LD R6,Y+
008C 9079 LD R7,Y+
008D 9089 LD R8,Y+
008E 9099 LD R9,Y+
008F 9109 LD R16,Y+
0090 9119 LD R17,Y+
0091 9129 LD R18,Y+
0092 9139 LD R19,Y+
0093 9189 LD R24,Y+
0094 9199 LD R25,Y+
0095 91A9 LD R26,Y+
0096 91B9 LD R27,Y+
0097 91E9 LD R30,Y+
0098 91F9 LD R31,Y+
0099 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -