📄 usart_int.lst
字号:
__start:
__text_start:
0038 E5CF LDI R28,0x5F
0039 E0D4 LDI R29,4
003A BFCD OUT 0x3D,R28
003B BFDE OUT 0x3E,R29
003C 51C0 SUBI R28,0x10
003D 40D0 SBCI R29,0
003E EA0A LDI R16,0xAA
003F 8308 STD Y+0,R16
0040 2400 CLR R0
0041 EAE9 LDI R30,0xA9
0042 E0F0 LDI R31,0
0043 E010 LDI R17,0
0044 3AE9 CPI R30,0xA9
0045 07F1 CPC R31,R17
0046 F011 BEQ 0x0049
0047 9201 ST R0,Z+
0048 CFFB RJMP 0x0044
0049 8300 STD Z+0,R16
004A E2E6 LDI R30,0x26
004B E0F0 LDI R31,0
004C E6A0 LDI R26,0x60
004D E0B0 LDI R27,0
004E E010 LDI R17,0
004F 36EF CPI R30,0x6F
0050 07F1 CPC R31,R17
0051 F021 BEQ 0x0056
0052 95C8 LPM
0053 9631 ADIW R30,1
0054 920D ST R0,X+
0055 CFF9 RJMP 0x004F
0056 D064 RCALL _main
_exit:
0057 CFFF RJMP _exit
FILE: F:\Learn\AVR\Pro_Mega8\USART\usart_int\usart_int.c
(0001) /******************************************/
(0002) //文件名:usart_int.c
(0003) //功能: 中断模式串口通信的应用
(0004) //作者: young
(0005) //时间: 2006.11.16
(0006) //目标MCU:ATmega8
(0007) //晶振: 8MHZ
(0008) /******************************************/
(0009) //通信波特率为9600(8位数据,无校验,1位停止位,无数据流控制)。
(0010)
(0011) #include <iom8v.h>
(0012) #include <macros.h>
(0013)
(0014) #define fosc 8000000 //晶振8MHZ
(0015) #define baud 9600 //波特率
(0016) unsigned char gU8getchar=0x00;
(0017) unsigned char gU8RecBuff[3]={0,0,0};
(0018)
(0019) //字符输出函数
(0020) void putchar(unsigned char c)
(0021) {
(0022) //等待写入UDR的字符被送到发送移位寄存器
(0023) while (!(UCSRA&(1<<UDRE)));
_putchar:
c --> R16
0058 9B5D SBIS 0x0B,5
0059 CFFE RJMP _putchar
(0024) UDR=c;
005A B90C OUT 0x0C,R16
(0025) }
005B 9508 RET
(0026)
(0027) //字符输入函数
(0028) unsigned char getchar(void)
(0029) {
(0030) //等待接收字符
(0031) while(!(UCSRA&(1<<RXC)));
_getchar:
005C 9B5F SBIS 0x0B,7
005D CFFE RJMP _getchar
(0032) return UDR;
005E B10C IN R16,0x0C
005F 9508 RET
_puts:
s --> R20
0060 D093 RCALL push_gset1
0061 01A8 MOVW R20,R16
(0033) }
(0034)
(0035) //字符串输出函数
(0036) int puts(char *s)
(0037) {
0062 C005 RJMP 0x0068
(0038) while (*s)
(0039) {
(0040) putchar(*s);
0063 01FA MOVW R30,R20
0064 8100 LDD R16,Z+0
0065 DFF2 RCALL _putchar
(0041) s++;
0066 5F4F SUBI R20,0xFF
0067 4F5F SBCI R21,0xFF
0068 01FA MOVW R30,R20
0069 8020 LDD R2,Z+0
006A 2022 TST R2
006B F7B9 BNE 0x0063
(0042) }
(0043) return 1;
006C E001 LDI R16,1
006D E010 LDI R17,0
006E D088 RCALL pop_gset1
006F 9508 RET
_puts_hh:
s --> R20
0070 D083 RCALL push_gset1
0071 01A8 MOVW R20,R16
(0044) }
(0045)
(0046) //含回车换行的字符串输出函数
(0047) void puts_hh(char *s)
(0048) {
0072 C005 RJMP 0x0078
(0049) while (*s)
(0050) {
(0051) putchar(*s);
0073 01FA MOVW R30,R20
0074 8100 LDD R16,Z+0
0075 DFE2 RCALL _putchar
(0052) s++;
0076 5F4F SUBI R20,0xFF
0077 4F5F SBCI R21,0xFF
0078 01FA MOVW R30,R20
0079 8020 LDD R2,Z+0
007A 2022 TST R2
007B F7B9 BNE 0x0073
(0053) }
(0054) putchar(0x0a);//换行
007C E00A LDI R16,0xA
007D DFDA RCALL _putchar
(0055) putchar(0x0d);//回车
007E E00D LDI R16,0xD
007F DFD8 RCALL _putchar
(0056) }
0080 D076 RCALL pop_gset1
0081 9508 RET
(0057)
(0058) //UART初始化
(0059) void uart_init(void)
(0060) {
(0061) UCSRB=0x00;
_uart_init:
0082 2422 CLR R2
0083 B82A OUT 0x0A,R2
(0062) UCSRA=0x00;
0084 B82B OUT 0x0B,R2
(0063) UBRRL=(fosc/16/baud-1)%256;
0085 E383 LDI R24,0x33
0086 B989 OUT 0x09,R24
(0064) UBRRH=(fosc/16/baud-1)/256;
0087 BC20 OUT 0x20,R2
(0065) UCSRC=(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);//8位数据+1位停止位
0088 E886 LDI R24,0x86
0089 BD80 OUT 0x20,R24
(0066) //允许发送和接收,接收完成中断允许
(0067) UCSRB=(1<<RXEN)|(1<<TXEN)|(1<<RXCIE);
008A E988 LDI R24,0x98
008B B98A OUT 0x0A,R24
(0068) }
008C 9508 RET
_uart_rx_isr:
temp --> R16
008D 922A ST R2,-Y
008E 930A ST R16,-Y
008F 938A ST R24,-Y
0090 939A ST R25,-Y
0091 93EA ST R30,-Y
0092 93FA ST R31,-Y
0093 B62F IN R2,0x3F
0094 922A ST R2,-Y
(0069)
(0070) #pragma interrupt_handler uart_rx_isr:iv_USART_RX
(0071) void uart_rx_isr(void)
(0072) {
(0073) unsigned char temp;
(0074) temp = UDR;
0095 B10C IN R16,0x0C
(0075) if(gU8getchar < 3)
0096 91800060 LDS R24,0x60
0098 3083 CPI R24,3
0099 F448 BCC 0x00A3
(0076) {
(0077) gU8RecBuff[gU8getchar]=temp;
009A E681 LDI R24,0x61
009B E090 LDI R25,0
009C 91E00060 LDS R30,0x60
009E 27FF CLR R31
009F 0FE8 ADD R30,R24
00A0 1FF9 ADC R31,R25
00A1 8300 STD Z+0,R16
(0078) }
00A2 C00A RJMP 0x00AD
(0079) else
(0080) {
(0081) gU8getchar=0;
00A3 2422 CLR R2
00A4 92200060 STS 0x60,R2
(0082) gU8RecBuff[gU8getchar]=temp;
00A6 E681 LDI R24,0x61
00A7 E090 LDI R25,0
00A8 2DE2 MOV R30,R2
00A9 27FF CLR R31
00AA 0FE8 ADD R30,R24
00AB 1FF9 ADC R31,R25
00AC 8300 STD Z+0,R16
(0083) }
(0084) gU8getchar++;
00AD 91800060 LDS R24,0x60
00AF 5F8F SUBI R24,0xFF
00B0 93800060 STS 0x60,R24
(0085) }
00B2 9029 LD R2,Y+
00B3 BE2F OUT 0x3F,R2
00B4 91F9 LD R31,Y+
00B5 91E9 LD R30,Y+
00B6 9199 LD R25,Y+
00B7 9189 LD R24,Y+
00B8 9109 LD R16,Y+
00B9 9029 LD R2,Y+
00BA 9518 RETI
(0086)
(0087) //RS232通信main函数
(0088) void main(void)
(0089) {
(0090) unsigned char i=0;
_main:
i --> R20
00BB 2744 CLR R20
(0091) CLI();
00BC 94F8 BCLR 7
(0092) uart_init();
00BD DFC4 RCALL _uart_init
(0093) SEI();
00BE 9478 BSET 7
(0094) //proteus还不支持汉文显示
(0095) puts_hh("RS232 test demo!");
00BF E908 LDI R16,0x98
00C0 E010 LDI R17,0
00C1 DFAE RCALL _puts_hh
(0096) puts_hh("MAIL:young45@126.com");
00C2 E803 LDI R16,0x83
00C3 E010 LDI R17,0
00C4 DFAB RCALL _puts_hh
(0097) putchar(0x0a); //换行
00C5 E00A LDI R16,0xA
00C6 DF91 RCALL _putchar
(0098) putchar(0x0d); //回车
00C7 E00D LDI R16,0xD
00C8 DF8F RCALL _putchar
(0099) //键盘输入回显到终端
(0100) puts("put int please: ");
00C9 E702 LDI R16,0x72
00CA E010 LDI R17,0
00CB DF94 RCALL _puts
00CC C025 RJMP 0x00F2
(0101) while(1)
(0102) {
(0103) if (0<gU8getchar) //按PC键盘开始测试
00CD 90200060 LDS R2,0x60
00CF 2433 CLR R3
00D0 1432 CP R3,R2
00D1 F500 BCC 0x00F2
(0104) {
(0105) putchar(0x0a); //换行
00D2 E00A LDI R16,0xA
00D3 DF84 RCALL _putchar
(0106) putchar(0x0d); //回车
00D4 E00D LDI R16,0xD
00D5 DF82 RCALL _putchar
(0107) puts("your put is: ");
00D6 E604 LDI R16,0x64
00D7 E010 LDI R17,0
00D8 DF87 RCALL _puts
(0108) for(i=0;i<gU8getchar;i++)
00D9 2744 CLR R20
00DA C009 RJMP 0x00E4
(0109) putchar(gU8RecBuff[i]);
00DB E681 LDI R24,0x61
00DC E090 LDI R25,0
00DD 2FE4 MOV R30,R20
00DE 27FF CLR R31
00DF 0FE8 ADD R30,R24
00E0 1FF9 ADC R31,R25
00E1 8100 LDD R16,Z+0
00E2 DF75 RCALL _putchar
00E3 9543 INC R20
00E4 90200060 LDS R2,0x60
00E6 1542 CP R20,R2
00E7 F398 BCS 0x00DB
(0110) gU8getchar=0;
00E8 2422 CLR R2
00E9 92200060 STS 0x60,R2
(0111) putchar(0x0a); //换行
00EB E00A LDI R16,0xA
00EC DF6B RCALL _putchar
(0112) putchar(0x0d); //回车
00ED E00D LDI R16,0xD
00EE DF69 RCALL _putchar
(0113) puts("put int please: ");
00EF E702 LDI R16,0x72
00F0 E010 LDI R17,0
00F1 DF6E RCALL _puts
00F2 CFDA RJMP 0x00CD
(0114) }
(0115) }
(0116) }
FILE: <library>
00F3 9508 RET
push_gset1:
00F4 935A ST R21,-Y
00F5 934A ST R20,-Y
00F6 9508 RET
pop_gset1:
00F7 E0E1 LDI R30,1
pop:
00F8 9149 LD R20,Y+
00F9 9159 LD R21,Y+
00FA FDE0 SBRC R30,0
00FB 9508 RET
00FC 9169 LD R22,Y+
00FD 9179 LD R23,Y+
00FE FDE1 SBRC R30,1
00FF 9508 RET
0100 90A9 LD R10,Y+
0101 90B9 LD R11,Y+
0102 FDE2 SBRC R30,2
0103 9508 RET
0104 90C9 LD R12,Y+
0105 90D9 LD R13,Y+
0106 FDE3 SBRC R30,3
0107 9508 RET
0108 90E9 LD R14,Y+
0109 90F9 LD R15,Y+
010A 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -