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

📄 uart.lis

📁 ucos移植到m64
💻 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

⌨️ 快捷键说明

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