📄 usart_scan.lst
字号:
__start:
__text_start:
0036 E5CF LDI R28,0x5F
0037 E0D4 LDI R29,4
0038 BFCD OUT 0x3D,R28
0039 BFDE OUT 0x3E,R29
003A 51C0 SUBI R28,0x10
003B 40D0 SBCI R29,0
003C EA0A LDI R16,0xAA
003D 8308 STD Y+0,R16
003E 2400 CLR R0
003F EAE5 LDI R30,0xA5
0040 E0F0 LDI R31,0
0041 E010 LDI R17,0
0042 3AE5 CPI R30,0xA5
0043 07F1 CPC R31,R17
0044 F011 BEQ 0x0047
0045 9201 ST R0,Z+
0046 CFFB RJMP 0x0042
0047 8300 STD Z+0,R16
0048 E2E6 LDI R30,0x26
0049 E0F0 LDI R31,0
004A E6A0 LDI R26,0x60
004B E0B0 LDI R27,0
004C E010 LDI R17,0
004D 36EB CPI R30,0x6B
004E 07F1 CPC R31,R17
004F F021 BEQ 0x0054
0050 95C8 LPM
0051 9631 ADIW R30,1
0052 920D ST R0,X+
0053 CFF9 RJMP 0x004D
0054 D034 RCALL _main
_exit:
0055 CFFF RJMP _exit
FILE: F:\Learn\AVR\Pro_Mega8\USART\USART_Scan\usart_scan.c
(0001) /******************************************/
(0002) //文件名:usart_scan.c
(0003) //功能: 扫描式串口通信的应用
(0004) //作者: young
(0005) //时间: 2006.11.16
(0006) //目标MCU:ATmega8
(0007) //晶振: 8MHZ
(0008) /******************************************/
(0009) //通信波特率为9600(8位数据,无校验,1位停止位,无数据流控制)。
(0010)
(0011) #include <iom8v.h>
(0012) #define fosc 8000000 //晶振8MHZ
(0013) #define baud 9600 //波特率
(0014)
(0015) //字符输出函数
(0016) void putchar(unsigned char c)
(0017) {
(0018) //等待写入UDR的字符被送到发送移位寄存器
(0019) while (!(UCSRA&(1<<UDRE)));
_putchar:
c --> R16
0056 9B5D SBIS 0x0B,5
0057 CFFE RJMP _putchar
(0020) UDR=c;
0058 B90C OUT 0x0C,R16
(0021) }
0059 9508 RET
(0022)
(0023) //字符输入函数
(0024) unsigned char getchar(void)
(0025) {
(0026) //等待接收字符
(0027) while(!(UCSRA&(1<<RXC)));
_getchar:
005A 9B5F SBIS 0x0B,7
005B CFFE RJMP _getchar
(0028) return UDR;
005C B10C IN R16,0x0C
005D 9508 RET
_puts:
s --> R20
005E D050 RCALL push_gset1
005F 01A8 MOVW R20,R16
(0029) }
(0030)
(0031) //字符串输出函数
(0032) int puts(char *s)
(0033) {
0060 C005 RJMP 0x0066
(0034) while (*s)
(0035) {
(0036) putchar(*s);
0061 01FA MOVW R30,R20
0062 8100 LDD R16,Z+0
0063 DFF2 RCALL _putchar
(0037) s++;
0064 5F4F SUBI R20,0xFF
0065 4F5F SBCI R21,0xFF
0066 01FA MOVW R30,R20
0067 8020 LDD R2,Z+0
0068 2022 TST R2
0069 F7B9 BNE 0x0061
(0038) }
(0039) return 1;
006A E001 LDI R16,1
006B E010 LDI R17,0
006C D045 RCALL pop_gset1
006D 9508 RET
_puts_hh:
s --> R20
006E D040 RCALL push_gset1
006F 01A8 MOVW R20,R16
(0040) }
(0041)
(0042) //含回车换行的字符串输出函数
(0043) void puts_hh(char *s)
(0044) {
0070 C005 RJMP 0x0076
(0045) while (*s)
(0046) {
(0047) putchar(*s);
0071 01FA MOVW R30,R20
0072 8100 LDD R16,Z+0
0073 DFE2 RCALL _putchar
(0048) s++;
0074 5F4F SUBI R20,0xFF
0075 4F5F SBCI R21,0xFF
0076 01FA MOVW R30,R20
0077 8020 LDD R2,Z+0
0078 2022 TST R2
0079 F7B9 BNE 0x0071
(0049) }
(0050) putchar(0x0a);//换行
007A E00A LDI R16,0xA
007B DFDA RCALL _putchar
(0051) putchar(0x0d);//回车
007C E00D LDI R16,0xD
007D DFD8 RCALL _putchar
(0052) }
007E D033 RCALL pop_gset1
007F 9508 RET
(0053)
(0054) //UART初始化
(0055) void uart_init(void)
(0056) {
(0057) UCSRB=(1<<RXEN)|(1<<TXEN); //允许发送和接收
_uart_init:
0080 E188 LDI R24,0x18
0081 B98A OUT 0x0A,R24
(0058) UBRRL=(fosc/16/baud-1)%256;
0082 E383 LDI R24,0x33
0083 B989 OUT 0x09,R24
(0059) UBRRH=(fosc/16/baud-1)/256;
0084 2422 CLR R2
0085 BC20 OUT 0x20,R2
(0060) UCSRC=(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);//8位数据+1位停止位
0086 E886 LDI R24,0x86
0087 BD80 OUT 0x20,R24
(0061) }
0088 9508 RET
(0062)
(0063)
(0064) //RS232通信main函数
(0065) void main(void)
(0066) {
(0067) unsigned char i=0;
_main:
i --> R20
0089 2744 CLR R20
(0068) uart_init();
008A DFF5 RCALL _uart_init
(0069)
(0070) //proteus还不支持汉文显示
(0071) puts_hh("RS232 test demo!");
008B E904 LDI R16,0x94
008C E010 LDI R17,0
008D DFE0 RCALL _puts_hh
(0072) puts_hh("MAIL:young45@126.com");
008E E70F LDI R16,0x7F
008F E010 LDI R17,0
0090 DFDD RCALL _puts_hh
(0073) putchar(0x0a); //换行
0091 E00A LDI R16,0xA
0092 DFC3 RCALL _putchar
(0074) putchar(0x0d); //回车
0093 E00D LDI R16,0xD
0094 DFC1 RCALL _putchar
(0075)
(0076) //键盘输入回显到终端
(0077) puts("put int please: ");
0095 E60E LDI R16,0x6E
0096 E010 LDI R17,0
0097 DFC6 RCALL _puts
0098 C014 RJMP 0x00AD
(0078)
(0079) while(1)
(0080) {
(0081) i=getchar();
0099 DFC0 RCALL _getchar
009A 2F40 MOV R20,R16
(0082) if (i!=0) //按PC键盘开始测试
009B 2300 TST R16
009C F081 BEQ 0x00AD
(0083) {
(0084) putchar(0x0a); //换行
009D E00A LDI R16,0xA
009E DFB7 RCALL _putchar
(0085) putchar(0x0d); //回车
009F E00D LDI R16,0xD
00A0 DFB5 RCALL _putchar
(0086) puts("your put is: ");
00A1 E600 LDI R16,0x60
00A2 E010 LDI R17,0
00A3 DFBA RCALL _puts
(0087) putchar(i);
00A4 2F04 MOV R16,R20
00A5 DFB0 RCALL _putchar
(0088) putchar(0x0a); //换行
00A6 E00A LDI R16,0xA
00A7 DFAE RCALL _putchar
(0089) putchar(0x0d); //回车
00A8 E00D LDI R16,0xD
00A9 DFAC RCALL _putchar
(0090) puts("put int please: ");
00AA E60E LDI R16,0x6E
00AB E010 LDI R17,0
00AC DFB1 RCALL _puts
00AD CFEB RJMP 0x0099
(0091) }
(0092) }
(0093) }
FILE: <library>
00AE 9508 RET
push_gset1:
00AF 935A ST R21,-Y
00B0 934A ST R20,-Y
00B1 9508 RET
pop_gset1:
00B2 E0E1 LDI R30,1
pop:
00B3 9149 LD R20,Y+
00B4 9159 LD R21,Y+
00B5 FDE0 SBRC R30,0
00B6 9508 RET
00B7 9169 LD R22,Y+
00B8 9179 LD R23,Y+
00B9 FDE1 SBRC R30,1
00BA 9508 RET
00BB 90A9 LD R10,Y+
00BC 90B9 LD R11,Y+
00BD FDE2 SBRC R30,2
00BE 9508 RET
00BF 90C9 LD R12,Y+
00C0 90D9 LD R13,Y+
00C1 FDE3 SBRC R30,3
00C2 9508 RET
00C3 90E9 LD R14,Y+
00C4 90F9 LD R15,Y+
00C5 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -