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

📄 13eep.lst

📁 用AVR单片机做的一些程序,包括跑马灯显示,PWM产生,ADC转换等
💻 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 + -