📄 uart.lis
字号:
.module uart.c
.area text(rom, con, rel)
0000 .dbfile D:\NEWWOR~1\motor\uart.c
0000 .dbfunc e baudselect _baudselect fi
0000 ; bauddata -> R20,R21
0000 ; baud -> R16,R17
.even
0000 _baudselect::
0000 0E940000 xcall push_gset1
0004 .dbline -1
0004 .dbline 6
0004 ; #include <iom64v.h>
0004 ; #include <macros.h>
0004 ; #include "head.h"
0004 ;
0004 ; uint baudselect(uint baud)//baud的选择
0004 ; {
0004 .dbline 7
0004 ; uint bauddata=0;
0004 4427 clr R20
0006 5527 clr R21
0008 .dbline 8
0008 ; if(baud==9600) bauddata=0x47; //baud=9600
0008 0038 cpi R16,128
000A E5E2 ldi R30,37
000C 1E07 cpc R17,R30
000E 11F4 brne L2
0010 .dbline 8
0010 47E4 ldi R20,71
0012 0DC0 xjmp L3
0014 L2:
0014 .dbline 9
0014 ; else if(baud==19200) bauddata=0x23; //baud=19200
0014 0030 cpi R16,0
0016 EBE4 ldi R30,75
0018 1E07 cpc R17,R30
001A 19F4 brne L4
001C .dbline 9
001C 43E2 ldi R20,35
001E 50E0 ldi R21,0
0020 06C0 xjmp L5
0022 L4:
0022 .dbline 10
0022 ; else if(baud==57600) bauddata=0x0B; //baud=57600
0022 0030 cpi R16,0
0024 E1EE ldi R30,225
0026 1E07 cpc R17,R30
0028 11F4 brne L6
002A .dbline 10
002A 4BE0 ldi R20,11
002C 50E0 ldi R21,0
002E L6:
002E L5:
002E L3:
002E .dbline 11
002E ; return(bauddata);
002E 8A01 movw R16,R20
0030 .dbline -2
0030 L1:
0030 0E940000 xcall pop_gset1
0034 .dbline 0 ; func end
0034 0895 ret
0036 .dbsym r bauddata 20 i
0036 .dbsym r baud 16 i
0036 .dbend
0036 .dbfunc e Uart1Init _Uart1Init fV
0036 ; baud -> R20,R21
.even
0036 _Uart1Init::
0036 0E940000 xcall push_gset1
003A A801 movw R20,R16
003C .dbline -1
003C .dbline 14
003C ; }
003C ; void Uart1Init(uint baud)
003C ; {
003C .dbline 15
003C ; CLI(); //disable all interrupts
003C F894 cli
003E .dbline 16
003E ; UCSR1B = 0x00; //disable while setting baud rate
003E 2224 clr R2
0040 20929A00 sts 154,R2
0044 .dbline 17
0044 ; UCSR1A=0x00;
0044 20929B00 sts 155,R2
0048 .dbline 18
0048 ; UBRR1H=((baudselect(baud))>>8)&0x00ff;
0048 8A01 movw R16,R20
004A DADF xcall _baudselect
004C C801 movw R24,R16
004E 892F mov R24,R25
0050 9927 clr R25
0052 9070 andi R25,0
0054 80939800 sts 152,R24
0058 .dbline 19
0058 ; UBRR1L=(baudselect(baud))&0x00ff;
0058 8A01 movw R16,R20
005A D2DF xcall _baudselect
005C C801 movw R24,R16
005E 9070 andi R25,0
0060 80939900 sts 153,R24
0064 .dbline 20
0064 ; UCSR1B=(1<<RXCIE1)|(1<<RXEN1)|(1<<TXEN1);//接收器与发送器使能
0064 88E9 ldi R24,152
0066 80939A00 sts 154,R24
006A .dbline 21
006A ; UCSR1C=(3<<UCSZ10);//设计浈格式:8位数据位,1位停止位,无效验位,异步模式
006A 86E0 ldi R24,6
006C 80939D00 sts 157,R24
0070 .dbline 22
0070 ; SEI(); //re-enable interrupts
0070 7894 sei
0072 .dbline -2
0072 L8:
0072 0E940000 xcall pop_gset1
0076 .dbline 0 ; func end
0076 0895 ret
0078 .dbsym r baud 20 i
0078 .dbend
0078 .dbfunc e USART_Transmit_byte _USART_Transmit_byte fV
0078 ; bytedata -> R16
.even
0078 _USART_Transmit_byte::
0078 .dbline -1
0078 .dbline 26
0078 ; }
0078 ;
0078 ; void USART_Transmit_byte(uchar bytedata)
0078 ; {
0078 L10:
0078 .dbline 27
0078 L11:
0078 .dbline 27
0078 ; while(!(UCSR1A&(1<<UDRE1)));
0078 20909B00 lds R2,155
007C 25FE sbrs R2,5
007E FCCF rjmp L10
0080 .dbline 28
0080 ; UDR1=bytedata;
0080 00939C00 sts 156,R16
0084 .dbline -2
0084 L9:
0084 .dbline 0 ; func end
0084 0895 ret
0086 .dbsym r bytedata 16 c
0086 .dbend
0086 .dbfunc e USART_Transmit_arraydata _USART_Transmit_arraydata fV
0086 ; i -> R20
0086 ; arraydata -> R22,R23
0086 ; lenght -> R10
.even
0086 _USART_Transmit_arraydata::
0086 0E940000 xcall push_gset3
008A B901 movw R22,R18
008C A02E mov R10,R16
008E .dbline -1
008E .dbline 34
008E ; }
008E ;
008E ; /***send array_byte data**********/
008E ;
008E ; void USART_Transmit_arraydata(uchar lenght,uchar arraydata[])
008E ; {
008E .dbline 36
008E ; uchar i;
008E ; for(i=0;i<lenght;i++)
008E 4427 clr R20
0090 07C0 xjmp L17
0092 L14:
0092 .dbline 37
0092 E42F mov R30,R20
0094 FF27 clr R31
0096 E60F add R30,R22
0098 F71F adc R31,R23
009A 0081 ldd R16,z+0
009C EDDF xcall _USART_Transmit_byte
009E L15:
009E .dbline 36
009E 4395 inc R20
00A0 L17:
00A0 .dbline 36
00A0 4A15 cp R20,R10
00A2 B8F3 brlo L14
00A4 .dbline -2
00A4 L13:
00A4 0E940000 xcall pop_gset3
00A8 .dbline 0 ; func end
00A8 0895 ret
00AA .dbsym r i 20 c
00AA .dbsym r arraydata 22 pc
00AA .dbsym r lenght 10 c
00AA .dbend
00AA .dbfunc e USART_Flush _USART_Flush fc
00AA ; dummy -> R16
.even
00AA _USART_Flush::
00AA .dbline -1
00AA .dbline 41
00AA ; USART_Transmit_byte(arraydata[i]);
00AA ; }
00AA ;
00AA ; uchar USART_Flush( void )
00AA ; {
00AA 02C0 xjmp L20
00AC L19:
00AC .dbline 43
00AC 00919C00 lds R16,156
00B0 L20:
00B0 .dbline 43
00B0 ; unsigned char dummy;
00B0 ; while ( UCSR1A & (1<<RXC1) ) dummy = UDR1; //读UDR会使RXC清零 ]
00B0 20909B00 lds R2,155
00B4 27FC sbrc R2,7
00B6 FACF rjmp L19
00B8 .dbline 44
00B8 ; return dummy;
00B8 .dbline -2
00B8 L18:
00B8 .dbline 0 ; func end
00B8 0895 ret
00BA .dbsym r dummy 16 c
00BA .dbend
.area vector(rom, abs)
.org 120
0078 0C945D00 jmp _uart1_rx_isr
.area text(rom, con, rel)
00BA .dbfile D:\NEWWOR~1\motor\uart.c
00BA .dbfunc e uart1_rx_isr _uart1_rx_isr fV
.even
00BA _uart1_rx_isr::
00BA .dbline -1
00BA .dbline 51
00BA ; }
00BA ;
00BA ; /*interrupt process***************/
00BA ;
00BA ; #pragma interrupt_handler uart1_rx_isr:31
00BA ; void uart1_rx_isr(void) //uart has received a character in UDR
00BA ; {
00BA .dbline -2
00BA L22:
00BA .dbline 0 ; func end
00BA 1895 reti
00BC .dbend
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -