📄 13eep.lst
字号:
__text_start:
__start:
0046 EFCF LDI R28,0xFF
0047 E1D0 LDI R29,0x10
0048 BFCD OUT 0x3D,R28
0049 BFDE OUT 0x3E,R29
004A 51C0 SUBI R28,0x10
004B 40D0 SBCI R29,0
004C EA0A LDI R16,0xAA
004D 8308 STD Y+0,R16
004E 2400 CLR R0
004F E0E0 LDI R30,0
0050 E0F1 LDI R31,1
0051 E011 LDI R17,1
0052 30E0 CPI R30,0
0053 07F1 CPC R31,R17
0054 F011 BEQ 0x0057
0055 9201 ST R0,Z+
0056 CFFB RJMP 0x0052
0057 8300 STD Z+0,R16
0058 E8EC LDI R30,0x8C
0059 E0F0 LDI R31,0
005A E0A0 LDI R26,0
005B E0B1 LDI R27,1
005C E010 LDI R17,0
005D 38EC CPI R30,0x8C
005E 07F1 CPC R31,R17
005F F021 BEQ 0x0064
0060 95C8 LPM
0061 9631 ADIW R30,1
0062 920D ST R0,X+
0063 CFF9 RJMP 0x005D
0064 940E00BE CALL _main
_exit:
0066 CFFF RJMP _exit
_delay_ms:
a --> R20
b --> R22
i --> R16
0067 940E00E4 CALL push_gset2
FILE: E:\ICCAVR\project\AVRMEG~3\icc\013-EEPROM-LED\main.c
(0001) /*
(0002) 实验十三:
(0003)
(0004) 片内EEPROM读写实险。
(0005) 1、用内部EEPROM记录CPU启动次数,并在PB口上显示出来。
(0006) 2、内部1 M晶振,程序采用单任务方式,软件延时。
(0007) 3、进行此实验请插上LED短路块。
(0008) 4、通过此实验,可以对对内部EEPROM有个初步认识,了解EEPROM函数的操作。
(0009) 5、可过复位键让系统重启,这样就可以更新显示了。
(0010) 6、EEPORM读写函数可以嵌入到项目当中直接使用。
(0011)
(0012) AVR mega128学习板
(0013) www.iccavr.com 阿发
(0014) 14:42 2007-10-19
(0015) */
(0016)
(0017) #include "iom128v.h"
(0018)
(0019) /*延时函数*/
(0020) void delay_ms(unsigned char i) {
(0021)
(0022) unsigned char a, b;
(0023) for (a = 0; a < i; a++) {
0069 2744 CLR R20
006A C006 RJMP 0x0071
(0024) for (b = 1; b; b++);
006B E061 LDI R22,1
006C C001 RJMP 0x006E
006D 9563 INC R22
006E 2366 TST R22
006F F7E9 BNE 0x006D
0070 9543 INC R20
0071 1740 CP R20,R16
0072 F3C0 BCS 0x006B
0073 940E00DB CALL pop_gset2
0075 9508 RET
_eprom_read:
p_buff --> R20
number --> R18
addr --> R16
0076 940E00E6 CALL push_gset1
0078 814A LDD R20,Y+2
0079 815B LDD R21,Y+3
(0025) }
(0026) }
(0027)
(0028) /*EEPROM读取函数*/
(0029) /*addr:地址;number:长度;p_buff:读出数据存放指针*/
(0030) void eprom_read(unsigned int addr, unsigned char number, unsigned char *p_buff) {
(0031)
(0032) while(EECR & (1 << EEWE)); /* 等待上一次写操作结束 */
007A 99E1 SBIC 0x1C,1
007B CFFE RJMP 0x007A
007C C00A RJMP 0x0087
(0033)
(0034) while(number --) {
(0035) EEAR = addr ++; /* 设置地址寄存器 */
007D 0118 MOVW R2,R16
007E 5F0F SUBI R16,0xFF
007F 4F1F SBCI R17,0xFF
0080 BA3F OUT 0x1F,R3
0081 BA2E OUT 0x1E,R2
(0036) EECR |= (1 << EERE); /* 置位EERE 读使能 */
0082 9AE0 SBI 0x1C,0
(0037) *p_buff++ = EEDR;
0083 B22D IN R2,0x1D
0084 01FA MOVW R30,R20
0085 9221 ST R2,Z+
0086 01AF MOVW R20,R30
0087 2E22 MOV R2,R18
0088 2433 CLR R3
0089 5021 SUBI R18,1
008A 2022 TST R2
008B F789 BNE 0x007D
008C 940E00E9 CALL pop_gset1
008E 9508 RET
_eprom_write:
p_buff --> R20
number --> R18
addr --> R16
008F 940E00E6 CALL push_gset1
0091 814A LDD R20,Y+2
0092 815B LDD R21,Y+3
(0038) }
(0039) }
(0040)
(0041) /*EEPROM写入函数*/
(0042) /*addr:地址;number:长度;p_buff:写入数据存放指针*/
(0043) void eprom_write(unsigned int addr, unsigned char number, unsigned char *p_buff) {
0093 C00D RJMP 0x00A1
(0044)
(0045) while(number --) {
(0046) while(EECR & (1 << EEWE)); /* 等待上一次写操作结束 */
0094 99E1 SBIC 0x1C,1
0095 CFFE RJMP 0x0094
(0047) EEAR = addr ++; /* 设置地址寄存器 */
0096 0118 MOVW R2,R16
0097 5F0F SUBI R16,0xFF
0098 4F1F SBCI R17,0xFF
0099 BA3F OUT 0x1F,R3
009A BA2E OUT 0x1E,R2
(0048) EEDR = *p_buff ++; /* 设置数据寄存器 */
009B 01FA MOVW R30,R20
009C 9021 LD R2,Z+
009D 01AF MOVW R20,R30
009E BA2D OUT 0x1D,R2
(0049) EECR |= (1 << EEMWE); /* 置位EEMWE 主机写使能*/
009F 9AE2 SBI 0x1C,2
(0050) EECR |= (1 << EEWE); /* 置位EEWE 写使能*/
00A0 9AE1 SBI 0x1C,1
00A1 2E22 MOV R2,R18
00A2 2433 CLR R3
00A3 5021 SUBI R18,1
00A4 2022 TST R2
00A5 F771 BNE 0x0094
00A6 940E00E9 CALL pop_gset1
00A8 9508 RET
(0051) }
(0052) }
(0053)
(0054) /*IO口初始化函数*/
(0055) void io_init(void) {
(0056)
(0057) DDRA = 0x00; /*方向输入*/
_io_init:
00A9 2422 CLR R2
00AA BA2A OUT 0x1A,R2
(0058) PORTA = 0xFF; /*打开上拉*/
00AB EF8F LDI R24,0xFF
00AC BB8B OUT 0x1B,R24
(0059) DDRB = 0xFF; /*方向输出*/
00AD BB87 OUT 0x17,R24
(0060) PORTB = 0xFF; /*输出高电平*/
00AE BB88 OUT 0x18,R24
(0061) DDRC = 0x00; /*不用的IO口建议设置为输入带上拉*/
00AF BA24 OUT 0x14,R2
(0062) PORTC = 0xFF;
00B0 BB85 OUT 0x15,R24
(0063) DDRD = 0x00;
00B1 BA21 OUT 0x11,R2
(0064) PORTD = 0xFF;
00B2 BB82 OUT 0x12,R24
(0065) DDRE = 0x00;
00B3 B822 OUT 0x02,R2
(0066) PORTE = 0xFF;
00B4 B983 OUT 0x03,R24
(0067) DDRF = 0x00;
00B5 92200061 STS 0x61,R2
(0068) PORTF = 0xFF;
00B7 93800062 STS 0x62,R24
(0069) DDRG = 0x00;
00B9 92200064 STS 0x64,R2
(0070) PORTG = 0xFF;
00BB 93800065 STS 0x65,R24
00BD 9508 RET
_main:
temp --> Y+2
00BE 9723 SBIW R28,3
(0071) }
(0072)
(0073) /*主函数*/
(0074) void main(void) {
(0075)
(0076) unsigned char temp;
(0077)
(0078) io_init();
00BF DFE9 RCALL _io_init
(0079) delay_ms(250); /*启动延时*/
00C0 EF0A LDI R16,0xFA
00C1 DFA5 RCALL _delay_ms
(0080) eprom_read(0x10, 0x01, &temp); /*读出记录*/
00C2 01CE MOVW R24,R28
00C3 9602 ADIW R24,2
00C4 8399 STD Y+1,R25
00C5 8388 STD Y+0,R24
00C6 E021 LDI R18,1
00C7 E100 LDI R16,0x10
00C8 E010 LDI R17,0
00C9 DFAC RCALL _eprom_read
(0081) PORTB = ~temp; /*显示记录*/
00CA 802A LDD R2,Y+2
00CB 9420 COM R2
00CC BA28 OUT 0x18,R2
(0082) temp ++; /*刷新记录*/
00CD 818A LDD R24,Y+2
00CE 5F8F SUBI R24,0xFF
00CF 838A STD Y+2,R24
(0083) eprom_write(0x10, 0x01, &temp); /*写入记录*/
00D0 01CE MOVW R24,R28
00D1 9602 ADIW R24,2
00D2 8399 STD Y+1,R25
00D3 8388 STD Y+0,R24
00D4 E021 LDI R18,1
00D5 E100 LDI R16,0x10
00D6 E010 LDI R17,0
00D7 DFB7 RCALL _eprom_write
(0084)
(0085) while (1) {
FILE: <library>
00D8 CFFF RJMP 0x00D8
00D9 9623 ADIW R28,3
00DA 9508 RET
pop_gset2:
00DB E0E2 LDI R30,2
00DC 940C00EA JMP pop
push_gset5:
00DE 92FA ST R15,-Y
00DF 92EA ST R14,-Y
push_gset4:
00E0 92DA ST R13,-Y
00E1 92CA ST R12,-Y
push_gset3:
00E2 92BA ST R11,-Y
00E3 92AA ST R10,-Y
push_gset2:
00E4 937A ST R23,-Y
00E5 936A ST R22,-Y
push_gset1:
00E6 935A ST R21,-Y
00E7 934A ST R20,-Y
00E8 9508 RET
pop_gset1:
00E9 E0E1 LDI R30,1
pop:
00EA 9149 LD R20,Y+
00EB 9159 LD R21,Y+
00EC FDE0 SBRC R30,0
00ED 9508 RET
00EE 9169 LD R22,Y+
00EF 9179 LD R23,Y+
00F0 FDE1 SBRC R30,1
00F1 9508 RET
00F2 90A9 LD R10,Y+
00F3 90B9 LD R11,Y+
00F4 FDE2 SBRC R30,2
00F5 9508 RET
00F6 90C9 LD R12,Y+
00F7 90D9 LD R13,Y+
00F8 FDE3 SBRC R30,3
00F9 9508 RET
00FA 90E9 LD R14,Y+
00FB 90F9 LD R15,Y+
00FC 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -