📄 salve.lst
字号:
117 940E 01C8 CALL mod16u
119 0118 MOVW R2,R16
11A 0185 MOVW R16,R10
11B 1902 SUB R16,R2
11C 0913 SBC R17,R3
11D E02A LDI R18,0xA
11E E030 LDI R19,0
11F 940E 01CA CALL div16u
121 0158 MOVW R10,R16
(0124) i--;
122 94CA DEC R12
(0125) }while(number>=1);
123 01C5 MOVW R24,R10
124 3081 CPI R24,1
125 E0E0 LDI R30,0
126 079E CPC R25,R30
127 F720 BCC 0x010C
(0126) }
128 940C 01E4 JMP pop_xgset003C
_SEG_R:
i --> R12
number --> R10
12A 940E 01F6 CALL push_xgset003C
12C 0158 MOVW R10,R16
(0127) }
(0128) //=====================================
(0129)
(0130) //=============SEG右四显示数字==============
(0131) void SEG_R(unsigned int number)
(0132) {
(0133) unsigned char i=8;
12D E088 LDI R24,0x8
12E 2EC8 MOV R12,R24
(0134)
(0135) SEND(0x05,0x0f); //先清除右四位,右四位黑屏
12F E02F LDI R18,0xF
130 E005 LDI R16,5
131 DF1C RCALL _SEND
(0136) SEND(0x06,0x0f);
132 E02F LDI R18,0xF
133 E006 LDI R16,6
134 DF19 RCALL _SEND
(0137) SEND(0x07,0x0f);
135 E02F LDI R18,0xF
136 E007 LDI R16,7
137 DF16 RCALL _SEND
(0138) SEND(0x08,0x0f);
138 E02F LDI R18,0xF
139 E008 LDI R16,0x8
13A DF13 RCALL _SEND
(0139)
(0140) if(number>9999)//要显示的数值超过4位,则显示4个H
13B E08F LDI R24,0xF
13C E297 LDI R25,0x27
13D 158A CP R24,R10
13E 059B CPC R25,R11
13F F468 BCC 0x014D
(0141) {
(0142) SEND(0x05,0x0c);
140 E02C LDI R18,0xC
141 E005 LDI R16,5
142 DF0B RCALL _SEND
(0143) SEND(0x06,0x0c);
143 E02C LDI R18,0xC
144 E006 LDI R16,6
145 DF08 RCALL _SEND
(0144) SEND(0x07,0x0c);
146 E02C LDI R18,0xC
147 E007 LDI R16,7
148 DF05 RCALL _SEND
(0145) SEND(0x08,0x0c);
149 E02C LDI R18,0xC
14A E008 LDI R16,0x8
14B DF02 RCALL _SEND
(0146) }
14C C01C RJMP 0x0169
(0147) else//小于四位可以显示
(0148) {
(0149) /* for(i=8;i>4;i--)
(0150) {
(0151) SEND(i,number%10);
(0152) number=(number-number%10)/10;
(0153) } */
(0154)
(0155) do
(0156) {
(0157) SEND(i,number%10);
14D E02A LDI R18,0xA
14E E030 LDI R19,0
14F 0185 MOVW R16,R10
150 940E 01C8 CALL mod16u
152 2F20 MOV R18,R16
153 2D0C MOV R16,R12
154 DEF9 RCALL _SEND
(0158) number=(number-number%10)/10;
155 E02A LDI R18,0xA
156 E030 LDI R19,0
157 0185 MOVW R16,R10
158 940E 01C8 CALL mod16u
15A 0118 MOVW R2,R16
15B 0185 MOVW R16,R10
15C 1902 SUB R16,R2
15D 0913 SBC R17,R3
15E E02A LDI R18,0xA
15F E030 LDI R19,0
160 940E 01CA CALL div16u
162 0158 MOVW R10,R16
(0159) i--;
163 94CA DEC R12
(0160) }while(number>=1);
164 01C5 MOVW R24,R10
165 3081 CPI R24,1
166 E0E0 LDI R30,0
167 079E CPC R25,R30
168 F720 BCC 0x014D
(0161) }
169 940C 01E4 JMP pop_xgset003C
_delay:
i --> R10
j --> R12
z --> R16
16B 940E 01F6 CALL push_xgset003C
FILE: D:\MYDOCU~1\MYMCUW~1\AVR\spi\salve.c
(0001) //包含所需头文件
(0002) #include <ioM16v.h>
(0003) #include <macros.h>
(0004) #include "display.c"
(0005)
(0006)
(0007)
(0008) /*------宏定义------*/
(0009) #define uchar unsigned char
(0010) #define uint unsigned int
(0011)
(0012) uchar k=0;
(0013)
(0014) /*------函数定义------*/
(0015) //SPI函数
(0016) void spi_write(uchar sData);
(0017) uchar spi_read(void);
(0018)
(0019) void delay(uint z)
(0020) {
(0021) uint i,j;
(0022) for(i=0;i<z;i++)
16D 24AA CLR R10
16E 24BB CLR R11
16F C00E RJMP 0x017E
(0023) for(j=0;j<1000;j++);
170 24CC CLR R12
171 24DD CLR R13
172 C003 RJMP 0x0176
173 01C6 MOVW R24,R12
174 9601 ADIW R24,1
175 016C MOVW R12,R24
176 01C6 MOVW R24,R12
177 3E88 CPI R24,0xE8
178 E0E3 LDI R30,3
179 079E CPC R25,R30
17A F3C0 BCS 0x0173
17B 01C5 MOVW R24,R10
17C 9601 ADIW R24,1
17D 015C MOVW R10,R24
17E 16A0 CP R10,R16
17F 06B1 CPC R11,R17
180 F378 BCS 0x0170
181 940C 01E4 JMP pop_xgset003C
(0024) }
(0025)
(0026)
(0027) //端口初始化
(0028) void port_init(void)
(0029) {
(0030) PORTA = 0x00;
_port_init:
183 2422 CLR R2
184 BA2B OUT 0x1B,R2
(0031) DDRA = 0x00;
185 BA2A OUT 0x1A,R2
(0032) PORTB = 0x00;
186 BA28 OUT 0x18,R2
(0033) DDRB = 0x00;
187 BA27 OUT 0x17,R2
(0034) PORTC = 0x00;
188 BA25 OUT 0x15,R2
(0035) DDRC = 0x00;
189 BA24 OUT 0x14,R2
(0036) PORTD = 0x00;
18A BA22 OUT 0x12,R2
(0037) DDRD = 0x00;
18B BA21 OUT 0x11,R2
18C 9508 RET
(0038) }
(0039)
(0040)
(0041) void spi_init(void)
(0042) {
(0043) //spi初始化
(0044) DDRB|=BIT(PB6);
_spi_init:
18D 9ABE SBI 0x17,6
(0045) SPCR = 0x40;
18E E480 LDI R24,0x40
18F B98D OUT 0x0D,R24
(0046) SPSR = 0x00;
190 2422 CLR R2
191 B82E OUT 0x0E,R2
192 9508 RET
(0047) }
(0048)
(0049)
(0050) //功能:使用SPI发送一个字节
(0051) void spi_write(uchar sData)
(0052) {
(0053) SPDR = sData;
_spi_write:
sData --> R16
193 B90F OUT 0x0F,R16
(0054) while(!(SPSR & BIT(SPIF)));
194 9B77 SBIS 0x0E,7
195 CFFE RJMP 0x0194
196 9508 RET
(0055) //sData=SPDR;//读从机发回来的数据
(0056) }
(0057)
(0058)
(0059) //功能:使用SPI接收一个字节
(0060) uchar spi_read(void)
(0061) {
(0062) SPDR = 0x00;
_spi_read:
197 2422 CLR R2
198 B82F OUT 0x0F,R2
(0063) while(!(SPSR & BIT(SPIF)));
199 9B77 SBIS 0x0E,7
19A CFFE RJMP 0x0199
(0064) k++;
19B 9180 0060 LDS R24,k
19D 5F8F SUBI R24,0xFF
19E 9380 0060 STS k,R24
(0065) return SPDR;
1A0 B10F IN R16,0x0F
1A1 9508 RET
(0066)
(0067) }
(0068)
(0069)
(0070) void init_devices(void)
(0071) {
(0072) CLI(); //禁止所有中断
_init_devices:
1A2 94F8 BCLR 7
(0073) MCUCR = 0x00;
1A3 2422 CLR R2
1A4 BE25 OUT 0x35,R2
(0074) MCUCSR = 0x80;//禁止JTAG
1A5 E880 LDI R24,0x80
1A6 BF84 OUT 0x34,R24
(0075) GICR = 0x00;
1A7 BE2B OUT 0x3B,R2
(0076) port_init();
1A8 DFDA RCALL _port_init
(0077) spi_init();
1A9 DFE3 RCALL _spi_init
(0078) SEI();//开全局中断
1AA 9478 BSET 7
1AB 9508 RET
(0079) }
(0080) //主函数
(0081) void main(void)
(0082) {
(0083) init_devices();
_main:
1AC DFF5 RCALL _init_devices
(0084) SEG_INIT();
1AD DF26 RCALL _SEG_INIT
(0085) delay(100);
1AE E604 LDI R16,0x64
1AF E010 LDI R17,0
1B0 DFBA RCALL _delay
1B1 C009 RJMP 0x01BB
(0086) while(!(k==8))
(0087) {
(0088) SEG_R(spi_read());
1B2 DFE4 RCALL _spi_read
1B3 2711 CLR R17
1B4 DF75 RCALL _SEG_R
(0089) delay(100);
1B5 E604 LDI R16,0x64
1B6 E010 LDI R17,0
1B7 DFB3 RCALL _delay
(0090) SEG_L(spi_read());
1B8 DFDE RCALL _spi_read
1B9 2711 CLR R17
1BA DF2E RCALL _SEG_L
1BB 9180 0060 LDS R24,k
1BD 3088 CPI R24,0x8
1BE F799 BNE 0x01B2
(0091) }
(0092) spi_write(255);
1BF EF0F LDI R16,0xFF
1C0 DFD2 RCALL _spi_write
(0093) while(1)
FILE: <library>
1C1 CFFF RJMP 0x01C1
1C2 9508 RET
push_arg4:
1C3 933A ST R19,-Y
1C4 932A ST R18,-Y
push_arg2:
1C5 931A ST R17,-Y
1C6 930A ST R16,-Y
1C7 9508 RET
mod16u:
1C8 9468 BSET 6
1C9 C001 RJMP xdiv16u
div16u:
1CA 94E8 BCLR 6
xdiv16u:
1CB 92EA ST R14,-Y
1CC 92FA ST R15,-Y
1CD 938A ST R24,-Y
1CE 24EE CLR R14
1CF 24FF CLR R15
1D0 E180 LDI R24,0x10
1D1 0F00 LSL R16
1D2 1F11 ROL R17
1D3 1CEE ROL R14
1D4 1CFF ROL R15
1D5 16E2 CP R14,R18
1D6 06F3 CPC R15,R19
1D7 F018 BCS 0x01DB
1D8 1AE2 SUB R14,R18
1D9 0AF3 SBC R15,R19
1DA 9503 INC R16
1DB 958A DEC R24
1DC F7A1 BNE 0x01D1
1DD F416 BRTC 0x01E0
1DE 2D0E MOV R16,R14
1DF 2D1F MOV R17,R15
1E0 9189 LD R24,Y+
1E1 90F9 LD R15,Y+
1E2 90E9 LD R14,Y+
1E3 9508 RET
pop_xgset003C:
1E4 90A9 LD R10,Y+
1E5 90B9 LD R11,Y+
1E6 90C9 LD R12,Y+
1E7 90D9 LD R13,Y+
1E8 9508 RET
pop_xgset00FC:
1E9 90A9 LD R10,Y+
1EA 90B9 LD R11,Y+
1EB 90C9 LD R12,Y+
1EC 90D9 LD R13,Y+
1ED 90E9 LD R14,Y+
1EE 90F9 LD R15,Y+
1EF 9508 RET
push_xgsetF0FC:
1F0 937A ST R23,-Y
1F1 936A ST R22,-Y
push_xgset30FC:
1F2 935A ST R21,-Y
1F3 934A ST R20,-Y
push_xgset00FC:
1F4 92FA ST R15,-Y
1F5 92EA ST R14,-Y
push_xgset003C:
1F6 92DA ST R13,-Y
1F7 92CA ST R12,-Y
1F8 92BA ST R11,-Y
1F9 92AA ST R10,-Y
1FA 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -