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

📄 usart_icc.lst

📁 M16控制,从键盘输入字符,当输入字符达到10个的时候,终端和LCD都显示所接收到的字符
💻 LST
📖 第 1 页 / 共 3 页
字号:
(0007) /*发送采用查询方式,中断采用接收方式*/
(0008) /*当收到的字符达到所定义的长度时,则在LCD上显示收到的字符*/
(0009) /***************************/
(0010) #define BufSize 1
(0011) unsigned char RsBuf[BufSize];  //定义接收缓冲器
(0012) int RsBytes = 0;
(0013) unsigned char flag = 0;
(0014) void main(void)
(0015) {
(0016)     unsigned char *msg = "Usart Test!\n";    
     196 E849      LDI	R20,0x89
     197 E050      LDI	R21,0
(0017)     SREG |= (1<<7);  //使能全局中断
     198 9478      BSET	7
(0018)     UsartInit();
     199 940E 020A CALL	_UsartInit
(0019)     Init_LCD();
     19B 940E 0119 CALL	_Init_LCD
(0020)     SendNbyte(msg,12);
     19D E02C      LDI	R18,0xC
     19E 018A      MOVW	R16,R20
     19F 940E 0223 CALL	_SendNbyte
(0021)     PutStr("Test Ok\n");   
     1A1 E800      LDI	R16,0x80
     1A2 E010      LDI	R17,0
     1A3 940E 0234 CALL	_PutStr
(0022)     LCD_DisplayString(1,1,"Usart Test!");
     1A5 E784      LDI	R24,0x74
     1A6 E090      LDI	R25,0
     1A7 8399      STD	Y+1,R25
     1A8 8388      STD	Y+0,R24
     1A9 E021      LDI	R18,1
     1AA E001      LDI	R16,1
     1AB 940E 0149 CALL	_LCD_DisplayString
(0023)     delay_nms(2000);
     1AD ED00      LDI	R16,0xD0
     1AE E017      LDI	R17,7
     1AF 940E 0083 CALL	_delay_nms
(0024)     LCD_Clear();
     1B1 940E 0127 CALL	_LCD_Clear
(0025)     LCD_DisplayString(1,1,"Recive is :");    
     1B3 E688      LDI	R24,0x68
     1B4 E090      LDI	R25,0
     1B5 8399      STD	Y+1,R25
     1B6 8388      STD	Y+0,R24
     1B7 E021      LDI	R18,1
     1B8 E001      LDI	R16,1
     1B9 940E 0149 CALL	_LCD_DisplayString
     1BB C016      RJMP	0x01D2
(0026)     while(1)
(0027)     {
(0028)         if(flag)
     1BC 9020 0067 LDS	R2,flag
     1BE 2022      TST	R2
     1BF F091      BEQ	0x01D2
(0029)         {
(0030)            PutStr(RsBuf);
     1C0 E906      LDI	R16,0x96
     1C1 E010      LDI	R17,0
     1C2 940E 0234 CALL	_PutStr
(0031)            LCD_DisplayString(2,1,RsBuf);           
     1C4 E986      LDI	R24,0x96
     1C5 E090      LDI	R25,0
     1C6 8399      STD	Y+1,R25
     1C7 8388      STD	Y+0,R24
     1C8 E021      LDI	R18,1
     1C9 E002      LDI	R16,2
     1CA 940E 0149 CALL	_LCD_DisplayString
(0032)            PutChar('\n');
     1CC E00A      LDI	R16,0xA
     1CD 940E 0215 CALL	_PutChar
(0033)            flag = 0;
     1CF 2422      CLR	R2
     1D0 9220 0067 STS	flag,R2
     1D2 CFE9      RJMP	0x01BC
     1D3 9622      ADIW	R28,2
     1D4 9508      RET
_uart0_rx_isr:
     1D5 922A      ST	R2,-Y
     1D6 923A      ST	R3,-Y
     1D7 938A      ST	R24,-Y
     1D8 939A      ST	R25,-Y
     1D9 93EA      ST	R30,-Y
     1DA 93FA      ST	R31,-Y
     1DB B62F      IN	R2,0x3F
     1DC 922A      ST	R2,-Y
(0034)         }
(0035)     }
(0036) }
(0037) 
(0038) //接收中断子程序  
(0039) #pragma interrupt_handler uart0_rx_isr:iv_USART0_RXC
(0040) void uart0_rx_isr(void)
(0041) //#pragma vector = USART_RXC_vect
(0042)     //__interrupt void RXC_isr( void )
(0043) {
(0044)     RsBuf[RsBytes] = UDR;
     1DD E986      LDI	R24,0x96
     1DE E090      LDI	R25,0
     1DF 91E0 0065 LDS	R30,RsBytes
     1E1 91F0 0066 LDS	R31,RsBytes+1
     1E3 0FE8      ADD	R30,R24
     1E4 1FF9      ADC	R31,R25
     1E5 B02C      IN	R2,0x0C
     1E6 8220      STD	Z+0,R2
(0045)     RsBytes ++;
     1E7 9180 0065 LDS	R24,RsBytes
     1E9 9190 0066 LDS	R25,RsBytes+1
     1EB 9601      ADIW	R24,1
     1EC 9390 0066 STS	RsBytes+1,R25
     1EE 9380 0065 STS	RsBytes,R24
(0046)     //PutChar(RsBuf[RsBytes]); //回显
(0047)     if(RsBytes > BufSize)
     1F0 E081      LDI	R24,1
     1F1 E090      LDI	R25,0
     1F2 9020 0065 LDS	R2,RsBytes
     1F4 9030 0066 LDS	R3,RsBytes+1
     1F6 1582      CP	R24,R2
     1F7 0593      CPC	R25,R3
     1F8 F444      BGE	0x0201
(0048)     {   
(0049)         flag = 1;
     1F9 9380 0067 STS	flag,R24
(0050)         RsBytes = 0;
     1FB 2422      CLR	R2
     1FC 2433      CLR	R3
     1FD 9230 0066 STS	RsBytes+1,R3
     1FF 9220 0065 STS	RsBytes,R2
(0051)     }
     201 9029      LD	R2,Y+
     202 BE2F      OUT	0x3F,R2
     203 91F9      LD	R31,Y+
     204 91E9      LD	R30,Y+
     205 9199      LD	R25,Y+
     206 9189      LD	R24,Y+
     207 9039      LD	R3,Y+
     208 9029      LD	R2,Y+
     209 9518      RETI
FILE: E:\新建文件夹\usart_icc\cfile\usart.c
(0001) #define USART_C
(0002) #include "includes.h"
(0003) void UsartInit(void)
(0004) {
(0005)     // 晶振频率 : 4.0MHz
(0006)     // 通信参数: 8 Data, 1 Stop, No Parity 
(0007)     // 波特率:
(0008)     // UBRRL= 0x0C    19200;
(0009)     // UBRRL= 0x19    9600;
(0010)     // UBRRL= 0x33    4800;
(0011)     // UBRRL= 0x67    2400	
(0012)     UCSRB |= (1<<RXEN)|(1<<TXEN)|(1<<RXCIE);  //允许发送和接收,接收中断使能
_UsartInit:
     20A B18A      IN	R24,0x0A
     20B 6988      ORI	R24,0x98
     20C B98A      OUT	0x0A,R24
(0013)     UCSRC |= (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0); //8位数据位+1位停止位
     20D B580      IN	R24,0x20
     20E 6886      ORI	R24,0x86
     20F BD80      OUT	0x20,R24
(0014)     UBRRH = 0x00; 
     210 2422      CLR	R2
     211 BC20      OUT	0x20,R2
(0015)     UBRRL = 0x19;  
     212 E189      LDI	R24,0x19
     213 B989      OUT	0x09,R24
     214 9508      RET
_PutChar:
  c                    --> R20
     215 934A      ST	R20,-Y
     216 2F40      MOV	R20,R16
(0016)     //sei();
(0017) }
(0018) 
(0019) int PutChar(char c)
(0020) {
(0021)     if(c == '\n')
     217 304A      CPI	R20,0xA
     218 F411      BNE	0x021B
(0022)     {
(0023)         PutChar('\r');
     219 E00D      LDI	R16,0xD
     21A DFFA      RCALL	_PutChar
(0024)     }
(0025)     UDR = c;
     21B B94C      OUT	0x0C,R20
(0026)     while(!(UCSRA &(1<<UDRE)));
     21C 9B5D      SBIS	0x0B,5
     21D CFFE      RJMP	0x021C
(0027)     UCSRA |= (1<<UDRE);
     21E 9A5D      SBI	0x0B,5
(0028)     return 0;
     21F 2700      CLR	R16
     220 2711      CLR	R17
     221 9149      LD	R20,Y+
     222 9508      RET
_SendNbyte:
  w                    --> R10
  L                    --> R12
  p                    --> R14
     223 940E 024F CALL	push_xgset00FC
     225 2EC2      MOV	R12,R18
     226 0178      MOVW	R14,R16
(0029) }
(0030) 
(0031) 
(0032) void SendNbyte(unsigned char *p,unsigned char L)
(0033) {
(0034)     unsigned char w;
(0035)     for(w=0;w<L;w++)
     227 24AA      CLR	R10
     228 C007      RJMP	0x0230
(0036)     {
(0037)        // UDR = *(p+w);
(0038)        // while(!(UCSRA &(1<<UDRE)));
(0039)         //UCSRA |= (1<<UDRE);
(0040)         PutChar(*(p+w));
     229 2DEA      MOV	R30,R10
     22A 27FF      CLR	R31
     22B 0DEE      ADD	R30,R14
     22C 1DFF      ADC	R31,R15
     22D 8100      LDD	R16,Z+0
     22E DFE6      RCALL	_PutChar
     22F 94A3      INC	R10
     230 14AC      CP	R10,R12
     231 F3B8      BCS	0x0229
     232 940C 0244 JMP	pop_xgset00FC
_PutStr:
  Str                  --> R20
     234 934A      ST	R20,-Y
     235 935A      ST	R21,-Y
     236 01A8      MOVW	R20,R16
(0041)     }
(0042)     
(0043) }
(0044) 
(0045) void PutStr(unsigned char *Str)
(0046) {
     237 C005      RJMP	0x023D
(0047)     while(*Str != '\0')
(0048)     {
(0049)         PutChar(*Str);
     238 01FA      MOVW	R30,R20
     239 8100      LDD	R16,Z+0
     23A DFDA      RCALL	_PutChar
(0050)         Str++;
FILE: <library>
     23B 5F4F      SUBI	R20,0xFF
     23C 4F5F      SBCI	R21,0xFF
     23D 01FA      MOVW	R30,R20
     23E 8020      LDD	R2,Z+0
     23F 2022      TST	R2
     240 F7B9      BNE	0x0238
     241 9159      LD	R21,Y+
     242 9149      LD	R20,Y+
     243 9508      RET
pop_xgset00FC:
     244 90A9      LD	R10,Y+
     245 90B9      LD	R11,Y+
     246 90C9      LD	R12,Y+
     247 90D9      LD	R13,Y+
     248 90E9      LD	R14,Y+
     249 90F9      LD	R15,Y+
     24A 9508      RET
push_xgsetF0FC:
     24B 937A      ST	R23,-Y
     24C 936A      ST	R22,-Y
push_xgset30FC:
     24D 935A      ST	R21,-Y
     24E 934A      ST	R20,-Y
push_xgset00FC:
     24F 92FA      ST	R15,-Y
     250 92EA      ST	R14,-Y
push_xgset003C:
     251 92DA      ST	R13,-Y
     252 92CA      ST	R12,-Y
     253 92BA      ST	R11,-Y
     254 92AA      ST	R10,-Y
     255 9508      RET
push_xgset300C:
     256 935A      ST	R21,-Y
     257 934A      ST	R20,-Y
     258 92BA      ST	R11,-Y
     259 92AA      ST	R10,-Y
     25A 9508      RET
pop_xgset300C:
     25B 90A9      LD	R10,Y+
     25C 90B9      LD	R11,Y+
     25D 9149      LD	R20,Y+
     25E 9159      LD	R21,Y+
     25F 9508      RET
push_xgsetF00C:
     260 937A      ST	R23,-Y
     261 936A      ST	R22,-Y
     262 935A      ST	R21,-Y
     263 934A      ST	R20,-Y
     264 92BA      ST	R11,-Y
     265 92AA      ST	R10,-Y
     266 9508      RET
pop_xgsetF00C:
     267 90A9      LD	R10,Y+
     268 90B9      LD	R11,Y+
     269 9149      LD	R20,Y+
     26A 9159      LD	R21,Y+
     26B 9169      LD	R22,Y+
     26C 9179      LD	R23,Y+
     26D 9508      RET
push_xgset303C:
     26E 935A      ST	R21,-Y
     26F 934A      ST	R20,-Y
     270 92DA      ST	R13,-Y
     271 92CA      ST	R12,-Y
     272 92BA      ST	R11,-Y
     273 92AA      ST	R10,-Y
     274 9508      RET
pop_xgset303C:
     275 90A9      LD	R10,Y+
     276 90B9      LD	R11,Y+
     277 90C9      LD	R12,Y+
     278 90D9      LD	R13,Y+
     279 9149      LD	R20,Y+
     27A 9159      LD	R21,Y+
     27B 9508      RET

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -