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

📄 at45db041.lst

📁 一个关于AVR单片机的例程
💻 LST
📖 第 1 页 / 共 2 页
字号:
__text_start:
__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 36E0      CPI	R30,0x60
    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 940E0138  CALL	_main
_exit:
    004A CFFF      RJMP	_exit
FILE: D:\桌面\教程\at45db041\at45db041.c
(0001) /**************************************
(0002) ** Filename: at45db041.c
(0003) ** Describe: Flash 存储器at45db041
(0004) ** Author : 古欣 www.avrvi.com
(0005) ** Time  :   2007-2-14
(0006) **************************************/
(0007) 
(0008) #include "config.h"
(0009) 
(0010) /**************************************
(0011) ** 说明:初始化 at45db041
(0012) ** 除SO对应引脚为输入外,其余都设为输出,RESET高,CS低,芯片工作
(0013) **************************************/
(0014) void at4541_init(void)
(0015) {
(0016)  DDR_RESET_SET();
_at4541_init:
    004B 9AD0      SBI	0x1A,0
(0017)  DDR_CS_SET();
    004C 9AD1      SBI	0x1A,1
(0018)  DDR_SCK_SET();
    004D 9AD2      SBI	0x1A,2
(0019)  DDR_SI_SET();
    004E 9AD3      SBI	0x1A,3
(0020)  DDR_SO_SET();
    004F 98D4      CBI	0x1A,4
(0021)  
(0022)  CS_LOW();
    0050 98D9      CBI	0x1B,1
(0023)  RESET_HIGH();
    0051 9AD8      SBI	0x1B,0
    0052 9508      RET
(0024) }
(0025) 
(0026) /**************************************
(0027) ** 说明:RDY/~BUSY引脚为高表示准备好
(0028) **                      低表示内部忙
(0029) **************************************/
(0030) unsigned char at4541_check_busy(void)
(0031) {
(0032)  if((AT4541_PIN&CHEAK_BUSY)==CHEAK_BUSY)
_at4541_check_busy:
    0053 B389      IN	R24,0x19
    0054 7280      ANDI	R24,0x20
    0055 3280      CPI	R24,0x20
    0056 F411      BNE	0x0059
(0033)   {
(0034)     return 1;
    0057 E001      LDI	R16,1
    0058 C001      RJMP	0x005A
(0035)   }
(0036)  else
(0037)   {
(0038)    return 0;
    0059 2700      CLR	R16
    005A 9508      RET
_at4541_commond_send:
  i                    --> R20
  address              --> R22
  commond              --> R10
    005B 940E01FB  CALL	push_gset3
    005D 01B9      MOVW	R22,R18
    005E 0158      MOVW	R10,R16
(0039)   }
(0040) }
(0041) 
(0042) 
(0043) /**************************************
(0044) ** 说明:发送操作命令 (0xe800读)(0x8200写)
(0045) ** 数据格式:16位命令字,16位地址位,32位任意数
(0046) ** 输入:命令字,地址位
(0047) **************************************/
(0048) void at4541_commond_send(unsigned int commond,unsigned int address)
(0049) {
(0050)  unsigned char i=0;
    005F 2744      CLR	R20
(0051)  SCK_HIGH();
    0060 9ADA      SBI	0x1B,2
(0052)  RESET_HIGH();
    0061 9AD8      SBI	0x1B,0
(0053)  CS_HIGH();
    0062 9AD9      SBI	0x1B,1
(0054)  delay_1ms();
    0063 940E016F  CALL	_delay_1ms
(0055)  CS_LOW();
    0065 98D9      CBI	0x1B,1
(0056)  delay_1ms();
    0066 940E016F  CALL	_delay_1ms
(0057)  //16位命令字
(0058)  for(i=0;i<16;i++)
    0068 C013      RJMP	0x007C
(0059)  {
(0060)   SCK_LOW();
    0069 98DA      CBI	0x1B,2
(0061)   if((commond&0x8000)==0x8000)
    006A 01C5      MOVW	R24,R10
    006B 7080      ANDI	R24,0
    006C 7890      ANDI	R25,0x80
    006D 3080      CPI	R24,0
    006E E8E0      LDI	R30,0x80
    006F 079E      CPC	R25,R30
    0070 F411      BNE	0x0073
(0062)    SI_HIGH();
    0071 9ADB      SBI	0x1B,3
    0072 C001      RJMP	0x0074
(0063)   else
(0064)    SI_LOW();
    0073 98DB      CBI	0x1B,3
(0065)   delay_1ms();
    0074 940E016F  CALL	_delay_1ms
(0066)   SCK_HIGH();
    0076 9ADA      SBI	0x1B,2
(0067)   delay_1ms();
    0077 940E016F  CALL	_delay_1ms
(0068)   commond=commond<<1;
    0079 0CAA      LSL	R10
    007A 1CBB      ROL	R11
    007B 9543      INC	R20
    007C 3140      CPI	R20,0x10
    007D F358      BCS	0x0069
(0069)  }
(0070)  //16位地址位
(0071)  for(i=0;i<16;i++)
    007E 2744      CLR	R20
    007F C013      RJMP	0x0093
(0072)  {
(0073)   SCK_LOW();
    0080 98DA      CBI	0x1B,2
(0074)   if((address&0x8000)==0x8000)
    0081 01CB      MOVW	R24,R22
    0082 7080      ANDI	R24,0
    0083 7890      ANDI	R25,0x80
    0084 3080      CPI	R24,0
    0085 E8E0      LDI	R30,0x80
    0086 079E      CPC	R25,R30
    0087 F411      BNE	0x008A
(0075)    SI_HIGH();
    0088 9ADB      SBI	0x1B,3
    0089 C001      RJMP	0x008B
(0076)   else
(0077)    SI_LOW();
    008A 98DB      CBI	0x1B,3
(0078)   delay_1ms();
    008B 940E016F  CALL	_delay_1ms
(0079)   SCK_HIGH();
    008D 9ADA      SBI	0x1B,2
(0080)   delay_1ms();
    008E 940E016F  CALL	_delay_1ms
(0081)   address=address<<1;
    0090 0F66      LSL	R22
    0091 1F77      ROL	R23
    0092 9543      INC	R20
    0093 3140      CPI	R20,0x10
    0094 F358      BCS	0x0080
(0082)  }
(0083)  //32位任意位
(0084)  for(i=0;i<32;i++)
    0095 2744      CLR	R20
    0096 C007      RJMP	0x009E
(0085)  {
(0086)   SCK_LOW();
    0097 98DA      CBI	0x1B,2
(0087)   delay_1ms();
    0098 940E016F  CALL	_delay_1ms
(0088)   SCK_HIGH();
    009A 9ADA      SBI	0x1B,2
(0089)   delay_1ms();
    009B 940E016F  CALL	_delay_1ms
    009D 9543      INC	R20
    009E 3240      CPI	R20,0x20
    009F F3B8      BCS	0x0097
    00A0 940E01F1  CALL	pop_gset3
    00A2 9508      RET
_at4541_read:
  temp1                --> R20
  temp2                --> R22
  i                    --> R10
    00A3 940E01FB  CALL	push_gset3
(0090)  }
(0091) }
(0092) 
(0093) /**************************************
(0094) ** 说明:读at45db41
(0095) ** 数据:在执行at4541_commond_send(发送读命令)之后,8位的数从SO输出
(0096) ** 输出:读出的一位数
(0097) **************************************/
(0098) unsigned char at4541_read(void)
(0099) {
(0100)  unsigned char i=0,temp1=0,temp2=0;
    00A5 24AA      CLR	R10
    00A6 2744      CLR	R20
    00A7 2766      CLR	R22
(0101)  //读出8位,组合在temp2里
(0102)  for(i=0;i<8;i++)
    00A8 C014      RJMP	0x00BD
(0103)  {
(0104)   SCK_LOW();
    00A9 98DA      CBI	0x1B,2
(0105)   delay_1ms();
    00AA 940E016F  CALL	_delay_1ms
(0106)   if(SO_PIN_HIGH)
    00AC B389      IN	R24,0x19
    00AD 7180      ANDI	R24,0x10
    00AE 3180      CPI	R24,0x10
    00AF F411      BNE	0x00B2
(0107)    temp1=1;
    00B0 E041      LDI	R20,1
    00B1 C001      RJMP	0x00B3
(0108)   else
(0109)    temp1=0;
    00B2 2744      CLR	R20
(0110)   temp2=temp2<<1+temp1;
    00B3 2F14      MOV	R17,R20
    00B4 5F1F      SUBI	R17,0xFF
    00B5 2F06      MOV	R16,R22
    00B6 940E0216  CALL	lsl8
    00B8 2F60      MOV	R22,R16
(0111)   SCK_HIGH();
    00B9 9ADA      SBI	0x1B,2
(0112)   delay_1ms();
    00BA 940E016F  CALL	_delay_1ms
    00BC 94A3      INC	R10
    00BD 2D8A      MOV	R24,R10
    00BE 3088      CPI	R24,0x8
    00BF F348      BCS	0x00A9
(0113)  }
(0114)  return temp2;
    00C0 2F06      MOV	R16,R22
    00C1 940E01F1  CALL	pop_gset3
    00C3 9508      RET
_at4541_write:
  i                    --> R20
  data                 --> R22
    00C4 940E01FD  CALL	push_gset2
    00C6 2F60      MOV	R22,R16
(0115) }
(0116) 
(0117) /**************************************
(0118) ** 说明:写at45db41
(0119) ** 数据:在执行at4541_commond_send(发送写命令)之后,8位的数写入
(0120) ** 输出:写入的一位数
(0121) **************************************/
(0122) void at4541_write(unsigned char data)
(0123) {
(0124)  unsigned char i=0;
    00C7 2744      CLR	R20
(0125)  //生成写入时序
(0126)  for(i=0;i<8;i++)
    00C8 C00D      RJMP	0x00D6
(0127)  {
(0128)   SCK_LOW();
    00C9 98DA      CBI	0x1B,2
(0129)   if(data&0x80==0x80)
    00CA FF60      SBRS	R22,0
    00CB C002      RJMP	0x00CE
(0130)    SI_HIGH();
    00CC 9ADB      SBI	0x1B,3
    00CD C001      RJMP	0x00CF
(0131)   else
(0132)    SI_LOW();
    00CE 98DB      CBI	0x1B,3
(0133)   delay_1ms();
    00CF 940E016F  CALL	_delay_1ms
(0134)   SCK_HIGH();
    00D1 9ADA      SBI	0x1B,2
(0135)   delay_1ms();
    00D2 940E016F  CALL	_delay_1ms
(0136)   data=data<<1;
    00D4 0F66      LSL	R22
    00D5 9543      INC	R20
    00D6 3048      CPI	R20,0x8
    00D7 F388      BCS	0x00C9
    00D8 940E01EE  CALL	pop_gset2
    00DA 9508      RET
_at4541_read_status:
  temp1                --> R20
  temp2                --> R22
  i                    --> R10
  commond              --> R12
    00DB 940E01F9  CALL	push_gset4
    00DD 2EC0      MOV	R12,R16
(0137)  }
(0138) }
(0139) 
(0140) /**************************************
(0141) ** 说明:读取寄存器状态
(0142) ** 操作流程:将57H或D7H操作代码传给at45db041 
(0143) ** 随后芯片从SO输出8位寄存器信息,高位在前
(0144) **************************************/
(0145) unsigned char at4541_read_status(unsigned char commond)
(0146) {
(0147)  unsigned char i=0,temp1=0,temp2=0;
    00DE 24AA      CLR	R10
    00DF 2744      CLR	R20
    00E0 2766      CLR	R22
(0148)  SCK_HIGH();
    00E1 9ADA      SBI	0x1B,2
(0149)  RESET_HIGH();
    00E2 9AD8      SBI	0x1B,0
(0150)  CS_HIGH();
    00E3 9AD9      SBI	0x1B,1
(0151)  delay_1ms();
    00E4 940E016F  CALL	_delay_1ms
(0152)  CS_LOW();
    00E6 98D9      CBI	0x1B,1
(0153)  delay_1ms();
    00E7 940E016F  CALL	_delay_1ms
(0154)  //本循环把8位command传给at45db041
(0155)  for(i=0;i<8;i++)
    00E9 C00F      RJMP	0x00F9
(0156)  {
(0157)   SCK_LOW();
    00EA 98DA      CBI	0x1B,2
(0158)   if((commond&0x80)==0x80)
    00EB 2D8C      MOV	R24,R12
    00EC 7880      ANDI	R24,0x80
    00ED 3880      CPI	R24,0x80
    00EE F411      BNE	0x00F1
(0159)     SI_HIGH();
    00EF 9ADB      SBI	0x1B,3
    00F0 C001      RJMP	0x00F2
(0160)   else 
(0161)     SI_LOW();
    00F1 98DB      CBI	0x1B,3
(0162)   delay_1ms();
    00F2 940E016F  CALL	_delay_1ms
(0163)   SCK_HIGH();
    00F4 9ADA      SBI	0x1B,2
(0164)   delay_1ms();
    00F5 940E016F  CALL	_delay_1ms
(0165)   commond=commond<<1;
    00F7 0CCC      LSL	R12
    00F8 94A3      INC	R10
    00F9 2D8A      MOV	R24,R10
    00FA 3088      CPI	R24,0x8
    00FB F370      BCS	0x00EA
(0166)  }
(0167)  //本循环接收传回的八位数据
(0168)  for(i=0;i<8;i++)
    00FC 24AA      CLR	R10
    00FD C014      RJMP	0x0112
(0169)  {
(0170)   SCK_LOW();
    00FE 98DA      CBI	0x1B,2
(0171)   delay_1ms();
    00FF 940E016F  CALL	_delay_1ms
(0172)   
(0173)   if(SO_PIN_HIGH)
    0101 B389      IN	R24,0x19
    0102 7180      ANDI	R24,0x10
    0103 3180      CPI	R24,0x10
    0104 F411      BNE	0x0107
(0174)    temp1 = 1;
    0105 E041      LDI	R20,1
    0106 C001      RJMP	0x0108
(0175)   else
(0176)    temp1 = 0;
    0107 2744      CLR	R20
(0177)   
(0178)   temp2 = temp2<<1 + temp1;
    0108 2F14      MOV	R17,R20
    0109 5F1F      SUBI	R17,0xFF
    010A 2F06      MOV	R16,R22
    010B 940E0216  CALL	lsl8
    010D 2F60      MOV	R22,R16
(0179)   SCK_HIGH();
    010E 9ADA      SBI	0x1B,2
(0180)   delay_1ms();
    010F 940E016F  CALL	_delay_1ms
    0111 94A3      INC	R10
    0112 2D8A      MOV	R24,R10
    0113 3088      CPI	R24,0x8
    0114 F348      BCS	0x00FE
(0181)  }
(0182)  CS_HIGH(); //停止输出
    0115 9AD9      SBI	0x1B,1
(0183)  
(0184)  delay_ms(500);
    0116 EF04      LDI	R16,0xF4
    0117 E011      LDI	R17,1
    0118 940E01AF  CALL	_delay_ms
(0185)  
(0186)  return temp2;
    011A 2F06      MOV	R16,R22
    011B 940E01F4  CALL	pop_gset4
    011D 9508      RET
(0187) }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -