📄 spi.lst
字号:
__start:
__text_start:
34 EFCF LDI R28,0xFF
35 E0D4 LDI R29,4
36 BFCD OUT 0x3D,R28
37 BFDE OUT 0x3E,R29
38 51C0 SUBI R28,0x10
39 40D0 SBCI R29,0
3A EA0A LDI R16,0xAA
3B 8308 STD Y+0,R16
3C 2400 CLR R0
3D E0E0 LDI R30,0
3E E0F1 LDI R31,1
3F E011 LDI R17,1
40 30E0 CPI R30,0
41 07F1 CPC R31,R17
42 F011 BEQ 0x0045
43 9201 ST R0,Z+
44 CFFB RJMP 0x0040
45 8300 STD Z+0,R16
46 E6E8 LDI R30,0x68
47 E0F0 LDI R31,0
48 E0A0 LDI R26,0
49 E0B1 LDI R27,1
4A E010 LDI R17,0
4B 36E8 CPI R30,0x68
4C 07F1 CPC R31,R17
4D F021 BEQ 0x0052
4E 95C8 LPM
4F 9631 ADIW R30,1
50 920D ST R0,X+
51 CFF9 RJMP 0x004B
52 940E 00AE CALL _main
_exit:
54 CFFF RJMP _exit
FILE: G:\燕洪成\gra_des\exper\inc\myfun.h
(0001) //******DelayTime*******//
(0002) void Delayus(int time)
(0003) {
(0004) do
(0005) time--;
_Delayus:
time --> R16
55 5001 SUBI R16,1
56 4010 SBCI R17,0
(0006) while(time>1);
57 E081 LDI R24,1
58 E090 LDI R25,0
59 1780 CP R24,R16
5A 0791 CPC R25,R17
5B F3CC BLT 0x0055
5C 9508 RET
_Delayms:
time --> R20
5D 934A ST R20,-Y
5E 935A ST R21,-Y
5F 01A8 MOVW R20,R16
(0007) }
(0008) void Delayms(unsigned int time)
(0009) {
60 C005 RJMP 0x0066
(0010) while(time!=0)
(0011) {
(0012) Delayus(1000);
61 EE08 LDI R16,0xE8
62 E013 LDI R17,3
63 DFF1 RCALL _Delayus
(0013) time--;
64 5041 SUBI R20,1
65 4050 SBCI R21,0
66 3040 CPI R20,0
67 0745 CPC R20,R21
68 F7C1 BNE 0x0061
69 9159 LD R21,Y+
6A 9149 LD R20,Y+
6B 9508 RET
FILE: G:\燕洪成\gra_des\exper\spi\spi_slave\spi.c
(0001) // **************************************************************
(0002) // *** 实验: SPI Interface Slave ***
(0003) // *** 2007年10月13日 ***
(0004) // *** 目标MCU:MEGA168v 晶振:内部 8MHZ ***
(0005) // **************************************************************
(0006) //set_bit:PORTD |=(1<<PORTD3);
(0007) //clr_bit:PORTD &=~(1<<PORTD3);
(0008) #include<iom168v.h>
(0009) #include<macros.h>
(0010) #include<myfun.h>
(0011)
(0012) //**PORT_Init()**//
(0013) void PORT_Init()
(0014) {
(0015) DDRD |=(1<<DDD7);//Interrupt output
_PORT_Init:
6C 9A57 SBI 0x0A,7
(0016) PORTD |=(1<<PORTD7);//set high
6D 9A5F SBI 0x0B,7
6E 9508 RET
(0017) }
(0018)
(0019) //*************************************************
(0020) //****************** USART **********************
(0021) //*************************************************
(0022) #define USART_DDR DDRD
(0023) #define DDR_TX DDD1
(0024) #define USART_PORT PORTD
(0025) #define USART_RX PORTD0
(0026) //***********串口初始化*******************************
(0027) //内部8Mhz频率,设置波特率9.6k,8位数据位,
(0028) //无校验,1位停止位
(0029) void USART_Init(void)
(0030) {
(0031) USART_DDR |=(1<<DDR_TX); //set TX output
_USART_Init:
6F 9A51 SBI 0x0A,1
(0032) USART_PORT |=(1<<USART_RX); //RX pull up
70 9A58 SBI 0x0B,0
(0033)
(0034) UCSR0B = 0x00; //设置波特率之前先关闭串口
71 2422 CLR R2
72 9220 00C1 STS 0x00C1,R2
(0035) UCSR0A = 0x00;
74 9220 00C0 STS 0x00C0,R2
(0036) UBRR0H=0;
76 9220 00C5 STS 0x00C5,R2
(0037) UBRR0L=51;
78 E383 LDI R24,0x33
79 9380 00C4 STS 0x00C4,R24
(0038) //UCSR0B=(1<<RXEN0)|(1<<TXEN0)|(1<<RXCIE0);//enable
(0039) UCSR0B=(1<<RXEN0)|(1<<TXEN0);
7B E188 LDI R24,0x18
7C 9380 00C1 STS 0x00C1,R24
(0040) UCSR0C=(1<<UCSZ00)|(1<<UCSZ01);//8 data,1 stop
7E E086 LDI R24,6
7F 9380 00C2 STS 0x00C2,R24
81 9508 RET
(0041) }
(0042) //***************串口发送数据函数***************************
(0043) void USART_Transmit(unsigned char data) //查询方式发送接收字符函数
(0044) {
(0045) while( !(UCSR0A & (1<<UDRE0))) //等待发送缓冲区为空
_USART_Transmit:
data --> R16
82 9020 00C0 LDS R2,0x00C0
84 FE25 SBRS R2,5
85 CFFC RJMP _USART_Transmit
(0046) ;
(0047) UDR0 = data;
86 9300 00C6 STS 0x00C6,R16
88 9508 RET
(0048) }
(0049) //*************************************************
(0050) //**************** USART_over *********************
(0051) //*************************************************
(0052) //*************************************************
(0053) //****************** SPI ************************
(0054) //*************************************************
(0055) #define DDR_SPI DDRB
(0056) #define DDR_SS DDB2
(0057) #define DDR_MOSI DDB3
(0058) #define DDR_MISO DDB4
(0059) #define DDR_SCK DDB5
(0060) #define SPI_SS PORTB2
(0061) //**SPI_SlaveInit()**//
(0062) void SPI_SlaveInit(void)
(0063) {
(0064) DDRB = (1<<DDR_MISO);//设置MISO 为输出,其他为输入
_SPI_SlaveInit:
89 E180 LDI R24,0x10
8A B984 OUT 0x04,R24
(0065) SPCR = (1<<SPE)|(1<<SPIE);//enable SPI,SPI interrupt
8B EC80 LDI R24,0xC0
8C BD8C OUT 0x2C,R24
8D 9508 RET
_SPI_SlaveTransmit:
cData --> R10
8E 92AA ST R10,-Y
8F 92BA ST R11,-Y
90 2EA0 MOV R10,R16
(0066) }
(0067) //**SPI_SlaveTransmit()**//
(0068) void SPI_SlaveTransmit(unsigned char cData)
(0069) {
(0070) SPDR=cData;
91 BCAE OUT 0x2E,R10
(0071) PORTD &= ~(1<<PORTD7);//clr
92 985F CBI 0x0B,7
(0072) Delayms(10);
93 E00A LDI R16,0xA
94 E010 LDI R17,0
95 DFC7 RCALL _Delayms
(0073) PORTD |= (1<<PORTD7);//set
96 9A5F SBI 0x0B,7
(0074) Delayms(10);
97 E00A LDI R16,0xA
98 E010 LDI R17,0
99 DFC3 RCALL _Delayms
9A 90B9 LD R11,Y+
9B 90A9 LD R10,Y+
9C 9508 RET
(0075) }
(0076) //**SPI_SlaveReceive()**//
(0077) unsigned char SPI_SlaveReceive(void)
(0078) {
(0079) while(!(SPSR & (1<<SPIF)))//等待接收结束
_SPI_SlaveReceive:
9D B42D IN R2,0x2D
9E FE27 SBRS R2,7
9F CFFD RJMP _SPI_SlaveReceive
(0080) ;
(0081) return SPDR;//返回数据
A0 B50E IN R16,0x2E
A1 9508 RET
_SPI_ovf_isr:
temp_data --> R10
A2 940E 00C6 CALL push_lset
A4 92AA ST R10,-Y
A5 92BA ST R11,-Y
(0082) }
(0083) //**********中断服务程序*********************
(0084) #pragma interrupt_handler SPI_ovf_isr:18
(0085) void SPI_ovf_isr(void)
(0086) {
(0087) unsigned char temp_data;
(0088) temp_data=SPI_SlaveReceive();
A6 DFF6 RCALL _SPI_SlaveReceive
A7 2EA0 MOV R10,R16
(0089) USART_Transmit(temp_data);
A8 DFD9 RCALL _USART_Transmit
A9 90B9 LD R11,Y+
AA 90A9 LD R10,Y+
AB 940E 00DD CALL pop_lset
AD 9518 RETI
(0090) }
(0091) //*************************************************
(0092) //****************** SPI_over *******************
(0093) //*************************************************
(0094) void main(void)
(0095) {
(0096) unsigned int num=0;
_main:
num --> R20
AE 2744 CLR R20
AF 2755 CLR R21
(0097)
(0098) CLI();
B0 94F8 BCLR 7
(0099) PORT_Init();
B1 DFBA RCALL _PORT_Init
(0100) USART_Init();
B2 DFBC RCALL _USART_Init
(0101) SPI_SlaveInit();
B3 DFD5 RCALL _SPI_SlaveInit
(0102) SEI();
B4 9478 BSET 7
B5 C00E RJMP 0x00C4
(0103)
(0104) while(1)
(0105) {
(0106) //PORTB &= ~(1<<PORTB0);//clr
(0107) //Delayms(1);
(0108) //PORTB |= (1<<PORTB0);//set
(0109) //Delayms(1);
(0110) SPI_SlaveTransmit(num++);
B6 011A MOVW R2,R20
B7 5F4F SUBI R20,0xFF
B8 4F5F SBCI R21,0xFF
B9 2D02 MOV R16,R2
BA DFD3 RCALL _SPI_SlaveTransmit
(0111) Delayms(10);
BB E00A LDI R16,0xA
BC E010 LDI R17,0
BD DF9F RCALL _Delayms
(0112) if(num==0xFF)
BE 3F4F CPI R20,0xFF
BF E0E0 LDI R30,0
C0 075E CPC R21,R30
C1 F411 BNE 0x00C4
(0113) num=0;
FILE: <library>
C2 2744 CLR R20
C3 2755 CLR R21
C4 CFF1 RJMP 0x00B6
C5 9508 RET
push_lset:
C6 93FA ST R31,-Y
C7 93EA ST R30,-Y
C8 93BA ST R27,-Y
C9 93AA ST R26,-Y
CA 939A ST R25,-Y
CB 938A ST R24,-Y
CC 933A ST R19,-Y
CD 932A ST R18,-Y
CE 931A ST R17,-Y
CF 930A ST R16,-Y
D0 929A ST R9,-Y
D1 928A ST R8,-Y
D2 927A ST R7,-Y
D3 926A ST R6,-Y
D4 925A ST R5,-Y
D5 924A ST R4,-Y
D6 923A ST R3,-Y
D7 922A ST R2,-Y
D8 921A ST R1,-Y
D9 920A ST R0,-Y
DA B60F IN R0,0x3F
DB 920A ST R0,-Y
DC 9508 RET
pop_lset:
DD 9009 LD R0,Y+
DE BE0F OUT 0x3F,R0
DF 9009 LD R0,Y+
E0 9019 LD R1,Y+
E1 9029 LD R2,Y+
E2 9039 LD R3,Y+
E3 9049 LD R4,Y+
E4 9059 LD R5,Y+
E5 9069 LD R6,Y+
E6 9079 LD R7,Y+
E7 9089 LD R8,Y+
E8 9099 LD R9,Y+
E9 9109 LD R16,Y+
EA 9119 LD R17,Y+
EB 9129 LD R18,Y+
EC 9139 LD R19,Y+
ED 9189 LD R24,Y+
EE 9199 LD R25,Y+
EF 91A9 LD R26,Y+
F0 91B9 LD R27,Y+
F1 91E9 LD R30,Y+
F2 91F9 LD R31,Y+
F3 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -