📄 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
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -