📄 main.lis
字号:
.module main.c
.area text(rom, con, rel)
0000 .dbfile E:\ICCAVR\project\AVRMEG~3\icc\011-UART-485\main.c
0000 .dbfunc e delay_ms _delay_ms fV
0000 ; a -> R20
0000 ; b -> R22
0000 ; i -> R16
.even
0000 _delay_ms::
0000 0E940000 xcall push_gset2
0004 .dbline -1
0004 .dbline 25
0004 ; /*
0004 ; 实验十一:
0004 ;
0004 ; RS485通信实险。
0004 ; 1、UART0和UART1两个串口综合实验,串口以查询方式接收数据和发送数据。
0004 ; UART0:任务A,每秒向串口0发送一个字节变化的数据,不接收数据。
0004 ; UART1:任务B,从串口1接收数据,将收到的数据原样返回并显示在PB口。
0004 ; 两个串口这间各知独立运行。
0004 ; 可以将两路485信号并接到一起,这样就要以相互通信了。
0004 ; 2、内部1 M晶振,程序采用单任务方式,软件延时。
0004 ; 3、进行此实验请SW1两组跳针插上到485一边,插上LED短路块。
0004 ; 4、实验中使用了两路RS485总线,通过此实验让大家了解RS485网络的基本应用。
0004 ; 此实验原理及程序思路和上一个RS232实验完全相同,大家对照学习可以加
0004 ; 深影像,并掌握RS485和RS232的使用方法。
0004 ;
0004 ; AVR mega128学习板
0004 ; www.iccavr.com 阿发
0004 ; 11:47 2007-10-14
0004 ; */
0004 ;
0004 ; #include "iom128v.h"
0004 ; #include "uart.h"
0004 ;
0004 ; /*延时函数*/
0004 ; void delay_ms(unsigned char i) {
0004 .dbline 28
0004 4427 clr R20
0006 06C0 xjmp L5
0008 L2:
0008 .dbline 28
0008 ;
0008 ; unsigned char a, b;
0008 ; for (a = 0; a < i; a++) {
0008 .dbline 29
0008 61E0 ldi R22,1
000A 01C0 xjmp L9
000C L6:
000C .dbline 29
000C L7:
000C .dbline 29
000C 6395 inc R22
000E L9:
000E .dbline 29
000E 6623 tst R22
0010 E9F7 brne L6
0012 .dbline 30
0012 L3:
0012 .dbline 28
0012 4395 inc R20
0014 L5:
0014 .dbline 28
0014 4017 cp R20,R16
0016 C0F3 brlo L2
0018 .dbline -2
0018 L1:
0018 0E940000 xcall pop_gset2
001C .dbline 0 ; func end
001C 0895 ret
001E .dbsym r a 20 c
001E .dbsym r b 22 c
001E .dbsym r i 16 c
001E .dbend
001E .dbfunc e io_init _io_init fV
.even
001E _io_init::
001E .dbline -1
001E .dbline 34
001E ; for (b = 1; b; b++);
001E ; }
001E ; }
001E ;
001E ; /*IO口初始化函数*/
001E ; void io_init(void) {
001E .dbline 36
001E ;
001E ; DDRA = 0x00; /*方向输入*/
001E 2224 clr R2
0020 2ABA out 0x1a,R2
0022 .dbline 37
0022 ; PORTA = 0xFF; /*打开上拉*/
0022 8FEF ldi R24,255
0024 8BBB out 0x1b,R24
0026 .dbline 38
0026 ; DDRB = 0xFF; /*方向输出*/
0026 87BB out 0x17,R24
0028 .dbline 39
0028 ; PORTB = 0xFF; /*输出高电平*/
0028 88BB out 0x18,R24
002A .dbline 40
002A ; DDRC = 0x00; /*不用的IO口建议设置为输入带上拉*/
002A 24BA out 0x14,R2
002C .dbline 41
002C ; PORTC = 0xFF;
002C 85BB out 0x15,R24
002E .dbline 42
002E ; DDRD = 0x00;
002E 21BA out 0x11,R2
0030 .dbline 43
0030 ; PORTD = 0xFF;
0030 82BB out 0x12,R24
0032 .dbline 44
0032 ; DDRE = 0x00;
0032 22B8 out 0x2,R2
0034 .dbline 45
0034 ; PORTE = 0xFF;
0034 83B9 out 0x3,R24
0036 .dbline 46
0036 ; DDRF = 0x00;
0036 20926100 sts 97,R2
003A .dbline 47
003A ; PORTF = 0xFF;
003A 80936200 sts 98,R24
003E .dbline 48
003E ; DDRG = 0x18; /*设置两路RS485的方向控制脚为输出*/
003E 88E1 ldi R24,24
0040 80936400 sts 100,R24
0044 .dbline 49
0044 ; PORTG = 0xE7; /*设置两路RS485均为输入状态*/
0044 87EE ldi R24,231
0046 80936500 sts 101,R24
004A .dbline -2
004A L10:
004A .dbline 0 ; func end
004A 0895 ret
004C .dbend
004C .dbfunc e main _main fV
004C ; j -> R20
004C ; i -> R22,R23
004C ; temp -> R10,R11
.even
004C _main::
004C .dbline -1
004C .dbline 53
004C ; }
004C ;
004C ; /*主函数*/
004C ; void main(void) {
004C .dbline 55
004C ;
004C ; unsigned char j = 0;
004C 4427 clr R20
004E .dbline 56
004E ; unsigned int i = 0;
004E 6627 clr R22
0050 7727 clr R23
0052 .dbline 57
0052 ; unsigned int temp = 0;
0052 AA24 clr R10
0054 BB24 clr R11
0056 .dbline 59
0056 ;
0056 ; io_init();
0056 E3DF xcall _io_init
0058 .dbline 60
0058 ; uart_init0();
0058 0E940000 xcall _uart_init0
005C .dbline 61
005C ; uart_init1();
005C 0E940000 xcall _uart_init1
0060 1EC0 xjmp L13
0062 L12:
0062 .dbline 63
0062 ;
0062 ; while (1) {
0062 .dbline 64
0062 ; delay_ms(1);
0062 01E0 ldi R16,1
0064 CDDF xcall _delay_ms
0066 .dbline 67
0066 ;
0066 ; /*UART0部分*/
0066 ; i ++;
0066 6F5F subi R22,255 ; offset = 1
0068 7F4F sbci R23,255
006A .dbline 68
006A ; if (i > 500) { /*500mS执行一次*/
006A 84EF ldi R24,500
006C 91E0 ldi R25,1
006E 8617 cp R24,R22
0070 9707 cpc R25,R23
0072 30F4 brsh L15
0074 .dbline 68
0074 .dbline 69
0074 ; uart_transmit0(j); /*发送变量j*/
0074 042F mov R16,R20
0076 0E940000 xcall _uart_transmit0
007A .dbline 70
007A ; j ++;
007A 4395 inc R20
007C .dbline 71
007C ; i = 0;
007C 6627 clr R22
007E 7727 clr R23
0080 .dbline 72
0080 ; }
0080 L15:
0080 .dbline 75
0080 ;
0080 ; /*UART1部分*/
0080 ; temp = uart_receive1(); /*接收数据*/
0080 0E940000 xcall _uart_receive1
0084 5801 movw R10,R16
0086 .dbline 76
0086 ; if (temp != 0) { /*判断是否接收到数据*/
0086 0030 cpi R16,0
0088 0107 cpc R16,R17
008A 49F0 breq L17
008C X0:
008C .dbline 76
008C .dbline 77
008C ; PORTB = ~(temp & 0xFF); /*显示低电平有效*/
008C C501 movw R24,R10
008E 9070 andi R25,0
0090 8095 com R24
0092 9095 com R25
0094 88BB out 0x18,R24
0096 .dbline 78
0096 ; uart_transmit1(temp & 0xFF); /*发送收到的数据*/
0096 0A2D mov R16,R10
0098 1070 andi R17,0
009A 0E940000 xcall _uart_transmit1
009E .dbline 79
009E ; }
009E L17:
009E .dbline 80
009E L13:
009E .dbline 63
009E E1CF xjmp L12
00A0 X1:
00A0 .dbline -2
00A0 L11:
00A0 .dbline 0 ; func end
00A0 0895 ret
00A2 .dbsym r j 20 c
00A2 .dbsym r i 22 i
00A2 .dbsym r temp 10 i
00A2 .dbend
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -