?? eeprom.lis
字號:
.module EEPROM.c
.area text(rom, con, rel)
0000 .dbfile C:/icc/include/AVR_PQ1A.h
0000 .dbfunc e Delayus _Delayus fV
0000 ; i -> R20,R21
0000 ; US -> R22,R23
.even
0000 _Delayus::
0000 0E940000 xcall push_gset2
0004 B801 movw R22,R16
0006 .dbline -1
0006 .dbline 28
0006 ; /*******************************************
0006 ; 文件:EEPROM.C
0006 ; 環境:編譯為ICC AVR6.25A,仿真為AVR Studio4.10
0006 ; 硬件:ATMEGA16芯片
0006 ; 日期:2006年12月10日
0006 ; 功能:實現MEGA16的EEPROM的讀和寫操作
0006 ; 備注:參考《AVR系列單片機C語言編程與應用實例》(清華大學出版社)
0006 ; /******************************************/
0006 ; #include <iom16v.h> //包含型號頭文件
0006 ; #include <macros.h> //包含"位"操作頭文件
0006 ; #include <stdio.h> //標準輸入輸出頭文件
0006 ; #include <AVR_PQ1A.h> //包含自定義常量頭文件
0006 ;
0006 ; /*******************************************
0006 ; 函數名稱: Eeprom_writeB
0006 ; 功 能: 向EEPROM中的指定地址寫入一個字節
0006 ; 參 數: eaddr--EEPROM的指定地址
0006 ; edata--寫入EEPROM的數據
0006 ; 返回值 : 無
0006 ; /********************************************/
0006 ; void Eeprom_writeB(uint eaddr,uchar edata)
0006 ; {
0006 ; SREG&=~BIT(7); //在寫入EEPROM期間應該關閉全局中斷,防止中斷打斷寫EEPROM的特殊時序
0006 ; while(EECR&BIT(EEWE)); //等待上次寫操作完畢
0006 ; EEAR=eaddr; //配置地址寄存器
0006 ; EEDR=edata; //配置數據寄存器
0006 ; EECR|=BIT(EEMWE); //主寫使能置高
0006 ; EECR|=BIT(EEWE); //EEMWE置高后,4個時鐘周期內將EEWE置高才能將數據寫入
0006 .dbline 30
0006 ; SREG|=BIT(7); //寫入完畢后,開放全局中斷
0006 ; }
0006 05E0 ldi R16,5
0008 10E0 ldi R17,0
000A 9B01 movw R18,R22
000C 0E940000 xcall empy16s
0010 B801 movw R22,R16
0012 7695 lsr R23
0014 6795 ror R22
0016 7695 lsr R23
0018 6795 ror R22
001A .dbline 31
001A 4427 clr R20
001C 5527 clr R21
001E 02C0 xjmp L5
0020 L2:
0020 .dbline 31
0020 L3:
0020 .dbline 31
0020 4F5F subi R20,255 ; offset = 1
0022 5F4F sbci R21,255
0024 L5:
0024 .dbline 31
0024 ; /*******************************************
0024 4617 cp R20,R22
0026 5707 cpc R21,R23
0028 D8F3 brlo L2
002A .dbline -2
002A .dbline 32
002A ; 函數名稱: Eeprom_readB
002A L1:
002A 0E940000 xcall pop_gset2
002E .dbline 0 ; func end
002E 0895 ret
0030 .dbsym r i 20 i
0030 .dbsym r US 22 i
0030 .dbend
0030 .dbfunc e Delayms _Delayms fV
0030 ; i -> R20,R21
0030 ; j -> R22,R23
0030 ; MS -> R16,R17
.even
0030 _Delayms::
0030 0E940000 xcall push_gset2
0034 .dbline -1
0034 .dbline 40
0034 ; 功 能: 從EEPROM中的指定地址讀出一個字節
0034 ; 參 數: eaddr--EEPROM的指定地址
0034 ; 返回值 : edata--讀出的EEPROM數據
0034 ; /********************************************/
0034 ; uchar Eeprom_readB(uint eaddr)
0034 ; {
0034 ; uchar edata;
0034 ; while(EECR&BIT(EEWE)); //等待上次寫操作完畢
0034 .dbline 42
0034 ; EEAR=eaddr; //配置地址寄存器
0034 ; EECR|=BIT(EERE); //讀使能置高
0034 4427 clr R20
0036 5527 clr R21
0038 0BC0 xjmp L10
003A L7:
003A .dbline 43
003A 6627 clr R22
003C 7727 clr R23
003E 02C0 xjmp L14
0040 L11:
0040 .dbline 43
0040 L12:
0040 .dbline 43
0040 6F5F subi R22,255 ; offset = 1
0042 7F4F sbci R23,255
0044 L14:
0044 .dbline 43
0044 6537 cpi R22,117
0046 E4E0 ldi R30,4
0048 7E07 cpc R23,R30
004A D0F3 brlo L11
004C L8:
004C .dbline 42
004C 4F5F subi R20,255 ; offset = 1
004E 5F4F sbci R21,255
0050 L10:
0050 .dbline 42
0050 4017 cp R20,R16
0052 5107 cpc R21,R17
0054 90F3 brlo L7
0056 .dbline -2
0056 .dbline 44
0056 ; edata=EEDR; //讀出數據
0056 ; return edata; //返回讀出的數據
0056 L6:
0056 0E940000 xcall pop_gset2
005A .dbline 0 ; func end
005A 0895 ret
005C .dbsym r i 20 i
005C .dbsym r j 22 i
005C .dbsym r MS 16 i
005C .dbend
005C .dbfunc e Board_init _Board_init fV
.even
005C _Board_init::
005C .dbline -1
005C .dbline 52
005C ; }
005C ; /*******************************************
005C ; 函數名稱: main
005C ; 功 能: 實現EEPROM的0-254地址單元寫入0-254,然后讀出
005C ; 參 數: 無
005C ; 返回值 : 無
005C ; /********************************************/
005C ; void main(void)
005C .dbline 53
005C ; {
005C 8FEF ldi R24,255
005E 8ABB out 0x1a,R24
0060 .dbline 54
0060 ; uchar i;
0060 87BB out 0x17,R24
0062 .dbline 55
0062 ; Board_init( ); //初始化開發板
0062 84BB out 0x14,R24
0064 .dbline 56
0064 ; for(i=0;i<255;i++) //連續寫入
0064 81BB out 0x11,R24
0066 .dbline 58
0066 ; {
0066 ; Eeprom_writeB(i,i);
0066 2224 clr R2
0068 2DB8 out 0xd,R2
006A .dbline 60
006A ; }
006A ; for(i=0;i<255;i++) //連續讀出
006A DE9A sbi 0x1b,6
006C .dbline 61
006C ; {
006C AE98 cbi 0x15,6
006E .dbline 62
006E ; Eeprom_readB(i);
006E D998 cbi 0x1b,1
0070 .dbline 63
0070 ; }
0070 88BB out 0x18,R24
0072 .dbline 64
0072 ; }
0072 DA9A sbi 0x1b,2
0074 .dbline 65
0074 ; }
0074 05E0 ldi R16,5
0076 10E0 ldi R17,0
0078 C3DF xcall _Delayus
007A .dbline 66
007A ; }
007A DA98 cbi 0x1b,2
007C .dbline 68
007C ; }
007C ; }
007C 2224 clr R2
007E 28BA out 0x18,R2
0080 .dbline 69
0080 ; }
0080 DB9A sbi 0x1b,3
0082 .dbline 70
0082 ; }
0082 02E3 ldi R16,50
0084 10E0 ldi R17,0
0086 BCDF xcall _Delayus
0088 .dbline 71
0088 ; }
0088 DB98 cbi 0x1b,3
008A .dbline 73
008A ; }
008A ; }
008A 8FEF ldi R24,255
008C 88BB out 0x18,R24
008E .dbline 74
008E ; }
008E DC9A sbi 0x1b,4
0090 .dbline 75
0090 ; }
0090 02E3 ldi R16,50
0092 10E0 ldi R17,0
0094 B5DF xcall _Delayus
0096 .dbline 76
0096 ; }
0096 DC98 cbi 0x1b,4
0098 .dbline 78
0098 ; }
0098 ; }
0098 8FEF ldi R24,255
009A 82BB out 0x12,R24
009C .dbline 79
009C ; }
009C DF9A sbi 0x1b,7
009E .dbline 80
009E ; }
009E 02E3 ldi R16,50
00A0 10E0 ldi R17,0
00A2 AEDF xcall _Delayus
00A4 .dbline 81
00A4 ; }
00A4 DF98 cbi 0x1b,7
00A6 .dbline -2
00A6 .dbline 84
00A6 ; }
00A6 ; }
00A6 ; }
00A6 L15:
00A6 .dbline 0 ; func end
00A6 0895 ret
00A8 .dbend
00A8 .dbfile C:\icc\examples.avr\AVR_PQ1A_DEMO\18_EEPROM\EEPROM.c
00A8 .dbfunc e Eeprom_writeB _Eeprom_writeB fV
00A8 ; edata -> R18
00A8 ; eaddr -> R16,R17
.even
00A8 _Eeprom_writeB::
00A8 .dbline -1
00A8 .dbline 22
00A8 .dbline 23
00A8 F894 bclr 7
00AA L17:
00AA .dbline 24
00AA L18:
00AA .dbline 24
00AA E199 sbic 0x1c,1
00AC FECF rjmp L17
00AE .dbline 25
00AE 10933F00 sts 62+1,R17
00B2 00933E00 sts 62,R16
00B6 .dbline 26
00B6 2DBB out 0x1d,R18
00B8 .dbline 27
00B8 E29A sbi 0x1c,2
00BA .dbline 28
00BA E19A sbi 0x1c,1
00BC .dbline 29
00BC 7894 bset 7
00BE .dbline -2
00BE .dbline 30
00BE L16:
00BE .dbline 0 ; func end
00BE 0895 ret
00C0 .dbsym r edata 18 c
00C0 .dbsym r eaddr 16 i
00C0 .dbend
00C0 .dbfunc e Eeprom_readB _Eeprom_readB fc
00C0 ; edata -> R20
00C0 ; eaddr -> R16,R17
.even
00C0 _Eeprom_readB::
00C0 0E940000 xcall push_gset1
00C4 .dbline -1
00C4 .dbline 38
00C4 L21:
00C4 .dbline 40
00C4 L22:
00C4 .dbline 40
00C4 E199 sbic 0x1c,1
00C6 FECF rjmp L21
00C8 .dbline 41
00C8 10933F00 sts 62+1,R17
00CC 00933E00 sts 62,R16
00D0 .dbline 42
00D0 E09A sbi 0x1c,0
00D2 .dbline 43
00D2 4DB3 in R20,0x1d
00D4 .dbline 44
00D4 042F mov R16,R20
00D6 .dbline -2
00D6 L20:
00D6 0E940000 xcall pop_gset1
00DA .dbline 0 ; func end
00DA 0895 ret
00DC .dbsym r edata 20 c
00DC .dbsym r eaddr 16 i
00DC .dbend
00DC .dbfunc e main _main fV
00DC ; i -> R20
.even
00DC _main::
00DC .dbline -1
00DC .dbline 53
00DC .dbline 55
00DC BFDF xcall _Board_init
00DE .dbline 56
00DE 4427 clr R20
00E0 05C0 xjmp L28
00E2 L25:
00E2 .dbline 57
00E2 .dbline 58
00E2 242F mov R18,R20
00E4 042F mov R16,R20
00E6 1127 clr R17
00E8 DFDF xcall _Eeprom_writeB
00EA .dbline 59
00EA L26:
00EA .dbline 56
00EA 4395 inc R20
00EC L28:
00EC .dbline 56
00EC 4F3F cpi R20,255
00EE C8F3 brlo L25
00F0 .dbline 60
00F0 4427 clr R20
00F2 04C0 xjmp L32
00F4 L29:
00F4 .dbline 61
00F4 .dbline 62
00F4 042F mov R16,R20
00F6 1127 clr R17
00F8 E3DF xcall _Eeprom_readB
00FA .dbline 63
00FA L30:
00FA .dbline 60
00FA 4395 inc R20
00FC L32:
00FC .dbline 60
00FC 4F3F cpi R20,255
00FE D0F3 brlo L29
0100 .dbline -2
0100 .dbline 64
0100 L24:
0100 .dbline 0 ; func end
0100 0895 ret
0102 .dbsym r i 20 c
0102 .dbend
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -