📄 uart.lst
字号:
__start:
__text_start:
002A E5CF LDI R28,0x5F
002B E0D4 LDI R29,4
002C BFCD OUT 0x3D,R28
002D BFDE OUT 0x3E,R29
002E 51C0 SUBI R28,0x10
002F 40D0 SBCI R29,0
0030 EA0A LDI R16,0xAA
0031 8308 STD Y+0,R16
0032 2400 CLR R0
0033 E6E0 LDI R30,0x60
0034 E0F0 LDI R31,0
0035 E010 LDI R17,0
0036 36E0 CPI R30,0x60
0037 07F1 CPC R31,R17
0038 F011 BEQ 0x003B
0039 9201 ST R0,Z+
003A CFFB RJMP 0x0036
003B 8300 STD Z+0,R16
003C E5E4 LDI R30,0x54
003D E0F0 LDI R31,0
003E E6A0 LDI R26,0x60
003F E0B0 LDI R27,0
0040 E010 LDI R17,0
0041 35E4 CPI R30,0x54
0042 07F1 CPC R31,R17
0043 F021 BEQ 0x0048
0044 95C8 LPM
0045 9631 ADIW R30,1
0046 920D ST R0,X+
0047 CFF9 RJMP 0x0041
0048 940E006E CALL _main
_exit:
004A CFFF RJMP _exit
_delay_ms:
i --> R20
time --> R16
004B 940E00AB CALL push_gset1
FILE: D:\AVR\我的程序\异步串口UART实验\cfg.h
(0001) /*******************************
(0002) *程序名称:功能函数集
(0003) *作 者:萧联珠
(0004) *日 期:2007-11-20
(0005) ********************************/
(0006) #include <iom16v.h>
(0007)
(0008) /*延时子程序*/
(0009) void delay_ms(int time)
(0010) {
(0011) int i;
(0012) for(;time>0;time--)
004D C00A RJMP 0x0058
(0013) for(i=0;i<100;i++);
004E 2744 CLR R20
004F 2755 CLR R21
0050 5F4F SUBI R20,0xFF
0051 4F5F SBCI R21,0xFF
0052 3644 CPI R20,0x64
0053 E0E0 LDI R30,0
0054 075E CPC R21,R30
0055 F3D4 BLT 0x0050
0056 5001 SUBI R16,1
0057 4010 SBCI R17,0
0058 2422 CLR R2
0059 2433 CLR R3
005A 1620 CP R2,R16
005B 0631 CPC R3,R17
005C F38C BLT 0x004E
005D 940E00AE CALL pop_gset1
005F 9508 RET
(0014) }
(0015)
(0016) /*端口初始化*/
(0017) void port_init()
(0018) {
(0019) DDRD|=(1<<DDD5); //配置PD5口为输出
_port_init:
0060 9A8D SBI 0x11,5
(0020) PORTD|=(1<<PD5); //PD5口的初始值为"1"
0061 9A95 SBI 0x12,5
0062 9508 RET
(0021) }
(0022)
(0023) /*串口初始化*/
(0024) void uart_init()
(0025) {
(0026) UCSRA=0x02; //异步正常模式
_uart_init:
0063 E082 LDI R24,2
0064 B98B OUT 0x0B,R24
(0027) UCSRB=0x18; //允许发送接受中断和使能
0065 E188 LDI R24,0x18
0066 B98A OUT 0x0A,R24
(0028) UCSRC=0x06; //8位数据
0067 E086 LDI R24,6
0068 BD80 OUT 0x20,R24
(0029) UBRRH=0x00;
0069 2422 CLR R2
006A BC20 OUT 0x20,R2
(0030) UBRRL=12; //波特率位9600
006B E08C LDI R24,0xC
006C B989 OUT 0x09,R24
006D 9508 RET
FILE: D:\AVR\我的程序\异步串口UART实验\main.c
(0001) /***********************************
(0002) *实验目的:熟悉UART编程
(0003) *设 计:萧联珠
(0004) *日 期:2007-11-20
(0005) ************************************/
(0006) #include <iom16v.h>
(0007) #include "cfg.h"
(0008)
(0009) void main()
(0010) {
(0011) char num;
(0012) unsigned int i;
(0013) port_init();
_main:
num --> R20
i --> R22
006E DFF1 RCALL _port_init
(0014) uart_init();
006F DFF3 RCALL _uart_init
0070 C030 RJMP 0x00A1
(0015)
(0016) while(1)
(0017) {
(0018) num=UDR;
0071 B14C IN R20,0x0C
(0019) if((num=='a')|(num=='A')) //假如接收到A或a则发送0到9
0072 3641 CPI R20,0x61
0073 F421 BNE 0x0078
0074 E081 LDI R24,1
0075 E090 LDI R25,0
0076 015C MOVW R10,R24
0077 C002 RJMP 0x007A
0078 24AA CLR R10
0079 24BB CLR R11
007A 3441 CPI R20,0x41
007B F419 BNE 0x007F
007C E061 LDI R22,1
007D E070 LDI R23,0
007E C002 RJMP 0x0081
007F 2766 CLR R22
0080 2777 CLR R23
0081 0115 MOVW R2,R10
0082 2A26 OR R2,R22
0083 2A37 OR R3,R23
0084 2022 TST R2
0085 F411 BNE 0x0088
0086 2033 TST R3
0087 F081 BEQ 0x0098
(0020) {
(0021) UCSRB|=(1<<TXEN); //发送使能
0088 9A53 SBI 0x0A,3
(0022) while(!(UCSRA&(1<<UDRE))); //等待发送准备完备
0089 9B5D SBIS 0x0B,5
008A CFFE RJMP 0x0089
(0023) for(i=0;i<10;i++)
008B 2766 CLR R22
008C 2777 CLR R23
008D C005 RJMP 0x0093
(0024) {
(0025) UDR=i;
008E B96C OUT 0x0C,R22
(0026) while(!(UCSRA&(1<<UDRE)));
008F 9B5D SBIS 0x0B,5
0090 CFFE RJMP 0x008F
0091 5F6F SUBI R22,0xFF
0092 4F7F SBCI R23,0xFF
0093 306A CPI R22,0xA
0094 E0E0 LDI R30,0
0095 077E CPC R23,R30
0096 F3B8 BCS 0x008E
(0027) }
(0028) }
0097 C009 RJMP 0x00A1
(0029) else if(num=='8') //假如接收到8则停止发送数据
0098 3348 CPI R20,0x38
0099 F411 BNE 0x009C
(0030) UCSRB&=~(1<<TXEN);
009A 9853 CBI 0x0A,3
009B C005 RJMP 0x00A1
(0031) else //否则轰鸣器报警
(0032) {
(0033) PORTD|=1<<PD5;
009C 9A95 SBI 0x12,5
(0034) delay_ms(100);
009D E604 LDI R16,0x64
009E E010 LDI R17,0
009F DFAB RCALL _delay_ms
(0035) PORTD&=~(1<<PD5);
FILE: <library>
00A0 9895 CBI 0x12,5
00A1 CFCF RJMP 0x0071
00A2 9508 RET
push_gset5:
00A3 92FA ST R15,-Y
00A4 92EA ST R14,-Y
push_gset4:
00A5 92DA ST R13,-Y
00A6 92CA ST R12,-Y
push_gset3:
00A7 92BA ST R11,-Y
00A8 92AA ST R10,-Y
push_gset2:
00A9 937A ST R23,-Y
00AA 936A ST R22,-Y
push_gset1:
00AB 935A ST R21,-Y
00AC 934A ST R20,-Y
00AD 9508 RET
pop_gset1:
00AE E0E1 LDI R30,1
pop:
00AF 9149 LD R20,Y+
00B0 9159 LD R21,Y+
00B1 FDE0 SBRC R30,0
00B2 9508 RET
00B3 9169 LD R22,Y+
00B4 9179 LD R23,Y+
00B5 FDE1 SBRC R30,1
00B6 9508 RET
00B7 90A9 LD R10,Y+
00B8 90B9 LD R11,Y+
00B9 FDE2 SBRC R30,2
00BA 9508 RET
00BB 90C9 LD R12,Y+
00BC 90D9 LD R13,Y+
00BD FDE3 SBRC R30,3
00BE 9508 RET
00BF 90E9 LD R14,Y+
00C0 90F9 LD R15,Y+
00C1 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -