📄 at45db041.lis
字号:
.module at45db041.c
.area text(rom, con, rel)
0000 .dbfile D:\桌面\教程\at45db041\at45db041.c
0000 .dbfunc e at4541_init _at4541_init fV
.even
0000 _at4541_init::
0000 .dbline -1
0000 .dbline 15
0000 ; /**************************************
0000 ; ** Filename: at45db041.c
0000 ; ** Describe: Flash 存储器at45db041
0000 ; ** Author : 古欣 www.avrvi.com
0000 ; ** Time : 2007-2-14
0000 ; **************************************/
0000 ;
0000 ; #include "config.h"
0000 ;
0000 ; /**************************************
0000 ; ** 说明:初始化 at45db041
0000 ; ** 除SO对应引脚为输入外,其余都设为输出,RESET高,CS低,芯片工作
0000 ; **************************************/
0000 ; void at4541_init(void)
0000 ; {
0000 .dbline 16
0000 ; DDR_RESET_SET();
0000 D09A sbi 0x1a,0
0002 .dbline 17
0002 ; DDR_CS_SET();
0002 D19A sbi 0x1a,1
0004 .dbline 18
0004 ; DDR_SCK_SET();
0004 D29A sbi 0x1a,2
0006 .dbline 19
0006 ; DDR_SI_SET();
0006 D39A sbi 0x1a,3
0008 .dbline 20
0008 ; DDR_SO_SET();
0008 D498 cbi 0x1a,4
000A .dbline 22
000A ;
000A ; CS_LOW();
000A D998 cbi 0x1b,1
000C .dbline 23
000C ; RESET_HIGH();
000C D89A sbi 0x1b,0
000E .dbline -2
000E L1:
000E .dbline 0 ; func end
000E 0895 ret
0010 .dbend
0010 .dbfunc e at4541_check_busy _at4541_check_busy fc
.even
0010 _at4541_check_busy::
0010 .dbline -1
0010 .dbline 31
0010 ; }
0010 ;
0010 ; /**************************************
0010 ; ** 说明:RDY/~BUSY引脚为高表示准备好
0010 ; ** 低表示内部忙
0010 ; **************************************/
0010 ; unsigned char at4541_check_busy(void)
0010 ; {
0010 .dbline 32
0010 ; if((AT4541_PIN&CHEAK_BUSY)==CHEAK_BUSY)
0010 89B3 in R24,0x19
0012 8072 andi R24,32
0014 8032 cpi R24,32
0016 11F4 brne L3
0018 .dbline 33
0018 ; {
0018 .dbline 34
0018 ; return 1;
0018 01E0 ldi R16,1
001A 01C0 xjmp L2
001C L3:
001C .dbline 37
001C ; }
001C ; else
001C ; {
001C .dbline 38
001C ; return 0;
001C 0027 clr R16
001E .dbline -2
001E L2:
001E .dbline 0 ; func end
001E 0895 ret
0020 .dbend
0020 .dbfunc e at4541_commond_send _at4541_commond_send fV
0020 ; i -> R20
0020 ; address -> R22,R23
0020 ; commond -> R10,R11
.even
0020 _at4541_commond_send::
0020 0E940000 xcall push_gset3
0024 B901 movw R22,R18
0026 5801 movw R10,R16
0028 .dbline -1
0028 .dbline 49
0028 ; }
0028 ; }
0028 ;
0028 ;
0028 ; /**************************************
0028 ; ** 说明:发送操作命令 (0xe800读)(0x8200写)
0028 ; ** 数据格式:16位命令字,16位地址位,32位任意数
0028 ; ** 输入:命令字,地址位
0028 ; **************************************/
0028 ; void at4541_commond_send(unsigned int commond,unsigned int address)
0028 ; {
0028 .dbline 50
0028 ; unsigned char i=0;
0028 4427 clr R20
002A .dbline 51
002A ; SCK_HIGH();
002A DA9A sbi 0x1b,2
002C .dbline 52
002C ; RESET_HIGH();
002C D89A sbi 0x1b,0
002E .dbline 53
002E ; CS_HIGH();
002E D99A sbi 0x1b,1
0030 .dbline 54
0030 ; delay_1ms();
0030 0E940000 xcall _delay_1ms
0034 .dbline 55
0034 ; CS_LOW();
0034 D998 cbi 0x1b,1
0036 .dbline 56
0036 ; delay_1ms();
0036 0E940000 xcall _delay_1ms
003A .dbline 58
003A ; //16位命令字
003A ; for(i=0;i<16;i++)
003A 13C0 xjmp L9
003C L6:
003C .dbline 59
003C ; {
003C .dbline 60
003C ; SCK_LOW();
003C DA98 cbi 0x1b,2
003E .dbline 61
003E ; if((commond&0x8000)==0x8000)
003E C501 movw R24,R10
0040 8070 andi R24,0
0042 9078 andi R25,128
0044 8030 cpi R24,0
0046 E0E8 ldi R30,128
0048 9E07 cpc R25,R30
004A 11F4 brne L10
004C .dbline 62
004C ; SI_HIGH();
004C DB9A sbi 0x1b,3
004E 01C0 xjmp L11
0050 L10:
0050 .dbline 64
0050 ; else
0050 ; SI_LOW();
0050 DB98 cbi 0x1b,3
0052 L11:
0052 .dbline 65
0052 0E940000 xcall _delay_1ms
0056 .dbline 66
0056 DA9A sbi 0x1b,2
0058 .dbline 67
0058 0E940000 xcall _delay_1ms
005C .dbline 68
005C AA0C lsl R10
005E BB1C rol R11
0060 .dbline 69
0060 L7:
0060 .dbline 58
0060 4395 inc R20
0062 L9:
0062 .dbline 58
0062 4031 cpi R20,16
0064 58F3 brlo L6
0066 .dbline 71
0066 ; delay_1ms();
0066 ; SCK_HIGH();
0066 ; delay_1ms();
0066 ; commond=commond<<1;
0066 ; }
0066 ; //16位地址位
0066 ; for(i=0;i<16;i++)
0066 4427 clr R20
0068 13C0 xjmp L15
006A L12:
006A .dbline 72
006A ; {
006A .dbline 73
006A ; SCK_LOW();
006A DA98 cbi 0x1b,2
006C .dbline 74
006C ; if((address&0x8000)==0x8000)
006C CB01 movw R24,R22
006E 8070 andi R24,0
0070 9078 andi R25,128
0072 8030 cpi R24,0
0074 E0E8 ldi R30,128
0076 9E07 cpc R25,R30
0078 11F4 brne L16
007A .dbline 75
007A ; SI_HIGH();
007A DB9A sbi 0x1b,3
007C 01C0 xjmp L17
007E L16:
007E .dbline 77
007E ; else
007E ; SI_LOW();
007E DB98 cbi 0x1b,3
0080 L17:
0080 .dbline 78
0080 0E940000 xcall _delay_1ms
0084 .dbline 79
0084 DA9A sbi 0x1b,2
0086 .dbline 80
0086 0E940000 xcall _delay_1ms
008A .dbline 81
008A 660F lsl R22
008C 771F rol R23
008E .dbline 82
008E L13:
008E .dbline 71
008E 4395 inc R20
0090 L15:
0090 .dbline 71
0090 4031 cpi R20,16
0092 58F3 brlo L12
0094 .dbline 84
0094 ; delay_1ms();
0094 ; SCK_HIGH();
0094 ; delay_1ms();
0094 ; address=address<<1;
0094 ; }
0094 ; //32位任意位
0094 ; for(i=0;i<32;i++)
0094 4427 clr R20
0096 07C0 xjmp L21
0098 L18:
0098 .dbline 85
0098 .dbline 86
0098 DA98 cbi 0x1b,2
009A .dbline 87
009A 0E940000 xcall _delay_1ms
009E .dbline 88
009E DA9A sbi 0x1b,2
00A0 .dbline 89
00A0 0E940000 xcall _delay_1ms
00A4 .dbline 90
00A4 L19:
00A4 .dbline 84
00A4 4395 inc R20
00A6 L21:
00A6 .dbline 84
00A6 4032 cpi R20,32
00A8 B8F3 brlo L18
00AA .dbline -2
00AA L5:
00AA 0E940000 xcall pop_gset3
00AE .dbline 0 ; func end
00AE 0895 ret
00B0 .dbsym r i 20 c
00B0 .dbsym r address 22 i
00B0 .dbsym r commond 10 i
00B0 .dbend
00B0 .dbfunc e at4541_read _at4541_read fc
00B0 ; temp1 -> R20
00B0 ; temp2 -> R22
00B0 ; i -> R10
.even
00B0 _at4541_read::
00B0 0E940000 xcall push_gset3
00B4 .dbline -1
00B4 .dbline 99
00B4 ; {
00B4 ; SCK_LOW();
00B4 ; delay_1ms();
00B4 ; SCK_HIGH();
00B4 ; delay_1ms();
00B4 ; }
00B4 ; }
00B4 ;
00B4 ; /**************************************
00B4 ; ** 说明:读at45db41
00B4 ; ** 数据:在执行at4541_commond_send(发送读命令)之后,8位的数从SO输出
00B4 ; ** 输出:读出的一位数
00B4 ; **************************************/
00B4 ; unsigned char at4541_read(void)
00B4 ; {
00B4 .dbline 100
00B4 ; unsigned char i=0,temp1=0,temp2=0;
00B4 AA24 clr R10
00B6 .dbline 100
00B6 4427 clr R20
00B8 .dbline 100
00B8 6627 clr R22
00BA .dbline 102
00BA ; //读出8位,组合在temp2里
00BA ; for(i=0;i<8;i++)
00BA 14C0 xjmp L26
00BC L23:
00BC .dbline 103
00BC ; {
00BC .dbline 104
00BC ; SCK_LOW();
00BC DA98 cbi 0x1b,2
00BE .dbline 105
00BE ; delay_1ms();
00BE 0E940000 xcall _delay_1ms
00C2 .dbline 106
00C2 ; if(SO_PIN_HIGH)
00C2 89B3 in R24,0x19
00C4 8071 andi R24,16
00C6 8031 cpi R24,16
00C8 11F4 brne L27
00CA .dbline 107
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -