📄 at45db041.lst
字号:
(0188)
(0189) /**************************************
(0190) ** 说明:CS=1 停止at45db041
(0191) **
(0192) **************************************/
(0193) void at4541_stop(void)
(0194) {
(0195) CS_HIGH();
_at4541_stop:
011E 9AD9 SBI 0x1B,1
(0196) delay_ms(500);
011F EF04 LDI R16,0xF4
0120 E011 LDI R17,1
0121 940E01AF CALL _delay_ms
0123 9508 RET
FILE: D:\桌面\教程\at45db041\main.c
(0001) // ICC-AVR application builder : 2007-2-14 21:34:00
(0002) // Target : M16
(0003) // Crystal: 7.3728Mhz
(0004) // 演示 at45db041 读写过程
(0005)
(0006) #include "config.h"
(0007)
(0008) void port_init(void)
(0009) {
(0010) PORTA = 0x00;
_port_init:
0124 2422 CLR R2
0125 BA2B OUT 0x1B,R2
(0011) DDRA = 0x00;
0126 BA2A OUT 0x1A,R2
(0012) PORTB = 0x00;
0127 BA28 OUT 0x18,R2
(0013) DDRB = 0x00;
0128 BA27 OUT 0x17,R2
(0014) PORTC = 0x00; //m103 output only
0129 BA25 OUT 0x15,R2
(0015) DDRC = 0x00;
012A BA24 OUT 0x14,R2
(0016) PORTD = 0x00;
012B BA22 OUT 0x12,R2
(0017) DDRD = 0x00;
012C BA21 OUT 0x11,R2
012D 9508 RET
(0018) }
(0019)
(0020) //call this routine to initialize all peripherals
(0021) void init_devices(void)
(0022) {
(0023) //stop errant interrupts until set up
(0024) CLI(); //disable all interrupts
_init_devices:
012E 94F8 BCLR 7
(0025) port_init();
012F DFF4 RCALL _port_init
(0026) at4541_init(); //at45db041初始化
0130 940E004B CALL _at4541_init
(0027)
(0028) MCUCR = 0x00;
0132 2422 CLR R2
0133 BE25 OUT 0x35,R2
(0029) GICR = 0x00;
0134 BE2B OUT 0x3B,R2
(0030) TIMSK = 0x00; //timer interrupt sources
0135 BE29 OUT 0x39,R2
(0031) SEI(); //re-enable interrupts
0136 9478 BSET 7
0137 9508 RET
_main:
temp1 --> Y+1
temp2 --> R22
receive_buf --> Y+0
i --> R20
0138 972A SBIW R28,0xA
(0032) //all peripherals are now initialized
(0033) }
(0034)
(0035) void main(void)
(0036) {
(0037) unsigned int temp1;
(0038) unsigned char i=0,temp2=0;
0139 2744 CLR R20
013A 2766 CLR R22
(0039) unsigned char receive_buf[10];
(0040) init_devices();
013B DFF2 RCALL _init_devices
(0041) at4541_commond_send(0x8200,0x00);//开始写指令,地址为0x00
013C 2722 CLR R18
013D 2733 CLR R19
013E E000 LDI R16,0
013F E812 LDI R17,0x82
0140 940E005B CALL _at4541_commond_send
(0042) for(i=0;i<10;i++)
0142 C004 RJMP 0x0147
(0043) {
(0044) at4541_write(i);
0143 2F04 MOV R16,R20
0144 940E00C4 CALL _at4541_write
0146 9543 INC R20
0147 304A CPI R20,0xA
0148 F3D0 BCS 0x0143
(0045) }
(0046) at4541_stop();
0149 940E011E CALL _at4541_stop
(0047) delay_ms(500);
014B EF04 LDI R16,0xF4
014C E011 LDI R17,1
014D 940E01AF CALL _delay_ms
(0048)
(0049) while(!at4541_check_busy())
014F 940E0053 CALL _at4541_check_busy
0151 2300 TST R16
0152 F3E1 BEQ 0x014F
(0050) ;//忙等待
(0051)
(0052) if(at4541_check_busy())
0153 940E0053 CALL _at4541_check_busy
0155 2300 TST R16
0156 F099 BEQ 0x016A
(0053) {
(0054) at4541_commond_send(0xe800,0x00);
0157 2722 CLR R18
0158 2733 CLR R19
0159 E000 LDI R16,0
015A EE18 LDI R17,0xE8
015B 940E005B CALL _at4541_commond_send
(0055) for(i=0;i<10;i++)
015D 2744 CLR R20
015E C009 RJMP 0x0168
(0056) {
(0057) receive_buf[i]=at4541_read();
015F 940E00A3 CALL _at4541_read
0161 01CE MOVW R24,R28
0162 2FE4 MOV R30,R20
0163 27FF CLR R31
0164 0FE8 ADD R30,R24
0165 1FF9 ADC R31,R25
0166 8300 STD Z+0,R16
0167 9543 INC R20
0168 304A CPI R20,0xA
0169 F3A8 BCS 0x015F
(0058) }
(0059) }
(0060) while(1)
016A CFFF RJMP 0x016A
016B 962A ADIW R28,0xA
016C 9508 RET
FILE: D:\桌面\教程\at45db041\delay.c
(0001) /****************************
(0002) ** file_name delay.c **
(0003) ** describe 软件延时函数 **
(0004) ** auther 古欣 **
(0005) ** Time 2007-1-31 **
(0006) *****************************/
(0007) #include "config.h"
(0008) /***********************
(0009) ** 8M晶振下 1us
(0010) ** 也可以宏定义 8个asm("nop");
(0011) ** #define delay_1us asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");
(0012) ***********************/
(0013) void delay_1us(void)
(0014) {
(0015) asm("nop");
_delay_1us:
016D 0000 NOP
016E 9508 RET
(0016) }
(0017)
(0018) /***********************
(0019) **8M时为 1000.25us
(0020) **4M时为 999.5us
(0021) **xtal 为晶振频率,单位为Mhz
(0022) ************************/
(0023) void delay_1ms(void)
(0024) {
(0025) unsigned int i;
(0026) for(i=(xtal*143-2);i>0;i--)
_delay_1ms:
i --> R16
016F E706 LDI R16,0x76
0170 E014 LDI R17,4
0171 C002 RJMP 0x0174
0172 5001 SUBI R16,1
0173 4010 SBCI R17,0
0174 3000 CPI R16,0
0175 0701 CPC R16,R17
0176 F7D9 BNE 0x0172
0177 9508 RET
_delay_1s:
i --> R20
0178 940E01FF CALL push_gset1
(0027) ;
(0028) }
(0029)
(0030) /***********************
(0031) ** 1S延时,误差可能稍大
(0032) ** 250ms*4=1000ms
(0033) ************************/
(0034) void delay_1s(void)
(0035) {
(0036) unsigned int i;
(0037) for(i=250;i>0;i--) //250ms*4=1000ms
017A EF4A LDI R20,0xFA
017B E050 LDI R21,0
017C C003 RJMP 0x0180
(0038) delay_1ms();
017D DFF1 RCALL _delay_1ms
017E 5041 SUBI R20,1
017F 4050 SBCI R21,0
0180 3040 CPI R20,0
0181 0745 CPC R20,R21
0182 F7D1 BNE 0x017D
(0039) for(i=250;i>0;i--)
0183 EF4A LDI R20,0xFA
0184 E050 LDI R21,0
0185 C003 RJMP 0x0189
(0040) delay_1ms();
0186 DFE8 RCALL _delay_1ms
0187 5041 SUBI R20,1
0188 4050 SBCI R21,0
0189 3040 CPI R20,0
018A 0745 CPC R20,R21
018B F7D1 BNE 0x0186
(0041) for(i=250;i>0;i--)
018C EF4A LDI R20,0xFA
018D E050 LDI R21,0
018E C003 RJMP 0x0192
(0042) delay_1ms();
018F DFDF RCALL _delay_1ms
0190 5041 SUBI R20,1
0191 4050 SBCI R21,0
0192 3040 CPI R20,0
0193 0745 CPC R20,R21
0194 F7D1 BNE 0x018F
(0043) for(i=250;i>0;i--)
0195 EF4A LDI R20,0xFA
0196 E050 LDI R21,0
0197 C003 RJMP 0x019B
(0044) delay_1ms();
0198 DFD6 RCALL _delay_1ms
0199 5041 SUBI R20,1
019A 4050 SBCI R21,0
019B 3040 CPI R20,0
019C 0745 CPC R20,R21
019D F7D1 BNE 0x0198
019E 940E0202 CALL pop_gset1
01A0 9508 RET
_delay_us:
i --> R20
n --> R22
01A1 940E01FD CALL push_gset2
01A3 01B8 MOVW R22,R16
(0045) }
(0046)
(0047) /***********************
(0048) **微秒级延时
(0049) ************************/
(0050) void delay_us(unsigned int n)
(0051) {
(0052) unsigned int i;
(0053) for(i=n;i>0;i--)
01A4 01AB MOVW R20,R22
01A5 C003 RJMP 0x01A9
(0054) delay_1us();
01A6 DFC6 RCALL _delay_1us
01A7 5041 SUBI R20,1
01A8 4050 SBCI R21,0
01A9 3040 CPI R20,0
01AA 0745 CPC R20,R21
01AB F7D1 BNE 0x01A6
01AC 940E01EE CALL pop_gset2
01AE 9508 RET
_delay_ms:
i --> R20
n --> R22
01AF 940E01FD CALL push_gset2
01B1 01B8 MOVW R22,R16
(0055) }
(0056)
(0057) /***********************
(0058) **毫秒级延时
(0059) ************************/
(0060) void delay_ms(unsigned int n)
(0061) {
(0062) unsigned int i;
(0063) for(i=n;i>0;i--)
01B2 01AB MOVW R20,R22
01B3 C003 RJMP 0x01B7
(0064) delay_1ms();
01B4 DFBA RCALL _delay_1ms
01B5 5041 SUBI R20,1
01B6 4050 SBCI R21,0
01B7 3040 CPI R20,0
01B8 0745 CPC R20,R21
01B9 F7D1 BNE 0x01B4
01BA 940E01EE CALL pop_gset2
01BC 9508 RET
_delay_s:
j --> R20
i --> R22
n --> R22
01BD 940E01FD CALL push_gset2
01BF 01B8 MOVW R22,R16
(0065) }
(0066)
(0067) /***********************
(0068) **秒级延时,太浪费资源,不建议使用
(0069) ************************/
(0070) void delay_s(unsigned int n)
(0071) {
(0072) unsigned int i,j;
(0073) for(j=n;j>0;j--)
01C0 01AB MOVW R20,R22
01C1 C026 RJMP 0x01E8
(0074) {
(0075) for(i=250;i>0;i--) //250ms*4=1000ms
01C2 EF6A LDI R22,0xFA
01C3 E070 LDI R23,0
01C4 C003 RJMP 0x01C8
(0076) delay_1ms();
01C5 DFA9 RCALL _delay_1ms
01C6 5061 SUBI R22,1
01C7 4070 SBCI R23,0
01C8 3060 CPI R22,0
01C9 0767 CPC R22,R23
01CA F7D1 BNE 0x01C5
(0077) for(i=250;i>0;i--)
01CB EF6A LDI R22,0xFA
01CC E070 LDI R23,0
01CD C003 RJMP 0x01D1
(0078) delay_1ms();
01CE DFA0 RCALL _delay_1ms
01CF 5061 SUBI R22,1
01D0 4070 SBCI R23,0
01D1 3060 CPI R22,0
01D2 0767 CPC R22,R23
01D3 F7D1 BNE 0x01CE
(0079) for(i=250;i>0;i--)
01D4 EF6A LDI R22,0xFA
01D5 E070 LDI R23,0
01D6 C003 RJMP 0x01DA
(0080) delay_1ms();
01D7 DF97 RCALL _delay_1ms
01D8 5061 SUBI R22,1
01D9 4070 SBCI R23,0
01DA 3060 CPI R22,0
01DB 0767 CPC R22,R23
01DC F7D1 BNE 0x01D7
(0081) for(i=250;i>0;i--)
01DD EF6A LDI R22,0xFA
01DE E070 LDI R23,0
01DF C003 RJMP 0x01E3
(0082) delay_1ms();
FILE: <library>
01E0 DF8E RCALL _delay_1ms
01E1 5061 SUBI R22,1
01E2 4070 SBCI R23,0
01E3 3060 CPI R22,0
01E4 0767 CPC R22,R23
01E5 F7D1 BNE 0x01E0
01E6 5041 SUBI R20,1
01E7 4050 SBCI R21,0
01E8 3040 CPI R20,0
01E9 0745 CPC R20,R21
01EA F6B9 BNE 0x01C2
01EB 940E01EE CALL pop_gset2
01ED 9508 RET
pop_gset2:
01EE E0E2 LDI R30,2
01EF 940C0203 JMP pop
pop_gset3:
01F1 E0E4 LDI R30,4
01F2 940C0203 JMP pop
pop_gset4:
01F4 E0E8 LDI R30,0x8
01F5 940C0203 JMP pop
push_gset5:
01F7 92FA ST R15,-Y
01F8 92EA ST R14,-Y
push_gset4:
01F9 92DA ST R13,-Y
01FA 92CA ST R12,-Y
push_gset3:
01FB 92BA ST R11,-Y
01FC 92AA ST R10,-Y
push_gset2:
01FD 937A ST R23,-Y
01FE 936A ST R22,-Y
push_gset1:
01FF 935A ST R21,-Y
0200 934A ST R20,-Y
0201 9508 RET
pop_gset1:
0202 E0E1 LDI R30,1
pop:
0203 9149 LD R20,Y+
0204 9159 LD R21,Y+
0205 FDE0 SBRC R30,0
0206 9508 RET
0207 9169 LD R22,Y+
0208 9179 LD R23,Y+
0209 FDE1 SBRC R30,1
020A 9508 RET
020B 90A9 LD R10,Y+
020C 90B9 LD R11,Y+
020D FDE2 SBRC R30,2
020E 9508 RET
020F 90C9 LD R12,Y+
0210 90D9 LD R13,Y+
0211 FDE3 SBRC R30,3
0212 9508 RET
0213 90E9 LD R14,Y+
0214 90F9 LD R15,Y+
0215 9508 RET
lsl8:
0216 2311 TST R17
0217 F019 BEQ 0x021B
0218 0F00 LSL R16
0219 951A DEC R17
021A CFFB RJMP lsl8
021B 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -