📄 send_485.lis
字号:
.module Send_485.c
.area text(rom, con, rel)
0000 .dbfile F:\Work\Data\程序\修订版~1.1\Send_485.c
0000 .dbfunc e RS485_init _RS485_init fV
.even
0000 _RS485_init::
0000 .dbline -1
0000 .dbline 15
0000 ; /*****************************************************
0000 ; * File name : Send_485.C
0000 ; * Description : Header file of main_H.H
0000 ; * Platform : ICCAVR
0000 ; * Author : xiao xue
0000 ; * Email : ay1509@yahoo.com
0000 ; * Date : 2008-03-13
0000 ; * Description :485 Communications
0000 ; /********************头文件*************************/
0000 ; #include"main_H.h"
0000 ; #define fosc 8000000
0000 ; #define baud 9600
0000 ; /***************************485初始化***************************/
0000 ; void RS485_init(void)
0000 ; {
0000 .dbline 16
0000 ; UCSRB=(1<<RXCIE)|(1<<RXEN)|(1<<TXEN); //接收完成中断使能
0000 88E9 ldi R24,152
0002 8AB9 out 0xa,R24
0004 .dbline 18
0004 ; //充许发送、充许接收
0004 ; UBRRL=(fosc/16/(baud+1))%256; //波特率为9600
0004 84E3 ldi R24,52
0006 89B9 out 0x9,R24
0008 .dbline 19
0008 ; UBRRH=(fosc/16/(baud+1))/256;
0008 2224 clr R2
000A 20BC out 0x20,R2
000C .dbline 20
000C ; UCSRC=(1<<URSEL)|(1<<UCSZ0)|(1<<UCSZ1);
000C 86E8 ldi R24,134
000E 80BD out 0x20,R24
0010 .dbline 21
0010 ; PORTD&=~0x04; //允许接收数据
0010 9298 cbi 0x12,2
0012 .dbline 22
0012 ; DDRD|=0x04; //数据方向
0012 8A9A sbi 0x11,2
0014 .dbline -2
0014 L1:
0014 .dbline 0 ; func end
0014 0895 ret
0016 .dbend
0016 .dbfunc e RS485_out_byte _RS485_out_byte fV
0016 ; data -> R16
.even
0016 _RS485_out_byte::
0016 .dbline -1
0016 .dbline 26
0016 ; }
0016 ; /******************485发送一个字节子程序************************/
0016 ; void RS485_out_byte(uchar data )
0016 ; {
0016 L3:
0016 .dbline 28
0016 ;
0016 ; while(!(UCSRA & (1<<UDRE)) ); //等待数据寄存器不为空
0016 L4:
0016 .dbline 28
0016 5D9B sbis 0xb,5
0018 FECF rjmp L3
001A X0:
001A .dbline 29
001A ; UDR=data;
001A 0CB9 out 0xc,R16
001C L6:
001C .dbline 30
001C ; while(!(UCSRA & (BIT(TXC)))); //等待USART发送完成
001C L7:
001C .dbline 30
001C 5E9B sbis 0xb,6
001E FECF rjmp L6
0020 X1:
0020 .dbline 31
0020 ; UCSRA|=BIT(TXC);
0020 5E9A sbi 0xb,6
0022 .dbline -2
0022 L2:
0022 .dbline 0 ; func end
0022 0895 ret
0024 .dbsym r data 16 c
0024 .dbend
0024 .dbfunc e RS485_out_6byte _RS485_out_6byte fV
0024 ; i -> R20,R21
0024 ; datas -> R10,R11
.even
0024 _RS485_out_6byte::
0024 00D0 rcall push_xgset300C
0026 5801 movw R10,R16
0028 .dbline -1
0028 .dbline 37
0028 ; }
0028 ;
0028 ; /**************************一次发送6个字节*********************/
0028 ;
0028 ; void RS485_out_6byte(uchar *datas )
0028 ; {
0028 .dbline 38
0028 ; uint i=0;
0028 4427 clr R20
002A 5527 clr R21
002C .dbline 39
002C ; CLI(); //关中断
002C F894 cli
002E .dbline 40
002E ; PORTD|=0x04; //允许发送
002E 929A sbi 0x12,2
0030 07C0 rjmp L11
0032 L10:
0032 .dbline 41
0032 ; while(i<6 ){
0032 .dbline 42
0032 ; RS485_out_byte(*(datas+i)); //发送1个字节
0032 FA01 movw R30,R20
0034 EA0D add R30,R10
0036 FB1D adc R31,R11
0038 0081 ldd R16,z+0
003A EDDF rcall _RS485_out_byte
003C .dbline 43
003C ; i++;
003C 4F5F subi R20,255 ; offset = 1
003E 5F4F sbci R21,255
0040 .dbline 44
0040 ; }
0040 L11:
0040 .dbline 41
0040 4630 cpi R20,6
0042 E0E0 ldi R30,0
0044 5E07 cpc R21,R30
0046 A8F3 brlo L10
0048 X2:
0048 .dbline 45
0048 ; delay_nms(5); //延时
0048 05E0 ldi R16,5
004A 10E0 ldi R17,0
004C 00D0 rcall _delay_nms
004E .dbline 46
004E ; PORTD&=~0x04; //允许接收
004E 9298 cbi 0x12,2
0050 .dbline 47
0050 ; SEI();
0050 7894 sei
0052 .dbline -2
0052 L9:
0052 .dbline 0 ; func end
0052 00C0 rjmp pop_xgset300C
0054 .dbsym r i 20 i
0054 .dbsym r datas 10 pc
0054 .dbend
0054 .dbfunc e Send_485 _Send_485 fV
.even
0054 _Send_485::
0054 .dbline -1
0054 .dbline 51
0054 ; }
0054 ; /**************************485发送数据函数*****************/
0054 ; void Send_485(void)
0054 ; {
0054 .dbline 52
0054 ; RS485_out_6byte(moto1); //给节点1发送数据
0054 00E0 ldi R16,<_moto1
0056 10E0 ldi R17,>_moto1
0058 E5DF rcall _RS485_out_6byte
005A .dbline 53
005A ; RS485_out_6byte(moto2); //给节点2发送数据
005A 00E0 ldi R16,<_moto2
005C 10E0 ldi R17,>_moto2
005E E2DF rcall _RS485_out_6byte
0060 .dbline 54
0060 ; RS485_out_6byte(moto3);
0060 00E0 ldi R16,<_moto3
0062 10E0 ldi R17,>_moto3
0064 DFDF rcall _RS485_out_6byte
0066 .dbline 55
0066 ; RS485_out_6byte(moto4);
0066 00E0 ldi R16,<_moto4
0068 10E0 ldi R17,>_moto4
006A DCDF rcall _RS485_out_6byte
006C .dbline -2
006C L13:
006C .dbline 0 ; func end
006C 0895 ret
006E .dbend
.area vector(rom, abs)
.org 22
0016 37C0 rjmp _RS485_ISR
.area text(rom, con, rel)
006E .dbfile F:\Work\Data\程序\修订版~1.1\Send_485.c
006E .dbfunc e RS485_ISR _RS485_ISR fV
.even
006E _RS485_ISR::
006E 2A92 st -y,R2
0070 8A93 st -y,R24
0072 9A93 st -y,R25
0074 EA93 st -y,R30
0076 FA93 st -y,R31
0078 2FB6 in R2,0x3f
007A 2A92 st -y,R2
007C .dbline -1
007C .dbline 60
007C ; }
007C ; /***************************中断接收服务子程序*******************/
007C ; #pragma interrupt_handler RS485_ISR:iv_USART_RX
007C ; void RS485_ISR(void)
007C ; {
007C .dbline 61
007C ; CLI(); //关中断
007C F894 cli
007E .dbline 62
007E ; PORTD&=~0x04; //允许接收
007E 9298 cbi 0x12,2
0080 .dbline 63
0080 ; getchar[RS_i]=UDR; //存储数据寄存器的值
0080 80E0 ldi R24,<_getchar
0082 90E0 ldi R25,>_getchar
0084 E0910000 lds R30,_RS_i
0088 FF27 clr R31
008A E80F add R30,R24
008C F91F adc R31,R25
008E 2CB0 in R2,0xc
0090 2082 std z+0,R2
0092 .dbline 64
0092 ; RS_i++; //预备存储下一个
0092 80910000 lds R24,_RS_i
0096 8F5F subi R24,255 ; addi 1
0098 80930000 sts _RS_i,R24
009C .dbline 65
009C ; if(RS_i==6) //接收6个后清零
009C 8630 cpi R24,6
009E 31F4 brne L15
00A0 X3:
00A0 .dbline 66
00A0 ; {RS_i=0;flag=3;}
00A0 .dbline 66
00A0 2224 clr R2
00A2 20920000 sts _RS_i,R2
00A6 .dbline 66
00A6 83E0 ldi R24,3
00A8 80930000 sts _flag,R24
00AC .dbline 66
00AC L15:
00AC .dbline 67
00AC ; SEI(); //开中断
00AC 7894 sei
00AE .dbline -2
00AE L14:
00AE .dbline 0 ; func end
00AE 2990 ld R2,y+
00B0 2FBE out 0x3f,R2
00B2 F991 ld R31,y+
00B4 E991 ld R30,y+
00B6 9991 ld R25,y+
00B8 8991 ld R24,y+
00BA 2990 ld R2,y+
00BC 1895 reti
00BE .dbend
00BE .dbfunc e data_decide _data_decide fV
00BE ; RS_j -> R16
.even
00BE _data_decide::
00BE .dbline -1
00BE .dbline 72
00BE ; }
00BE ;
00BE ; /**********************接收数组判断存储子程序************************/
00BE ; void data_decide(void)
00BE ; {
00BE .dbline 73
00BE ; uchar RS_j=0;
00BE 0027 clr R16
00C0 .dbline 74
00C0 ; if(getchar[0]==0xaa){
00C0 80910000 lds R24,_getchar
00C4 8A3A cpi R24,170
00C6 09F0 breq X15
00C8 69C0 rjmp L18
00CA X15:
00CA X4:
00CA .dbline 74
00CA .dbline 75
00CA ; switch(getchar[1]){
00CA 20910100 lds R18,_getchar+1
00CE 3327 clr R19
00D0 2D32 cpi R18,45
00D2 E0E0 ldi R30,0
00D4 3E07 cpc R19,R30
00D6 09F4 brne X16
00D8 3BC0 rjmp L30
00DA X16:
00DA X5:
00DA 8DE2 ldi R24,45
00DC 90E0 ldi R25,0
00DE 8217 cp R24,R18
00E0 9307 cpc R25,R19
00E2 2CF0 brlt L44
00E4 X6:
00E4 L43:
00E4 2E31 cpi R18,30
00E6 E0E0 ldi R30,0
00E8 3E07 cpc R19,R30
00EA 01F1 breq L26
00EC X7:
00EC 57C0 rjmp L20
00EE L44:
00EE 2C33 cpi R18,60
00F0 E0E0 ldi R30,0
00F2 3E07 cpc R19,R30
00F4 09F4 brne X17
00F6 3EC0 rjmp L35
00F8 X17:
00F8 X8:
00F8 2C33 cpi R18,60
00FA E0E0 ldi R30,0
00FC 3E07 cpc R19,R30
00FE 0CF4 brge X18
0100 4DC0 rjmp L20
0102 X18:
0102 X9:
0102 L45:
0102 2B34 cpi R18,75
0104 E0E0 ldi R30,0
0106 3E07 cpc R19,R30
0108 09F4 brne X19
010A 46C0 rjmp L40
010C X19:
010C X10:
010C 47C0 rjmp L20
010E L25:
010E .dbline 77
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -