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

📄 attest.lst

📁 使用atmel128对45db161读写程序加LM2009R大液晶显示
💻 LST
📖 第 1 页 / 共 5 页
字号:
__start:
__text_start:
    0065 EFCF      LDI	R28,0xFF
    0066 E1D0      LDI	R29,0x10
    0067 BFCD      OUT	0x3D,R28
    0068 BFDE      OUT	0x3E,R29
    0069 51C0      SUBI	R28,0x10
    006A 40D0      SBCI	R29,0
    006B EA0A      LDI	R16,0xAA
    006C 8308      STD	Y+0,R16
    006D 2400      CLR	R0
    006E E3EE      LDI	R30,0x3E
    006F E0F1      LDI	R31,1
    0070 E015      LDI	R17,5
    0071 34E6      CPI	R30,0x46
    0072 07F1      CPC	R31,R17
    0073 F011      BEQ	0x0076
    0074 9201      ST	R0,Z+
    0075 CFFB      RJMP	0x0071
    0076 8300      STD	Z+0,R16
    0077 E8EC      LDI	R30,0x8C
    0078 E0F0      LDI	R31,0
    0079 E0A0      LDI	R26,0
    007A E0B1      LDI	R27,1
    007B E010      LDI	R17,0
    007C 3CEA      CPI	R30,0xCA
    007D 07F1      CPC	R31,R17
    007E F021      BEQ	0x0083
    007F 95C8      LPM
    0080 9631      ADIW	R30,1
    0081 920D      ST	R0,X+
    0082 CFF9      RJMP	0x007C
    0083 940E0320  CALL	_main
_exit:
    0085 CFFF      RJMP	_exit
FILE: E:\ICC128\2008控制台\2008console0TEST\flashTest\at45db161d.c
(0001) /************************************************
(0002)   flash 读写程序
(0003)   
(0004)   2008年6月20日
(0005)  
(0006) *************************************************/
(0007) #include "2008.h"
(0008) 
(0009) #define DF_PAGE_SIZE 528
(0010) #define DF_READ_BUFFER 0
(0011) #define DF_WRITE_BUFFER 1
(0012) 
(0013) #define MM_PAGE_TO_B1_XFER  0x53  //主存储器页到缓存区转移命令(缓冲区1 53H 缓冲区2 55H)
(0014) // main memory page to buffer 2 transfer
(0015) #define MM_PAGE_TO_B2_XFER  0x55  //主存储器页到缓存区转移命令(缓冲区1 53H 缓冲区2 55H)
(0016) // buffer 1 to main memory page program with built-in erase
(0017) #define B1_TO_MM_PAGE_PROG_WITH_ERASE 0x83
(0018) // buffer 2 to main memory page program with built-in erase
(0019) #define B2_TO_MM_PAGE_PROG_WITH_ERASE 0x86
(0020) // buffer 1 read
(0021) #define BUFFER_1_READ 0xd1 //0xD4
(0022) // buffer 2 read
(0023) #define BUFFER_2_READ 0xd3 //0xD6
(0024) // buffer 1 write 
(0025) #define BUFFER_1_WRITE 0x84
(0026) // buffer 2 write 
(0027) #define BUFFER_2_WRITE 0x87
(0028) 
(0029) 
(0030) #define STATUS_REGISTER  0xD7
(0031) 
(0032) 
(0033) #define UNSELECT_CHIP  PORTB |= 0x10;
(0034) #define SELECT_CHIP    PORTB &= 0xef;
(0035) 
(0036) uint g_CurReadPage;//当前读的页地址
(0037) uint g_CurReadByte;//当前读的字节(页中地址)
(0038) uint g_CurWritePage;//当前写的页地址
(0039) uint g_CurWriteByte;//当前写的字节地址(页中地址)
(0040) //====================================================================
(0041) void df_init(void)
(0042) {
(0043) 	//MISO设置为输入,上拉电阻关闭,其它默认为1
(0044) 	//PORTB |= _BV(FLASH_SCK)|_BV(FLASH_MOSI)|_BV(FLASH_CS)|_BV(PB2);	
(0045) 	//PORTB |=  1    2   4   0
(0046) 	PORTB |= 0x17;
_df_init:
    0086 B388      IN	R24,0x18
    0087 6187      ORI	R24,0x17
    0088 BB88      OUT	0x18,R24
(0047) 	/*
(0048) 		注:使用AVR单片机SPI口,并用作主器件时SS引脚(ATMEGA8中PB2)要拉高或设置成输出!
(0049) 	*/
(0050) 	//SCK,MOSI和CS端口对应脚设置为输出
(0051) 	//DDRB |= _BV(FLASH_SCK)|_BV(FLASH_MOSI)|_BV(FLASH_CS);                            
(0052) 	//DDRB |=  1     2  4 
(0053) 	DDRB |= 0X16;  //配置为输出
    0089 B387      IN	R24,0x17
    008A 6186      ORI	R24,0x16
    008B BB87      OUT	0x17,R24
(0054) 	// SPI中断禁止, SPI使能, master模式, MSB 前,  SPI 模式 3, SCK频率Fcl/4
(0055) 	//SPCR = _BV(SPE)|_BV(MSTR)|_BV(CPHA)|_BV(CPOL);//|_BV(SPR1)|_BV(SPR0);
(0056) 	SPCR = 0x5c;   //SPI控制寄存器
    008C E58C      LDI	R24,0x5C
    008D B98D      OUT	0x0D,R24
    008E 9508      RET
_df_write_open:
  addr                 --> R20
    008F 940E0650  CALL	push_gset1
    0091 01A8      MOVW	R20,R16
(0057) 	
(0058) }
(0059) //======================================================================
(0060) //写初始化功能函数,addr为打开后读到的初始地址
(0061) void df_write_open(uint addr)
(0062) {
(0063) 	g_CurWritePage=addr/DF_PAGE_SIZE;
    0092 E120      LDI	R18,0x10
    0093 E032      LDI	R19,2
    0094 018A      MOVW	R16,R20
    0095 940E05AC  CALL	div16u
    0097 93100141  STS	_g_CurWritePage+1,R17
    0099 93000140  STS	_g_CurWritePage,R16
(0064) 	g_CurWriteByte=addr%DF_PAGE_SIZE;
    009B E120      LDI	R18,0x10
    009C E032      LDI	R19,2
    009D 018A      MOVW	R16,R20
    009E 940E05AA  CALL	mod16u
    00A0 9310013F  STS	_g_CurWriteByte+1,R17
    00A2 9300013E  STS	_g_CurWriteByte,R16
(0065) 	load_page_to_buffer(g_CurWritePage,DF_WRITE_BUFFER);
    00A4 E021      LDI	R18,1
    00A5 E030      LDI	R19,0
    00A6 91000140  LDS	R16,_g_CurWritePage
    00A8 91100141  LDS	R17,_g_CurWritePage+1
    00AA D022      RCALL	_load_page_to_buffer
    00AB 940E0653  CALL	pop_gset1
    00AD 9508      RET
_df_read_open:
  addr                 --> R20
    00AE 940E0650  CALL	push_gset1
    00B0 01A8      MOVW	R20,R16
(0066) }
(0067) //======================================================================
(0068) //读初始化功能函数,addr为打开后读到的初始地址
(0069) void df_read_open(uint addr)
(0070) {
(0071) 	g_CurReadPage=addr/DF_PAGE_SIZE;
    00B1 E120      LDI	R18,0x10
    00B2 E032      LDI	R19,2
    00B3 018A      MOVW	R16,R20
    00B4 940E05AC  CALL	div16u
    00B6 93100145  STS	_g_CurReadPage+1,R17
    00B8 93000144  STS	_g_CurReadPage,R16
(0072) 	g_CurReadByte=addr%DF_PAGE_SIZE;
    00BA E120      LDI	R18,0x10
    00BB E032      LDI	R19,2
    00BC 018A      MOVW	R16,R20
    00BD 940E05AA  CALL	mod16u
    00BF 93100143  STS	_g_CurReadByte+1,R17
    00C1 93000142  STS	_g_CurReadByte,R16
(0073) 	load_page_to_buffer(g_CurReadPage,DF_READ_BUFFER);
    00C3 2722      CLR	R18
    00C4 2733      CLR	R19
    00C5 91000144  LDS	R16,_g_CurReadPage
    00C7 91100145  LDS	R17,_g_CurReadPage+1
    00C9 D003      RCALL	_load_page_to_buffer
    00CA 940E0653  CALL	pop_gset1
    00CC 9508      RET
_load_page_to_buffer:
  buffer               --> R22
  page                 --> R20
    00CD 940E0667  CALL	push_gset2
    00CF 01B9      MOVW	R22,R18
    00D0 01A8      MOVW	R20,R16
(0074) }
(0075) //=======================================================================
(0076) //读主存储器指定页到读缓冲区(BUFFER1)
(0077) void load_page_to_buffer(uint page,uint buffer)
(0078) {
(0079) 	SELECT_CHIP;
    00D1 B388      IN	R24,0x18
    00D2 7E8F      ANDI	R24,0xEF
    00D3 BB88      OUT	0x18,R24
(0080) 	
(0081) 	if(buffer == DF_READ_BUFFER)            //=0
    00D4 3060      CPI	R22,0
    00D5 0767      CPC	R22,R23
    00D6 F421      BNE	0x00DB
(0082) 		spi_write(MM_PAGE_TO_B1_XFER);   //0x53 
    00D7 E503      LDI	R16,0x53
    00D8 E010      LDI	R17,0
    00D9 D018      RCALL	_spi_write
    00DA C003      RJMP	0x00DE
(0083) 	else
(0084) 		spi_write(MM_PAGE_TO_B2_XFER); //0x55
    00DB E505      LDI	R16,0x55
    00DC E010      LDI	R17,0
    00DD D014      RCALL	_spi_write
(0085) 	spi_write((uint)(page >> 6));
    00DE E026      LDI	R18,6
    00DF E030      LDI	R19,0
    00E0 018A      MOVW	R16,R20
    00E1 940E0677  CALL	lsr16
    00E3 D00E      RCALL	_spi_write
(0086) 	spi_write((uint)(page << 2));
    00E4 018A      MOVW	R16,R20
    00E5 0F00      LSL	R16
    00E6 1F11      ROL	R17
    00E7 0F00      LSL	R16
    00E8 1F11      ROL	R17
    00E9 D008      RCALL	_spi_write
(0087) 	spi_write(0x00);
    00EA 2700      CLR	R16
    00EB 2711      CLR	R17
    00EC D005      RCALL	_spi_write
(0088) 	
(0089) 	UNSELECT_CHIP; 
    00ED 9AC4      SBI	0x18,4
(0090) 	
(0091) 	df_wait_busy();
    00EE D009      RCALL	_df_wait_busy
    00EF 940E0647  CALL	pop_gset2
    00F1 9508      RET
(0092) }
(0093) //=======================================================================
(0094) //从SPI口输出一字节数据
(0095) uint spi_write(uint data)
(0096) {
(0097) 	SPDR = data;
_spi_write:
  data                 --> R16
    00F2 B90F      OUT	0x0F,R16
(0098) 	while(!(SPSR & 0x80)); //判断 SPIF
    00F3 9B77      SBIS	0x0E,7
    00F4 CFFE      RJMP	0x00F3
(0099) 	return SPDR;
    00F5 B10F      IN	R16,0x0F
    00F6 2711      CLR	R17
    00F7 9508      RET
(0100) }
(0101) //=======================================================================
(0102) //检测并等待器件忙状态,8引脚封闭器件没有 RDY/BUSY引脚 为些通过读状态寄存器来检测忙状态
(0103) void df_wait_busy(void)
(0104) {
(0105) 	SELECT_CHIP;
_df_wait_busy:
    00F8 B388      IN	R24,0x18
    00F9 7E8F      ANDI	R24,0xEF
    00FA BB88      OUT	0x18,R24
(0106) 	spi_write(STATUS_REGISTER);
    00FB ED07      LDI	R16,0xD7
    00FC E010      LDI	R17,0
    00FD DFF4      RCALL	_spi_write
    00FE C006      RJMP	0x0105
(0107) 	while(1)
(0108) 	{
(0109) 		if(spi_write(0) & 0x80) //读取的最高位0时器件忙
    00FF 2700      CLR	R16
    0100 2711      CLR	R17
    0101 DFF0      RCALL	_spi_write
    0102 FF07      SBRS	R16,7
    0103 C001      RJMP	0x0105
(0110) 			break;
    0104 C001      RJMP	0x0106
    0105 CFF9      RJMP	0x00FF
(0111) 	}
(0112) 	UNSELECT_CHIP;
    0106 9AC4      SBI	0x18,4
    0107 9508      RET
_df_write:
  temp                 --> R10
  size                 --> R20
  buf                  --> R22
    0108 940E066B  CALL	push_gset3
    010A 01A9      MOVW	R20,R18
    010B 01B8      MOVW	R22,R16
    010C 9722      SBIW	R28,2
(0113) }
(0114) //=======================================================================
(0115) void df_write(uint *buf,uint size)  //buf 源数据  size 写多少个字节
(0116) {
(0117) 	uint temp;
(0118) 	
(0119) 	if((g_CurWriteByte + size) > DF_PAGE_SIZE) //如果当前页未写空间不够size字节
    010D 9020013E  LDS	R2,_g_CurWriteByte
    010F 9030013F  LDS	R3,_g_CurWriteByte+1
    0111 0E24      ADD	R2,R20
    0112 1E35      ADC	R3,R21
    0113 E180      LDI	R24,0x10
    0114 E092      LDI	R25,2
    0115 1582      CP	R24,R2
    0116 0593      CPC	R25,R3
    0117 F008      BCS	0x0119
    0118 C035      RJMP	0x014E
(0120) 	{
(0121) 		//写当前页剩余空间的数据
(0122) 		temp=DF_PAGE_SIZE - g_CurWriteByte;
    0119 9020013E  LDS	R2,_g_CurWriteByte
    011B 9030013F  LDS	R3,_g_CurWriteByte+1
    011D 015C      MOVW	R10,R24
    011E 18A2      SUB	R10,R2
    011F 08B3      SBC	R11,R3
(0123) 		write_buffer(g_CurWriteByte,buf,temp); //将数据写入写缓冲区
    0120 82B9      STD	Y+1,R11
    0121 82A8      STD	Y+0,R10
    0122 019B      MOVW	R18,R22
    0123 0181      MOVW	R16,R2
    0124 D05E      RCALL	_write_buffer
(0124) 		//保存当前页
(0125) 		write_page_from_buffer(g_CurWritePage,DF_WRITE_BUFFER);
    0125 E021      LDI	R18,1
    0126 E030      LDI	R19,0
    0127 91000140  LDS	R16,_g_CurWritePage
    0129 91100141  LDS	R17,_g_CurWritePage+1
    012B D083      RCALL	_write_page_from_buffer
(0126) 		g_CurWritePage++;
    012C 91800140  LDS	R24,_g_CurWritePage
    012E 91900141  LDS	R25,_g_CurWritePage+1
    0130 9601      ADIW	R24,1
    0131 93900141  STS	_g_CurWritePage+1,R25
    0133 93800140  STS	_g_CurWritePage,R24
(0127) 		load_page_to_buffer(g_CurWritePage,DF_WRITE_BUFFER);
    0135 E021      LDI	R18,1
    0136 E030      LDI	R19,0
    0137 018C      MOVW	R16,R24
    0138 DF94      RCALL	_load_page_to_buffer
(0128) 		
(0129) 		//写入到下一页对应缓冲区
(0130) 		g_CurWriteByte=size-temp;
    0139 011A      MOVW	R2,R20
    013A 182A      SUB	R2,R10
    013B 083B      SBC	R3,R11
    013C 9230013F  STS	_g_CurWriteByte+1,R3
    013E 9220013E  STS	_g_CurWriteByte,R2
(0131) 		write_buffer(0,buf+temp,g_CurWriteByte);
    0140 8239      STD	Y+1,R3
    0141 8228      STD	Y+0,R2
    0142 E002      LDI	R16,2
    0143 E010      LDI	R17,0
    0144 0195      MOVW	R18,R10
    0145 940E0637  CALL	empy16s
    0147 0198      MOVW	R18,R16
    0148 0F26      ADD	R18,R22
    0149 1F37      ADC	R19,R23
    014A 2700      CLR	R16
    014B 2711      CLR	R17
    014C D036      RCALL	_write_buffer
(0132) 	}
    014D C031      RJMP	0x017F
(0133) 	else
(0134) 	{
(0135) 		write_buffer(g_CurWriteByte,buf,size);
    014E 8359      STD	Y+1,R21
    014F 8348      STD	Y+0,R20
    0150 019B      MOVW	R18,R22
    0151 9100013E  LDS	R16,_g_CurWriteByte
    0153 9110013F  LDS	R17,_g_CurWriteByte+1
    0155 D02D      RCALL	_write_buffer
(0136) 		g_CurWriteByte+=size;
    0156 9020013E  LDS	R2,_g_CurWriteByte
    0158 9030013F  LDS	R3,_g_CurWriteByte+1
    015A 0E24      ADD	R2,R20
    015B 1E35      ADC	R3,R21
    015C 9230013F  STS	_g_CurWriteByte+1,R3
    015E 9220013E  STS	_g_CurWriteByte,R2
(0137) 		
(0138) 		//缓冲已满,写入到主存储区
(0139) 		if(g_CurWriteByte==DF_PAGE_SIZE)
    0160 01C1      MOVW	R24,R2
    0161 3180      CPI	R24,0x10
    0162 E0E2      LDI	R30,2
    0163 079E      CPC	R25,R30
    0164 F4D1      BNE	0x017F
(0140) 		{
(0141) 			g_CurWriteByte=0;
    0165 2422      CLR	R2
    0166 2433      CLR	R3
    0167 9230013F  STS	_g_CurWriteByte+1,R3
    0169 9220013E  STS	_g_CurWriteByte,R2
(0142) 			write_page_from_buffer(g_CurWritePage,DF_WRITE_BUFFER);
    016B E021      LDI	R18,1
    016C E030      LDI	R19,0
    016D 91000140  LDS	R16,_g_CurWritePage
    016F 91100141  LDS	R17,_g_CurWritePage+1
    0171 D03D      RCALL	_write_page_from_buffer
(0143) 			g_CurWritePage++;
    0172 91800140  LDS	R24,_g_CurWritePage
    0174 91900141  LDS	R25,_g_CurWritePage+1
    0176 9601      ADIW	R24,1
    0177 93900141  STS	_g_CurWritePage+1,R25
    0179 93800140  STS	_g_CurWritePage,R24
(0144) 			load_page_to_buffer(g_CurWritePage,DF_WRITE_BUFFER);			
    017B E021      LDI	R18,1
    017C E030      LDI	R19,0
    017D 018C      MOVW	R16,R24
    017E DF4E      RCALL	_load_page_to_buffer
(0145) 		}
(0146) 	} 	
    017F 9622      ADIW	R28,2

⌨️ 快捷键说明

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