📄 main.lis
字号:
.module main.c
.area text(rom, con, rel)
0000 .dbfile E:\ICCAVR\project\AVRMEG~3\icc\013-EEPROM-LED\main.c
0000 .dbfunc e delay_ms _delay_ms fV
0000 ; a -> R20
0000 ; b -> R22
0000 ; i -> R16
.even
0000 _delay_ms::
0000 0E940000 xcall push_gset2
0004 .dbline -1
0004 .dbline 20
0004 ; /*
0004 ; 实验十三:
0004 ;
0004 ; 片内EEPROM读写实险。
0004 ; 1、用内部EEPROM记录CPU启动次数,并在PB口上显示出来。
0004 ; 2、内部1 M晶振,程序采用单任务方式,软件延时。
0004 ; 3、进行此实验请插上LED短路块。
0004 ; 4、通过此实验,可以对对内部EEPROM有个初步认识,了解EEPROM函数的操作。
0004 ; 5、可过复位键让系统重启,这样就可以更新显示了。
0004 ; 6、EEPORM读写函数可以嵌入到项目当中直接使用。
0004 ;
0004 ; AVR mega128学习板
0004 ; www.iccavr.com 阿发
0004 ; 14:42 2007-10-19
0004 ; */
0004 ;
0004 ; #include "iom128v.h"
0004 ;
0004 ; /*延时函数*/
0004 ; void delay_ms(unsigned char i) {
0004 .dbline 23
0004 4427 clr R20
0006 06C0 xjmp L5
0008 L2:
0008 .dbline 23
0008 ;
0008 ; unsigned char a, b;
0008 ; for (a = 0; a < i; a++) {
0008 .dbline 24
0008 61E0 ldi R22,1
000A 01C0 xjmp L9
000C L6:
000C .dbline 24
000C L7:
000C .dbline 24
000C 6395 inc R22
000E L9:
000E .dbline 24
000E 6623 tst R22
0010 E9F7 brne L6
0012 .dbline 25
0012 L3:
0012 .dbline 23
0012 4395 inc R20
0014 L5:
0014 .dbline 23
0014 4017 cp R20,R16
0016 C0F3 brlo L2
0018 .dbline -2
0018 L1:
0018 0E940000 xcall pop_gset2
001C .dbline 0 ; func end
001C 0895 ret
001E .dbsym r a 20 c
001E .dbsym r b 22 c
001E .dbsym r i 16 c
001E .dbend
001E .dbfunc e eprom_read _eprom_read fV
001E ; p_buff -> R20,R21
001E ; number -> R18
001E ; addr -> R16,R17
.even
001E _eprom_read::
001E 0E940000 xcall push_gset1
0022 4A81 ldd R20,y+2
0024 5B81 ldd R21,y+3
0026 .dbline -1
0026 .dbline 30
0026 ; for (b = 1; b; b++);
0026 ; }
0026 ; }
0026 ;
0026 ; /*EEPROM读取函数*/
0026 ; /*addr:地址;number:长度;p_buff:读出数据存放指针*/
0026 ; void eprom_read(unsigned int addr, unsigned char number, unsigned char *p_buff) {
0026 L11:
0026 .dbline 32
0026 L12:
0026 .dbline 32
0026 ;
0026 ; while(EECR & (1 << EEWE)); /* 等待上一次写操作结束 */
0026 E199 sbic 0x1c,1
0028 FECF rjmp L11
002A 0AC0 xjmp L15
002C L14:
002C .dbline 34
002C .dbline 35
002C 1801 movw R2,R16
002E 0F5F subi R16,255 ; offset = 1
0030 1F4F sbci R17,255
0032 3FBA out 0x1f,R3
0034 2EBA out 0x1e,R2
0036 .dbline 36
0036 E09A sbi 0x1c,0
0038 .dbline 37
0038 2DB2 in R2,0x1d
003A FA01 movw R30,R20
003C 2192 st Z+,R2
003E AF01 movw R20,R30
0040 .dbline 38
0040 L15:
0040 .dbline 34
0040 ;
0040 ; while(number --) {
0040 222E mov R2,R18
0042 3324 clr R3
0044 2150 subi R18,1
0046 2220 tst R2
0048 89F7 brne L14
004A .dbline -2
004A L10:
004A 0E940000 xcall pop_gset1
004E .dbline 0 ; func end
004E 0895 ret
0050 .dbsym r p_buff 20 pc
0050 .dbsym r number 18 c
0050 .dbsym r addr 16 i
0050 .dbend
0050 .dbfunc e eprom_write _eprom_write fV
0050 ; p_buff -> R20,R21
0050 ; number -> R18
0050 ; addr -> R16,R17
.even
0050 _eprom_write::
0050 0E940000 xcall push_gset1
0054 4A81 ldd R20,y+2
0056 5B81 ldd R21,y+3
0058 .dbline -1
0058 .dbline 43
0058 ; EEAR = addr ++; /* 设置地址寄存器 */
0058 ; EECR |= (1 << EERE); /* 置位EERE 读使能 */
0058 ; *p_buff++ = EEDR;
0058 ; }
0058 ; }
0058 ;
0058 ; /*EEPROM写入函数*/
0058 ; /*addr:地址;number:长度;p_buff:写入数据存放指针*/
0058 ; void eprom_write(unsigned int addr, unsigned char number, unsigned char *p_buff) {
0058 0DC0 xjmp L19
005A X0:
005A .dbline 45
005A ;
005A ; while(number --) {
005A L21:
005A .dbline 46
005A L22:
005A .dbline 46
005A E199 sbic 0x1c,1
005C FECF rjmp L21
005E .dbline 47
005E 1801 movw R2,R16
0060 0F5F subi R16,255 ; offset = 1
0062 1F4F sbci R17,255
0064 3FBA out 0x1f,R3
0066 2EBA out 0x1e,R2
0068 .dbline 48
0068 FA01 movw R30,R20
006A 2190 ld R2,Z+
006C AF01 movw R20,R30
006E 2DBA out 0x1d,R2
0070 .dbline 49
0070 E29A sbi 0x1c,2
0072 .dbline 50
0072 E19A sbi 0x1c,1
0074 .dbline 51
0074 L19:
0074 .dbline 45
0074 222E mov R2,R18
0076 3324 clr R3
0078 2150 subi R18,1
007A 2220 tst R2
007C 71F7 brne L22
007E .dbline -2
007E L17:
007E 0E940000 xcall pop_gset1
0082 .dbline 0 ; func end
0082 0895 ret
0084 .dbsym r p_buff 20 pc
0084 .dbsym r number 18 c
0084 .dbsym r addr 16 i
0084 .dbend
0084 .dbfunc e io_init _io_init fV
.even
0084 _io_init::
0084 .dbline -1
0084 .dbline 55
0084 ; while(EECR & (1 << EEWE)); /* 等待上一次写操作结束 */
0084 ; EEAR = addr ++; /* 设置地址寄存器 */
0084 ; EEDR = *p_buff ++; /* 设置数据寄存器 */
0084 ; EECR |= (1 << EEMWE); /* 置位EEMWE 主机写使能*/
0084 ; EECR |= (1 << EEWE); /* 置位EEWE 写使能*/
0084 ; }
0084 ; }
0084 ;
0084 ; /*IO口初始化函数*/
0084 ; void io_init(void) {
0084 .dbline 57
0084 ;
0084 ; DDRA = 0x00; /*方向输入*/
0084 2224 clr R2
0086 2ABA out 0x1a,R2
0088 .dbline 58
0088 ; PORTA = 0xFF; /*打开上拉*/
0088 8FEF ldi R24,255
008A 8BBB out 0x1b,R24
008C .dbline 59
008C ; DDRB = 0xFF; /*方向输出*/
008C 87BB out 0x17,R24
008E .dbline 60
008E ; PORTB = 0xFF; /*输出高电平*/
008E 88BB out 0x18,R24
0090 .dbline 61
0090 ; DDRC = 0x00; /*不用的IO口建议设置为输入带上拉*/
0090 24BA out 0x14,R2
0092 .dbline 62
0092 ; PORTC = 0xFF;
0092 85BB out 0x15,R24
0094 .dbline 63
0094 ; DDRD = 0x00;
0094 21BA out 0x11,R2
0096 .dbline 64
0096 ; PORTD = 0xFF;
0096 82BB out 0x12,R24
0098 .dbline 65
0098 ; DDRE = 0x00;
0098 22B8 out 0x2,R2
009A .dbline 66
009A ; PORTE = 0xFF;
009A 83B9 out 0x3,R24
009C .dbline 67
009C ; DDRF = 0x00;
009C 20926100 sts 97,R2
00A0 .dbline 68
00A0 ; PORTF = 0xFF;
00A0 80936200 sts 98,R24
00A4 .dbline 69
00A4 ; DDRG = 0x00;
00A4 20926400 sts 100,R2
00A8 .dbline 70
00A8 ; PORTG = 0xFF;
00A8 80936500 sts 101,R24
00AC .dbline -2
00AC L24:
00AC .dbline 0 ; func end
00AC 0895 ret
00AE .dbend
00AE .dbfunc e main _main fV
00AE ; temp -> y+2
.even
00AE _main::
00AE 2397 sbiw R28,3
00B0 .dbline -1
00B0 .dbline 74
00B0 ; }
00B0 ;
00B0 ; /*主函数*/
00B0 ; void main(void) {
00B0 .dbline 78
00B0 ;
00B0 ; unsigned char temp;
00B0 ;
00B0 ; io_init();
00B0 E9DF xcall _io_init
00B2 .dbline 79
00B2 ; delay_ms(250); /*启动延时*/
00B2 0AEF ldi R16,250
00B4 A5DF xcall _delay_ms
00B6 .dbline 80
00B6 ; eprom_read(0x10, 0x01, &temp); /*读出记录*/
00B6 CE01 movw R24,R28
00B8 0296 adiw R24,2
00BA 9983 std y+1,R25
00BC 8883 std y+0,R24
00BE 21E0 ldi R18,1
00C0 00E1 ldi R16,16
00C2 10E0 ldi R17,0
00C4 ACDF xcall _eprom_read
00C6 .dbline 81
00C6 ; PORTB = ~temp; /*显示记录*/
00C6 2A80 ldd R2,y+2
00C8 2094 com R2
00CA 28BA out 0x18,R2
00CC .dbline 82
00CC ; temp ++; /*刷新记录*/
00CC 8A81 ldd R24,y+2
00CE 8F5F subi R24,255 ; addi 1
00D0 8A83 std y+2,R24
00D2 .dbline 83
00D2 ; eprom_write(0x10, 0x01, &temp); /*写入记录*/
00D2 CE01 movw R24,R28
00D4 0296 adiw R24,2
00D6 9983 std y+1,R25
00D8 8883 std y+0,R24
00DA 21E0 ldi R18,1
00DC 00E1 ldi R16,16
00DE 10E0 ldi R17,0
00E0 B7DF xcall _eprom_write
00E2 L26:
00E2 .dbline 85
00E2 .dbline 86
00E2 .dbline 87
00E2 L27:
00E2 .dbline 85
00E2 FFCF xjmp L26
00E4 X1:
00E4 .dbline -2
00E4 L25:
00E4 2396 adiw R28,3
00E6 .dbline 0 ; func end
00E6 0895 ret
00E8 .dbsym l temp 2 c
00E8 .dbend
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -