www.pudn.com > iccavrUCOS_m64.rar > uart.lis


                        .module uart.c 
                        .area text(rom, con, rel) 
                ;        uartNum -> R16 
                        .even 
 0000           _uartInit:: 
 0000           ; #define _UART_C_ 
 0000           ;  
 0000           ; #define BAUD 	38400 
 0000           ; #define CRYSTAL	11059200 
 0000           ; #define BAUD_SETTING	(unsigned int)((unsigned long)CRYSTAL/(16*(unsigned long)BAUD)-1) 
 0000           ; #define BAUD_H	(unsigned char)(BAUD_SETTING>>8) 
 0000           ; #define BAUD_L	(unsigned char)(BAUD_SETTING) 
 0000           ;  
 0000           ; #include "includes.h" 
 0000           ; extern uint8 isrCount; 
 0000           ;  
 0000           ; void uartInit(uint8 uartNum) 
 0000           ; { 
 0000           ; 	if(1==uartNum) 
 0000 0130              cpi R16,1 
 0002 89F4              brne L3 
 0004           ;       { 
 0004           ;                UCSR1B = 0x00; //disable while setting baud rate 
 0004 2224              clr R2 
 0006 20929A00          sts 154,R2 
 000A           ;                UCSR1A = 0x00; 
 000A 20929B00          sts 155,R2 
 000E           ;                UCSR1C = 0x06; 
 000E 86E0              ldi R24,6 
 0010 80939D00          sts 157,R24 
 0014           ;                UBRR1L = BAUD_L; //set baud rate lo 
 0014 81E1              ldi R24,17 
 0016 80939900          sts 153,R24 
 001A           ;                UBRR1H = BAUD_H; //set baud rate hi 
 001A 20929800          sts 152,R2 
 001E           ;                UCSR1B = 0x18; 
 001E 88E1              ldi R24,24 
 0020 80939A00          sts 154,R24 
 0024           ;                ///共有3个中断源, 接受, 发送, 寄存器空, 对应此寄存器的高3位 
 0024           ;       }        
 0024 0CC0              xjmp L4 
 0026           L3: 
 0026           ; 	else 
 0026           ; 	{ 
 0026           ; 		UCSR0B = 0x00; //disable while setting baud rate 
 0026 2224              clr R2 
 0028 2AB8              out 0xa,R2 
 002A           ;               UCSR0A = 0x00; 
 002A 2BB8              out 0xb,R2 
 002C           ;               UCSR0C = 0x06;  //set frame format, 8 bits, 2stop] 
 002C 86E0              ldi R24,6 
 002E 80939500          sts 149,R24 
 0032           ;               UBRR0H = BAUD_H; 
 0032 20929000          sts 144,R2 
 0036           ;               UBRR0L = BAUD_L; 
 0036 81E1              ldi R24,17 
 0038 89B9              out 0x9,R24 
 003A           ;               UCSR0B = 0x18;  //enable receive and transmite 
 003A 88E1              ldi R24,24 
 003C 8AB9              out 0xa,R24 
 003E           ;                
 003E           ;       }        
 003E           L4: 
 003E           L2: 
 003E                   .dbline 0 ; func end 
 003E 0895              ret 
 0040           ;            dat -> R18 
 0040           ;            num -> R16 
                        .even 
 0040           _putChar:: 
 0040           ; } 
 0040           ;  
 0040           ; void putChar(uint8 num, uint8 dat) 
 0040           ; { 
 0040           ; 	ENTER_CRITICAL(); 
 0040 0A93              st -y,r16 
 0042 0FB7              in r16,0x3F 
 0044 F894              cli 
 0046 0F93              push r16 
 0048 0991              ld r16,y+ 
 004A           ;       if(1==num) 
 004A 0130              cpi R16,1 
 004C 61F4              brne L6 
 004E           ;       { 
 004E           ;               UDR1 = dat; 
 004E 20939C00          sts 156,R18 
 0052           L8: 
 0052           L9: 
 0052           ; 		while(!(UCSR1A&BIT(TXC1)));	  //发送寄存器空 
 0052 20909B00          lds R2,155 
 0056 26FE              sbrs R2,6 
 0058 FCCF              rjmp L8 
 005A           ;               UCSR1A|=BIT(TXC1); 
 005A 80919B00          lds R24,155 
 005E 8064              ori R24,64 
 0060 80939B00          sts 155,R24 
 0064           ;       } 
 0064 04C0              xjmp L7 
 0066           L6: 
 0066           ; 	else 
 0066           ; 	{ 
 0066           ; 		UDR0 = dat; 
 0066 2CB9              out 0xc,R18 
 0068           L11: 
 0068           L12: 
 0068           ; 		while(!(UCSR0A&BIT(TXC0))); 
 0068 5E9B              sbis 0xb,6 
 006A FECF              rjmp L11 
 006C           ;               UCSR0A|=BIT(TXC0); 
 006C 5E9A              sbi 0xb,6 
 006E           ;       } 
 006E           L7: 
 006E           ; 	EXIT_CRITICAL(); 
 006E 0A93              st -y,r16 
 0070 0F91              pop r16 
 0072 0FBF              out 0x3F,r16 
 0074 0991              ld r16,y+ 
 0076           L5: 
 0076                   .dbline 0 ; func end 
 0076 0895              ret 
 0078           ;            str -> R10,R11 
 0078           ;            num -> R12 
                        .even 
 0078           _putStr:: 
 0078 0E940000          xcall push_gset4x 
 007C 5901              movw R10,R18 
 007E C02E              mov R12,R16 
 0080           ; }      
 0080           ;  
 0080           ; void putStr(uint8 num, uint8 * str) 
 0080           ; { 
 0080           ;       ENTER_CRITICAL(); 
 0080 0A93              st -y,r16 
 0082 0FB7              in r16,0x3F 
 0084 F894              cli 
 0086 0F93              push r16 
 0088 0991              ld r16,y+ 
 008A 07C0              xjmp L16 
 008C           L15: 
 008C F501              movw R30,R10 
 008E 2081              ldd R18,z+0 
 0090 0C2D              mov R16,R12 
 0092 D6DF              xcall _putChar 
 0094 C501              movw R24,R10 
 0096 0196              adiw R24,1 
 0098 5C01              movw R10,R24 
 009A           L16: 
 009A           ; 	while(*str) 
 009A F501              movw R30,R10 
 009C 2080              ldd R2,z+0 
 009E 2220              tst R2 
 00A0 A9F7              brne L15 
 00A2           ;       { 
 00A2           ;               putChar(num, *str); 
 00A2           ;               str++; 
 00A2           ;       } 
 00A2           ;       EXIT_CRITICAL();         
 00A2 0A93              st -y,r16 
 00A4 0F91              pop r16 
 00A6 0FBF              out 0x3F,r16 
 00A8 0991              ld r16,y+ 
 00AA           L14: 
 00AA 0E940000          xcall pop_gset4x 
 00AE                   .dbline 0 ; func end 
 00AE 0895              ret 
 00B0           ;            num -> R12 
 00B0           ;           port -> R10 
                        .even 
 00B0           _putNum:: 
 00B0 0E940000          xcall push_gset4x 
 00B4 C22E              mov R12,R18 
 00B6 A02E              mov R10,R16 
 00B8           ; }      
 00B8           ;  
 00B8           ; void putNum(uint8 port, uint8 num) 
 00B8           ; { 
 00B8           ;       if((num>>4)<='9') 
 00B8 89E3              ldi R24,57 
 00BA 9C2D              mov R25,R12 
 00BC 9295              swap R25 
 00BE 9F70              andi R25,#0x0F 
 00C0 8917              cp R24,R25 
 00C2 38F0              brlo L19 
 00C4           ;       { 
 00C4           ;               putChar(port, (num>>4)+'0'); 
 00C4 2C2D              mov R18,R12 
 00C6 2295              swap R18 
 00C8 2F70              andi R18,#0x0F 
 00CA 205D              subi R18,208    ; addi 48 
 00CC 0A2D              mov R16,R10 
 00CE B8DF              xcall _putChar 
 00D0           ;       } 
 00D0 06C0              xjmp L20 
 00D2           L19: 
 00D2           ; 	else 
 00D2           ; 	{ 
 00D2           ; 		putChar(port, (num>>4)+'A'); 
 00D2 2C2D              mov R18,R12 
 00D4 2295              swap R18 
 00D6 2F70              andi R18,#0x0F 
 00D8 2F5B              subi R18,191    ; addi 65 
 00DA 0A2D              mov R16,R10 
 00DC B1DF              xcall _putChar 
 00DE           ;       } 
 00DE           L20: 
 00DE           ; 	if((num&0x0f)<='9') 
 00DE 89E3              ldi R24,57 
 00E0 9C2D              mov R25,R12 
 00E2 9F70              andi R25,15 
 00E4 8917              cp R24,R25 
 00E6 30F0              brlo L21 
 00E8           ;       { 
 00E8           ;               putChar(port, (num&0x0f)+'0'); 
 00E8 2C2D              mov R18,R12 
 00EA 2F70              andi R18,15 
 00EC 205D              subi R18,208    ; addi 48 
 00EE 0A2D              mov R16,R10 
 00F0 A7DF              xcall _putChar 
 00F2           ;       } 
 00F2 05C0              xjmp L22 
 00F4           L21: 
 00F4           ; 	else 
 00F4           ; 	{ 
 00F4           ; 		putChar(port, (num&0x0f)+'A'); 
 00F4 2C2D              mov R18,R12 
 00F6 2F70              andi R18,15 
 00F8 2F5B              subi R18,191    ; addi 65 
 00FA 0A2D              mov R16,R10 
 00FC A1DF              xcall _putChar 
 00FE           ;       }                        
 00FE           L22: 
 00FE           L18: 
 00FE 0E940000          xcall pop_gset4x 
 0102                   .dbline 0 ; func end 
 0102 0895              ret 
 0104           ;           temp -> R10 
 0104           ;            num -> R16 
                        .even 
 0104           _getChar:: 
 0104 0E940000          xcall push_gset3x 
 0108           ; }      
 0108           ;  
 0108           ; uint8 getChar(uint8 num)       
 0108           ; { 
 0108           ;       uint8 temp=0; 
 0108 AA24              clr R10 
 010A           ;       ENTER_CRITICAL(); 
 010A 0A93              st -y,r16 
 010C 0FB7              in r16,0x3F 
 010E F894              cli 
 0110 0F93              push r16 
 0112 0991              ld r16,y+ 
 0114           ;       if(1==num) 
 0114 0130              cpi R16,1 
 0116 61F4              brne L24 
 0118           ;       { 
 0118           ;               if(UCSR1A&BIT(RXC1))    //no data 
 0118 20909B00          lds R2,155 
 011C 27FE              sbrs R2,7 
 011E 0CC0              rjmp L25 
 0120           ;               { 
 0120           ;                       temp=UDR1; 
 0120 A0909C00          lds R10,156 
 0124           ;                       UCSR1A|=BIT(RXC1); 
 0124 80919B00          lds R24,155 
 0128 8068              ori R24,128 
 012A 80939B00          sts 155,R24 
 012E           ;               } 
 012E           ;       } 
 012E 04C0              xjmp L25 
 0130           L24: 
 0130           ; 	else 
 0130           ; 	{	 
 0130           ; 		if(UCSR0A&BIT(RXC0))	//no data 
 0130 5F9B              sbis 0xb,7 
 0132 02C0              rjmp L28 
 0134           ;               { 
 0134           ;                       temp=UDR0; 
 0134 ACB0              in R10,0xc 
 0136           ;                       UCSR0A|=BIT(RXC0); 
 0136 5F9A              sbi 0xb,7 
 0138           ;               } 
 0138           L28: 
 0138           ; 	} 
 0138           L25: 
 0138           ; 	EXIT_CRITICAL(); 
 0138 0A93              st -y,r16 
 013A 0F91              pop r16 
 013C 0FBF              out 0x3F,r16 
 013E 0991              ld r16,y+ 
 0140           ;       return(temp); 
 0140 0A2D              mov R16,R10 
 0142           L23: 
 0142 0E940000          xcall pop_gset3x 
 0146                   .dbline 0 ; func end 
 0146 0895              ret 
                        .area vector(rom, abs) 
                        .org 120 
 0078 0C94A400          jmp _uart1_rx_isr 
                        .area text(rom, con, rel) 
                        .even 
 0148           _uart1_rx_isr:: 
 0148 0A92              st -y,R0 
 014A 0FB6              in R0,0x3f 
 014C 0A92              st -y,R0 
 014E           ; }      
 014E           ;  
 014E           ;  
 014E           ; //////////////////////////////////////////////// 
 014E           ; //接受完成中断 
 014E           ; //////////////////////////////////////////////// 
 014E           ; #pragma interrupt_handler uart1_rx_isr:31 
 014E           ; void uart1_rx_isr(void) 
 014E           ; { 
 014E           ;       ENTER_CRITICAL();//uart has received a character in UDR 
 014E 0A93              st -y,r16 
 0150 0FB7              in r16,0x3F 
 0152 F894              cli 
 0154 0F93              push r16 
 0156 0991              ld r16,y+ 
 0158           ;       EXIT_CRITICAL(); 
 0158 0A93              st -y,r16 
 015A 0F91              pop r16 
 015C 0FBF              out 0x3F,r16 
 015E 0991              ld r16,y+ 
 0160           L30: 
 0160 0990              ld R0,y+ 
 0162 0FBE              out 0x3f,R0 
 0164 0990              ld R0,y+ 
 0166                   .dbline 0 ; func end 
 0166 1895              reti 
                        .area vector(rom, abs) 
                        .org 124 
 007C 0C94B400          jmp _uart1_udre_isr 
                        .area text(rom, con, rel) 
                        .even 
 0168           _uart1_udre_isr:: 
 0168 0A92              st -y,R0 
 016A 0FB6              in R0,0x3f 
 016C 0A92              st -y,R0 
 016E           ; } 
 016E           ; /////////////////////////////////////////////// 
 016E           ; //发送寄存器空中断 
 016E           ; /////////////////////////////////////////////// 
 016E           ; #pragma interrupt_handler uart1_udre_isr:32 
 016E           ; void uart1_udre_isr(void) 
 016E           ; { 
 016E           ;       ENTER_CRITICAL();;//character transferred to shift register so UDR is now empty 
 016E 0A93              st -y,r16 
 0170 0FB7              in r16,0x3F 
 0172 F894              cli 
 0174 0F93              push r16 
 0176 0991              ld r16,y+ 
 0178           ;       EXIT_CRITICAL(); 
 0178 0A93              st -y,r16 
 017A 0F91              pop r16 
 017C 0FBF              out 0x3F,r16 
 017E 0991              ld r16,y+ 
 0180           L31: 
 0180 0990              ld R0,y+ 
 0182 0FBE              out 0x3f,R0 
 0184 0990              ld R0,y+ 
 0186                   .dbline 0 ; func end 
 0186 1895              reti 
                        .area vector(rom, abs) 
                        .org 128 
 0080 0C94C400          jmp _uart1_tx_isr 
                        .area text(rom, con, rel) 
                        .even 
 0188           _uart1_tx_isr:: 
 0188 0A92              st -y,R0 
 018A 0FB6              in R0,0x3f 
 018C 0A92              st -y,R0 
 018E           ; } 
 018E           ; ////////////////////////////////////////////// 
 018E           ; //发送完成中断 
 018E           ; ////////////////////////////////////////////// 
 018E           ; #pragma interrupt_handler uart1_tx_isr:33 
 018E           ; void uart1_tx_isr(void) 
 018E           ; { 
 018E           ;       ENTER_CRITICAL();;//character has been transmitted 
 018E 0A93              st -y,r16 
 0190 0FB7              in r16,0x3F 
 0192 F894              cli 
 0194 0F93              push r16 
 0196 0991              ld r16,y+ 
 0198           ;       EXIT_CRITICAL(); 
 0198 0A93              st -y,r16 
 019A 0F91              pop r16 
 019C 0FBF              out 0x3F,r16 
 019E 0991              ld r16,y+ 
 01A0           L32: 
 01A0 0990              ld R0,y+ 
 01A2 0FBE              out 0x3f,R0 
 01A4 0990              ld R0,y+ 
 01A6                   .dbline 0 ; func end 
 01A6 1895              reti