⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 at45db041.lst

📁 一个关于AVR单片机的例程
💻 LST
📖 第 1 页 / 共 2 页
字号:
(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 + -