⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 usart_int.lst

📁 protues_atmeg8学习之:uart篇源代码
💻 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 + -