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

📄 at45db161d.lis

📁 使用atmel128对45db161读写程序加LM2009R大液晶显示
💻 LIS
📖 第 1 页 / 共 4 页
字号:
                        .module at45db161d.c
                        .area text(rom, con, rel)
 0000                   .dbfile E:\ICC128\2008控制台\2008console0TEST\flashTest\at45db161d.c
 0000                   .dbfunc e df_init _df_init fV
                        .even
 0000           _df_init::
 0000                   .dbline -1
 0000                   .dbline 42
 0000           ; /************************************************
 0000           ;   flash 读写程序
 0000           ;   
 0000           ;   2008年6月20日
 0000           ;  
 0000           ; *************************************************/
 0000           ; #include "2008.h"
 0000           ; 
 0000           ; #define DF_PAGE_SIZE 528
 0000           ; #define DF_READ_BUFFER 0
 0000           ; #define DF_WRITE_BUFFER 1
 0000           ; 
 0000           ; #define MM_PAGE_TO_B1_XFER  0x53  //主存储器页到缓存区转移命令(缓冲区1 53H 缓冲区2 55H)
 0000           ; // main memory page to buffer 2 transfer
 0000           ; #define MM_PAGE_TO_B2_XFER  0x55  //主存储器页到缓存区转移命令(缓冲区1 53H 缓冲区2 55H)
 0000           ; // buffer 1 to main memory page program with built-in erase
 0000           ; #define B1_TO_MM_PAGE_PROG_WITH_ERASE 0x83
 0000           ; // buffer 2 to main memory page program with built-in erase
 0000           ; #define B2_TO_MM_PAGE_PROG_WITH_ERASE 0x86
 0000           ; // buffer 1 read
 0000           ; #define BUFFER_1_READ 0xd1 //0xD4
 0000           ; // buffer 2 read
 0000           ; #define BUFFER_2_READ 0xd3 //0xD6
 0000           ; // buffer 1 write 
 0000           ; #define BUFFER_1_WRITE 0x84
 0000           ; // buffer 2 write 
 0000           ; #define BUFFER_2_WRITE 0x87
 0000           ; 
 0000           ; 
 0000           ; #define STATUS_REGISTER  0xD7
 0000           ; 
 0000           ; 
 0000           ; #define UNSELECT_CHIP  PORTB |= 0x10;
 0000           ; #define SELECT_CHIP    PORTB &= 0xef;
 0000           ; 
 0000           ; uint g_CurReadPage;//当前读的页地址
 0000           ; uint g_CurReadByte;//当前读的字节(页中地址)
 0000           ; uint g_CurWritePage;//当前写的页地址
 0000           ; uint g_CurWriteByte;//当前写的字节地址(页中地址)
 0000           ; //====================================================================
 0000           ; void df_init(void)
 0000           ; {
 0000                   .dbline 46
 0000           ;       //MISO设置为输入,上拉电阻关闭,其它默认为1
 0000           ;       //PORTB |= _BV(FLASH_SCK)|_BV(FLASH_MOSI)|_BV(FLASH_CS)|_BV(PB2);       
 0000           ;       //PORTB |=  1    2   4   0
 0000           ;       PORTB |= 0x17;
 0000 88B3              in R24,0x18
 0002 8761              ori R24,23
 0004 88BB              out 0x18,R24
 0006                   .dbline 53
 0006           ;       /*
 0006           ;               注:使用AVR单片机SPI口,并用作主器件时SS引脚(ATMEGA8中PB2)要拉高或设置成输出!
 0006           ;       */
 0006           ;       //SCK,MOSI和CS端口对应脚设置为输出
 0006           ;       //DDRB |= _BV(FLASH_SCK)|_BV(FLASH_MOSI)|_BV(FLASH_CS);                            
 0006           ;       //DDRB |=  1     2  4 
 0006           ;       DDRB |= 0X16;  //配置为输出
 0006 87B3              in R24,0x17
 0008 8661              ori R24,22
 000A 87BB              out 0x17,R24
 000C                   .dbline 56
 000C           ;       // SPI中断禁止, SPI使能, master模式, MSB 前,  SPI 模式 3, SCK频率Fcl/4
 000C           ;       //SPCR = _BV(SPE)|_BV(MSTR)|_BV(CPHA)|_BV(CPOL);//|_BV(SPR1)|_BV(SPR0);
 000C           ;       SPCR = 0x5c;   //SPI控制寄存器
 000C 8CE5              ldi R24,92
 000E 8DB9              out 0xd,R24
 0010                   .dbline -2
 0010           L1:
 0010                   .dbline 0 ; func end
 0010 0895              ret
 0012                   .dbend
 0012                   .dbfunc e df_write_open _df_write_open fV
 0012           ;           addr -> R20,R21
                        .even
 0012           _df_write_open::
 0012 0E940000          xcall push_gset1
 0016 A801              movw R20,R16
 0018                   .dbline -1
 0018                   .dbline 62
 0018           ;       
 0018           ; }
 0018           ; //======================================================================
 0018           ; //写初始化功能函数,addr为打开后读到的初始地址
 0018           ; void df_write_open(uint addr)
 0018           ; {
 0018                   .dbline 63
 0018           ;       g_CurWritePage=addr/DF_PAGE_SIZE;
 0018 20E1              ldi R18,528
 001A 32E0              ldi R19,2
 001C 8A01              movw R16,R20
 001E 0E940000          xcall div16u
 0022 10930300          sts _g_CurWritePage+1,R17
 0026 00930200          sts _g_CurWritePage,R16
 002A                   .dbline 64
 002A           ;       g_CurWriteByte=addr%DF_PAGE_SIZE;
 002A 20E1              ldi R18,528
 002C 32E0              ldi R19,2
 002E 8A01              movw R16,R20
 0030 0E940000          xcall mod16u
 0034 10930100          sts _g_CurWriteByte+1,R17
 0038 00930000          sts _g_CurWriteByte,R16
 003C                   .dbline 65
 003C           ;       load_page_to_buffer(g_CurWritePage,DF_WRITE_BUFFER);
 003C 21E0              ldi R18,1
 003E 30E0              ldi R19,0
 0040 00910200          lds R16,_g_CurWritePage
 0044 10910300          lds R17,_g_CurWritePage+1
 0048 22D0              xcall _load_page_to_buffer
 004A                   .dbline -2
 004A           L2:
 004A 0E940000          xcall pop_gset1
 004E                   .dbline 0 ; func end
 004E 0895              ret
 0050                   .dbsym r addr 20 i
 0050                   .dbend
 0050                   .dbfunc e df_read_open _df_read_open fV
 0050           ;           addr -> R20,R21
                        .even
 0050           _df_read_open::
 0050 0E940000          xcall push_gset1
 0054 A801              movw R20,R16
 0056                   .dbline -1
 0056                   .dbline 70
 0056           ; }
 0056           ; //======================================================================
 0056           ; //读初始化功能函数,addr为打开后读到的初始地址
 0056           ; void df_read_open(uint addr)
 0056           ; {
 0056                   .dbline 71
 0056           ;       g_CurReadPage=addr/DF_PAGE_SIZE;
 0056 20E1              ldi R18,528
 0058 32E0              ldi R19,2
 005A 8A01              movw R16,R20
 005C 0E940000          xcall div16u
 0060 10930700          sts _g_CurReadPage+1,R17
 0064 00930600          sts _g_CurReadPage,R16
 0068                   .dbline 72
 0068           ;       g_CurReadByte=addr%DF_PAGE_SIZE;
 0068 20E1              ldi R18,528
 006A 32E0              ldi R19,2
 006C 8A01              movw R16,R20
 006E 0E940000          xcall mod16u
 0072 10930500          sts _g_CurReadByte+1,R17
 0076 00930400          sts _g_CurReadByte,R16
 007A                   .dbline 73
 007A           ;       load_page_to_buffer(g_CurReadPage,DF_READ_BUFFER);
 007A 2227              clr R18
 007C 3327              clr R19
 007E 00910600          lds R16,_g_CurReadPage
 0082 10910700          lds R17,_g_CurReadPage+1
 0086 03D0              xcall _load_page_to_buffer
 0088                   .dbline -2
 0088           L3:
 0088 0E940000          xcall pop_gset1
 008C                   .dbline 0 ; func end
 008C 0895              ret
 008E                   .dbsym r addr 20 i
 008E                   .dbend
 008E                   .dbfunc e load_page_to_buffer _load_page_to_buffer fV
 008E           ;         buffer -> R22,R23
 008E           ;           page -> R20,R21
                        .even
 008E           _load_page_to_buffer::
 008E 0E940000          xcall push_gset2
 0092 B901              movw R22,R18
 0094 A801              movw R20,R16
 0096                   .dbline -1
 0096                   .dbline 78
 0096           ; }
 0096           ; //=======================================================================
 0096           ; //读主存储器指定页到读缓冲区(BUFFER1)
 0096           ; void load_page_to_buffer(uint page,uint buffer)
 0096           ; {
 0096                   .dbline 79
 0096           ;       SELECT_CHIP;
 0096 88B3              in R24,0x18
 0098 8F7E              andi R24,239
 009A 88BB              out 0x18,R24
 009C                   .dbline 79
 009C                   .dbline 81
 009C           ;       
 009C           ;       if(buffer == DF_READ_BUFFER)            //=0
 009C 6030              cpi R22,0
 009E 6707              cpc R22,R23
 00A0 21F4              brne L5
 00A2           X0:
 00A2                   .dbline 82
 00A2           ;               spi_write(MM_PAGE_TO_B1_XFER);   //0x53 
 00A2 03E5              ldi R16,83
 00A4 10E0              ldi R17,0
 00A6 18D0              xcall _spi_write
 00A8 03C0              xjmp L6
 00AA           L5:
 00AA                   .dbline 84
 00AA           ;       else
 00AA           ;               spi_write(MM_PAGE_TO_B2_XFER); //0x55
 00AA 05E5              ldi R16,85
 00AC 10E0              ldi R17,0
 00AE 14D0              xcall _spi_write
 00B0           L6:
 00B0                   .dbline 85
 00B0           ;       spi_write((uint)(page >> 6));
 00B0 26E0              ldi R18,6
 00B2 30E0              ldi R19,0
 00B4 8A01              movw R16,R20
 00B6 0E940000          xcall lsr16
 00BA 0ED0              xcall _spi_write
 00BC                   .dbline 86
 00BC           ;       spi_write((uint)(page << 2));
 00BC 8A01              movw R16,R20
 00BE 000F              lsl R16
 00C0 111F              rol R17
 00C2 000F              lsl R16
 00C4 111F              rol R17
 00C6 08D0              xcall _spi_write
 00C8                   .dbline 87
 00C8           ;       spi_write(0x00);
 00C8 0027              clr R16
 00CA 1127              clr R17
 00CC 05D0              xcall _spi_write
 00CE                   .dbline 89
 00CE           ;       
 00CE           ;       UNSELECT_CHIP; 
 00CE C49A              sbi 0x18,4
 00D0                   .dbline 89
 00D0                   .dbline 91
 00D0           ;       
 00D0           ;       df_wait_busy();
 00D0 09D0              xcall _df_wait_busy
 00D2                   .dbline -2
 00D2           L4:
 00D2 0E940000          xcall pop_gset2
 00D6                   .dbline 0 ; func end
 00D6 0895              ret
 00D8                   .dbsym r buffer 22 i
 00D8                   .dbsym r page 20 i
 00D8                   .dbend
 00D8                   .dbfunc e spi_write _spi_write fi
 00D8           ;           data -> R16,R17
                        .even
 00D8           _spi_write::
 00D8                   .dbline -1
 00D8                   .dbline 96
 00D8           ; }
 00D8           ; //=======================================================================
 00D8           ; //从SPI口输出一字节数据
 00D8           ; uint spi_write(uint data)
 00D8           ; {
 00D8                   .dbline 97
 00D8           ;       SPDR = data;
 00D8 0FB9              out 0xf,R16
 00DA           L8:
 00DA                   .dbline 98
 00DA           L9:
 00DA                   .dbline 98
 00DA           ;       while(!(SPSR & 0x80)); //判断 SPIF
 00DA 779B              sbis 0xe,7
 00DC FECF              rjmp L8
 00DE                   .dbline 99
 00DE           ;       return SPDR;
 00DE 0FB1              in R16,0xf
 00E0 1127              clr R17
 00E2                   .dbline -2
 00E2           L7:
 00E2                   .dbline 0 ; func end
 00E2 0895              ret
 00E4                   .dbsym r data 16 i
 00E4                   .dbend
 00E4                   .dbfunc e df_wait_busy _df_wait_busy fV

⌨️ 快捷键说明

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