📄 dual_system_m16.lst
字号:
__start:
__text_start:
002A E5CF LDI R28,0x5F
002B E0D4 LDI R29,4
002C BFCD OUT 0x3D,R28
002D BFDE OUT 0x3E,R29
002E 51C0 SUBI R28,0x10
002F 40D0 SBCI R29,0
0030 EA0A LDI R16,0xAA
0031 8308 STD Y+0,R16
0032 2400 CLR R0
0033 E6E0 LDI R30,0x60
0034 E0F0 LDI R31,0
0035 E010 LDI R17,0
0036 36E1 CPI R30,0x61
0037 07F1 CPC R31,R17
0038 F011 BEQ 0x003B
0039 9201 ST R0,Z+
003A CFFB RJMP 0x0036
003B 8300 STD Z+0,R16
003C E5E4 LDI R30,0x54
003D E0F0 LDI R31,0
003E E6A0 LDI R26,0x60
003F E0B0 LDI R27,0
0040 E010 LDI R17,0
0041 35E4 CPI R30,0x54
0042 07F1 CPC R31,R17
0043 F021 BEQ 0x0048
0044 95C8 LPM
0045 9631 ADIW R30,1
0046 920D ST R0,X+
0047 CFF9 RJMP 0x0041
0048 940E0064 CALL _main
_exit:
004A CFFF RJMP _exit
FILE: D:\MYWORK~1\我的小设计\AVR开发板光盘\程序范例\Mega16程序包\8.双机通信实验_M16\main.c
(0001) //ICC-AVR application builder : 2006-6-20 9:25:59
(0002) // Target : M16
(0003) // Crystal: 1Mhz
(0004)
(0005) #include <iom16v.h>
(0006) #include <macros.h>
(0007) #include "main.h"
(0008)
(0009) uint8 Buffer;
(0010)
(0011) void Delay_us(unsigned int time)
(0012) {
(0013) while(time--);
_Delay_us:
time --> R16
004B 0118 MOVW R2,R16
004C 5001 SUBI R16,1
004D 4010 SBCI R17,0
004E 2022 TST R2
004F F7D9 BNE 0x004B
0050 2033 TST R3
0051 F7C9 BNE 0x004B
0052 9508 RET
_Delay_ms:
time --> R20
0053 940E00AF CALL push_gset1
0055 01A8 MOVW R20,R16
(0014) }
(0015)
(0016) void Delay_ms(unsigned int time)
(0017) {
0056 C003 RJMP 0x005A
(0018) while(time--)
(0019) {
(0020) Delay_us(10000);
0057 E100 LDI R16,0x10
0058 E217 LDI R17,0x27
0059 DFF1 RCALL _Delay_us
005A 011A MOVW R2,R20
005B 5041 SUBI R20,1
005C 4050 SBCI R21,0
005D 2022 TST R2
005E F7C1 BNE 0x0057
005F 2033 TST R3
0060 F7B1 BNE 0x0057
0061 940E00B2 CALL pop_gset1
0063 9508 RET
(0021) }
(0022) }
(0023) void main(void)
(0024) {
(0025) Delay_ms(1);
_main:
0064 E001 LDI R16,1
0065 E010 LDI R17,0
0066 DFEC RCALL _Delay_ms
(0026) SPI_SS_IN;
0067 98BC CBI 0x17,4
0068 9AC4 SBI 0x18,4
(0027) SPI_DO_OUT;
0069 9ABD SBI 0x17,5
(0028) SPI_DI_IN;
006A 98BE CBI 0x17,6
006B 9AC6 SBI 0x18,6
(0029) SPI_CLK_IN;
006C 98BF CBI 0x17,7
006D 9AC7 SBI 0x18,7
(0030)
(0031) uart_init(); //TART初始化
006E D00A RCALL _uart_init
(0032) SEI(); //全局中断使能
006F 9478 BSET 7
(0033)
(0034)
(0035) for(;;)
(0036) {
(0037) if(SS)
0070 9BB4 SBIS 0x16,4
0071 CFFE RJMP 0x0070
(0038) {
(0039)
(0040) Buffer=Spi_Send(0XF0);
0072 EF00 LDI R16,0xF0
0073 D016 RCALL _Spi_Send
0074 93000060 STS Buffer,R16
(0041)
(0042) USART_TXD(Buffer);
0076 D00B RCALL _USART_TXD
0077 CFF8 RJMP 0x0070
0078 9508 RET
(0043) }
(0044) }
(0045) }
(0046)
(0047) //===============================================================
(0048) void uart_init(void) //UART初始化
(0049) {
(0050) //设置侦格式
(0051) //异步,8位数据,无奇偶校验,一个停止位,无倍速
(0052) UCSRC=(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
_uart_init:
0079 E886 LDI R24,0x86
007A BD80 OUT 0x20,R24
(0053)
(0054) //设置波特率
(0055) UBRRL= (F_osc/Baud_rate/16-1)%256;
007B E189 LDI R24,0x19
007C B989 OUT 0x09,R24
(0056) UBRRH= (F_osc/Baud_rate/16-1)/256;
007D 2422 CLR R2
007E BC20 OUT 0x20,R2
(0057)
(0058) //使能接收中断,使能接收,使能发送
(0059) UCSRB = (1<<RXCIE)|(1<<RXEN)|(1<<TXEN);
007F E988 LDI R24,0x98
0080 B98A OUT 0x0A,R24
0081 9508 RET
(0060) }
(0061)
(0062)
(0063) //===============================================================
(0064) void USART_TXD(uint8 data) //发送采用查询方式
(0065) {
(0066) while( !(UCSRA & BIT(UDRE)) );
_USART_TXD:
data --> R16
0082 9B5D SBIS 0x0B,5
0083 CFFE RJMP _USART_TXD
(0067) UDR=data;
0084 B90C OUT 0x0C,R16
(0068) while( !(UCSRA & BIT(TXC )) );
0085 9B5E SBIS 0x0B,6
0086 CFFE RJMP 0x0085
(0069) UCSRA|=BIT(TXC);
0087 9A5E SBI 0x0B,6
0088 9508 RET
(0070) }
(0071)
(0072) //=======================================================================
(0073)
(0074) #pragma interrupt_handler USART_RXC:12
(0075) void USART_RXC(void)
(0076) {
_USART_RXC:
0089 9518 RETI
_Spi_Send:
temp --> R20
i --> R22
dat --> R16
008A 940E00AD CALL push_gset2
(0077)
(0078) }
(0079)
(0080) //*****************************************************************************************
(0081) //函数名:Spi_send(uint8 dat)
(0082) //输入:发送的数据
(0083) //输出:无
(0084) //功能描述:SPI从模式发送一个字节,先发送高位(发送的同时接收)
(0085) //*****************************************************************************************
(0086) uint8 Spi_Send(uint8 dat)
(0087) {
(0088) uint8 i,temp;
(0089) temp = 0;
008C 2744 CLR R20
(0090)
(0091) for(i=0; i<8; i++)
008D 2766 CLR R22
008E C00F RJMP 0x009E
(0092) {
(0093) if(dat & 0x80)
008F FF07 SBRS R16,7
0090 C002 RJMP 0x0093
(0094) {
(0095) MOSI_1;
0091 9AC5 SBI 0x18,5
(0096) }
0092 C001 RJMP 0x0094
(0097) else MOSI_0;
0093 98C5 CBI 0x18,5
(0098) dat <<= 1;
0094 0F00 LSL R16
(0099) while(!SCK);
0095 9BB7 SBIS 0x16,7
0096 CFFE RJMP 0x0095
(0100) while(SCK);
0097 99B7 SBIC 0x16,7
0098 CFFE RJMP 0x0097
(0101)
(0102) temp <<= 1;
0099 0F44 LSL R20
(0103) if(MISO)temp++;
009A 9BB6 SBIS 0x16,6
009B C001 RJMP 0x009D
009C 9543 INC R20
009D 9563 INC R22
009E 3068 CPI R22,0x8
009F F378 BCS 0x008F
(0104)
(0105) }
(0106) return temp;
FILE: <library>
00A0 2F04 MOV R16,R20
00A1 940E00A4 CALL pop_gset2
00A3 9508 RET
pop_gset2:
00A4 E0E2 LDI R30,2
00A5 940C00B3 JMP pop
push_gset5:
00A7 92FA ST R15,-Y
00A8 92EA ST R14,-Y
push_gset4:
00A9 92DA ST R13,-Y
00AA 92CA ST R12,-Y
push_gset3:
00AB 92BA ST R11,-Y
00AC 92AA ST R10,-Y
push_gset2:
00AD 937A ST R23,-Y
00AE 936A ST R22,-Y
push_gset1:
00AF 935A ST R21,-Y
00B0 934A ST R20,-Y
00B1 9508 RET
pop_gset1:
00B2 E0E1 LDI R30,1
pop:
00B3 9149 LD R20,Y+
00B4 9159 LD R21,Y+
00B5 FDE0 SBRC R30,0
00B6 9508 RET
00B7 9169 LD R22,Y+
00B8 9179 LD R23,Y+
00B9 FDE1 SBRC R30,1
00BA 9508 RET
00BB 90A9 LD R10,Y+
00BC 90B9 LD R11,Y+
00BD FDE2 SBRC R30,2
00BE 9508 RET
00BF 90C9 LD R12,Y+
00C0 90D9 LD R13,Y+
00C1 FDE3 SBRC R30,3
00C2 9508 RET
00C3 90E9 LD R14,Y+
00C4 90F9 LD R15,Y+
00C5 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -