📄 eeprom.lst
字号:
__text_start:
__start:
0030 E5CF LDI R28,0x5F
0031 E0D4 LDI R29,4
0032 BFCD OUT P3D,R28
0033 BFDE OUT P3E,R29
0034 51C0 SUBI R28,0x10
0035 40D0 SBCI R29,0
0036 EA0A LDI R16,0xAA
0037 8308 STD R16,0+Y
0038 2400 CLR R0
0039 E6E0 LDI R30,0x60
003A E0F0 LDI R31,0
003B E010 LDI R17,0
003C 36E0 CPI R30,0x60
003D 07F1 CPC R31,R17
003E F011 BEQ 0x0041
003F 9201 ST R0,Z+
0040 CFFB RJMP 0x003C
0041 8300 STD R16,0+Z
0042 E6E0 LDI R30,0x60
0043 E0F0 LDI R31,0
0044 E6A0 LDI R26,0x60
0045 E0B0 LDI R27,0
0046 E010 LDI R17,0
0047 36E0 CPI R30,0x60
0048 07F1 CPC R31,R17
0049 F021 BEQ 0x004E
004A 95C8 LPM
004B 9631 ADIW R30,1
004C 920D ST R0,X+
004D CFF9 RJMP 0x0047
004E 940E00BF CALL _main
_exit:
0050 CFFF RJMP _exit
_Delayus:
i --> R20
US --> R22
0051 940E00F9 CALL push_gset2
0053 01B8 MOVW R22,R16
FILE: C:\icc\include\AVR_PQ1A.h
(0001) /*******************************************
(0002) 文件:AVR_PQ1A.H
(0003) 功能:定义一些AVR_PQ1A开发板上应用程序用到的常量
(0004) /******************************************/
(0005)
(0006) #include <iom16v.h> //包含型号头文件
(0007) #include <macros.h> //包含"位"操作头文件
(0008)
(0009) /******************数据类型宏定义******************/
(0010) #define uchar unsigned char
(0011) #define uint unsigned int
(0012)
(0013) /******************数码管和LED常量******************/
(0014) #define LEDLK PA2 //LED锁存器控制端
(0015) #define SEGLK PA3 //数码管段选锁存器控制端
(0016) #define BITLK PA4 //数码管位选锁存器控制端
(0017)
(0018) #define TRUE 1
(0019) #define FALSE 0
(0020) #define ALLLED 0XFF
(0021) /*******************************************
(0022) 函数名称: Delayus
(0023) 功 能: 延时指定微秒(8M晶振)
(0024) 参 数: US--延时的微秒数(大约,不是很精确,MS越大越准确)
(0025) 返回值 : 无
(0026) /********************************************/
(0027) void Delayus(uint US)
(0028) {
(0029) uint i;
(0030) US=US*5/4; //5/4是在8MHz晶振下,通过软件仿真反复实验得到的数值
0054 E005 LDI R16,5
0055 E010 LDI R17,0
0056 019B MOVW R18,R22
0057 940E00D2 CALL empy16s
0059 01B8 MOVW R22,R16
005A 9576 LSR R23
005B 9567 ROR R22
005C 9576 LSR R23
005D 9567 ROR R22
(0031) for( i=0;i<US;i++);
005E 2744 CLR R20
005F 2755 CLR R21
0060 C002 RJMP 0x0063
0061 5F4F SUBI R20,0xFF
0062 4F5F SBCI R21,0xFF
0063 1746 CP R20,R22
0064 0757 CPC R21,R23
0065 F3D8 BCS 0x0061
(0032) }
0066 940E00FD CALL pop_gset2
0068 9508 RET
_Delayms:
i --> R20
j --> R22
MS --> R16
0069 940E00F9 CALL push_gset2
(0033) /*******************************************
(0034) 函数名称: Delayms
(0035) 功 能: 延时指定毫秒(8M晶振)
(0036) 参 数: MS--延时的毫秒数
(0037) 返回值 : 无
(0038) /********************************************/
(0039) void Delayms(uint MS)
(0040) {
(0041) uint i,j;
(0042) for( i=0;i<MS;i++)
006B 2744 CLR R20
006C 2755 CLR R21
006D C00B RJMP 0x0079
(0043) for(j=0;j<1141;j++); //1141是在8MHz晶振下,通过软件仿真反复实验得到的数值
006E 2766 CLR R22
006F 2777 CLR R23
0070 C002 RJMP 0x0073
0071 5F6F SUBI R22,0xFF
0072 4F7F SBCI R23,0xFF
0073 3765 CPI R22,0x75
0074 E0E4 LDI R30,4
0075 077E CPC R23,R30
0076 F3D0 BCS 0x0071
0077 5F4F SUBI R20,0xFF
0078 4F5F SBCI R21,0xFF
0079 1740 CP R20,R16
007A 0751 CPC R21,R17
007B F390 BCS 0x006E
(0044) }
007C 940E00FD CALL pop_gset2
007E 9508 RET
(0045) /*******************************************
(0046) 函数名称: Board_init
(0047) 功 能: 初始化实验板,关闭全部功能
(0048) 参 数: 无
(0049) 返回值 : 无
(0050) /********************************************/
(0051) void Board_init(void)
(0052) {
(0053) DDRA=0xFF; //将四个IO口全部配置为输出
_Board_init:
007F EF8F LDI R24,0xFF
0080 BB8A OUT P1A,R24
(0054) DDRB=0xFF;
0081 BB87 OUT P17,R24
(0055) DDRC=0xFF;
0082 BB84 OUT P14,R24
(0056) DDRD=0xFF;
0083 BB81 OUT P11,R24
(0057)
(0058) SPCR=0x00; //还原SPI口,使其为正常端口
0084 2422 CLR R2
0085 B82D OUT P0D,R2
(0059)
(0060) PORTA|=BIT(PA6);//(BEEP)关闭蜂鸣器
0086 9ADE SBI P1B,6
(0061) PORTC&=~BIT(PC6); //(RELAY)初始化继电器为常闭连接状态
0087 98AE CBI P15,6
(0062) PORTA&=~BIT(PA1); //关闭SPI总线DA
0088 98D9 CBI P1B,1
(0063) PORTB=0xFF; //关闭LED
0089 BB88 OUT P18,R24
(0064) PORTA|=BIT(LEDLK); //锁存数据,使LED熄灭
008A 9ADA SBI P1B,2
(0065) Delayus(5);
008B E005 LDI R16,5
008C E010 LDI R17,0
008D DFC3 RCALL _Delayus
(0066) PORTA&=~BIT(LEDLK);
008E 98DA CBI P1B,2
(0067)
(0068) PORTB=0x00; //输出段选
008F 2422 CLR R2
0090 BA28 OUT P18,R2
(0069) PORTA|=BIT(SEGLK);
0091 9ADB SBI P1B,3
(0070) Delayus(50);
0092 E302 LDI R16,0x32
0093 E010 LDI R17,0
0094 DFBC RCALL _Delayus
(0071) PORTA&=~BIT(SEGLK);
0095 98DB CBI P1B,3
(0072)
(0073) PORTB=0xFF; //输出位选
0096 EF8F LDI R24,0xFF
0097 BB88 OUT P18,R24
(0074) PORTA|=BIT(BITLK);
0098 9ADC SBI P1B,4
(0075) Delayus(50);
0099 E302 LDI R16,0x32
009A E010 LDI R17,0
009B DFB5 RCALL _Delayus
(0076) PORTA&=~BIT(BITLK);
009C 98DC CBI P1B,4
(0077)
(0078) PORTD=0xFF;
009D EF8F LDI R24,0xFF
009E BB82 OUT P12,R24
(0079) PORTA|=BIT(PA7);
009F 9ADF SBI P1B,7
(0080) Delayus(50);
00A0 E302 LDI R16,0x32
00A1 E010 LDI R17,0
00A2 DFAE RCALL _Delayus
(0081) PORTA&=~BIT(PA7);
00A3 98DF CBI P1B,7
(0082)
(0083)
(0084) }
00A4 9508 RET
FILE: C:\icc\examples.avr\AVR_PQ1A_DEMO\18_EEPROM\EEPROM.c
(0001) /*******************************************
(0002) 文件:EEPROM.C
(0003) 环境:编译为ICC AVR6.25A,仿真为AVR Studio4.10
(0004) 硬件:ATMEGA16芯片
(0005) 日期:2006年12月10日
(0006) 功能:实现MEGA16的EEPROM的读和写操作
(0007) 备注:参考《AVR系列单片机C语言编程与应用实例》(清华大学出版社)
(0008) /******************************************/
(0009) #include <iom16v.h> //包含型号头文件
(0010) #include <macros.h> //包含"位"操作头文件
(0011) #include <stdio.h> //标准输入输出头文件
(0012) #include <AVR_PQ1A.h> //包含自定义常量头文件
(0013)
(0014) /*******************************************
(0015) 函数名称: Eeprom_writeB
(0016) 功 能: 向EEPROM中的指定地址写入一个字节
(0017) 参 数: eaddr--EEPROM的指定地址
(0018) edata--写入EEPROM的数据
(0019) 返回值 : 无
(0020) /********************************************/
(0021) void Eeprom_writeB(uint eaddr,uchar edata)
(0022) {
(0023) SREG&=~BIT(7); //在写入EEPROM期间应该关闭全局中断,防止中断打断写EEPROM的特殊时序
_Eeprom_writeB:
edata --> R18
eaddr --> R16
00A5 94F8 BCLR 7
(0024) while(EECR&BIT(EEWE)); //等待上次写操作完毕
00A6 99E1 SBIC P1C,1
00A7 CFFE RJMP 0x00A6
(0025) EEAR=eaddr; //配置地址寄存器
00A8 9310003F STS R17,0x3F
00AA 9300003E STS R16,0x3E
(0026) EEDR=edata; //配置数据寄存器
00AC BB2D OUT P1D,R18
(0027) EECR|=BIT(EEMWE); //主写使能置高
00AD 9AE2 SBI P1C,2
(0028) EECR|=BIT(EEWE); //EEMWE置高后,4个时钟周期内将EEWE置高才能将数据写入
00AE 9AE1 SBI P1C,1
(0029) SREG|=BIT(7); //写入完毕后,开放全局中断
00AF 9478 BSET 7
(0030) }
00B0 9508 RET
_Eeprom_readB:
edata --> R20
eaddr --> R16
00B1 940E00E2 CALL push_gset1
(0031) /*******************************************
(0032) 函数名称: Eeprom_readB
(0033) 功 能: 从EEPROM中的指定地址读出一个字节
(0034) 参 数: eaddr--EEPROM的指定地址
(0035) 返回值 : edata--读出的EEPROM数据
(0036) /********************************************/
(0037) uchar Eeprom_readB(uint eaddr)
(0038) {
(0039) uchar edata;
(0040) while(EECR&BIT(EEWE)); //等待上次写操作完毕
00B3 99E1 SBIC P1C,1
00B4 CFFE RJMP 0x00B3
(0041) EEAR=eaddr; //配置地址寄存器
00B5 9310003F STS R17,0x3F
00B7 9300003E STS R16,0x3E
(0042) EECR|=BIT(EERE); //读使能置高
00B9 9AE0 SBI P1C,0
(0043) edata=EEDR; //读出数据
00BA B34D IN R20,P1D
(0044) return edata; //返回读出的数据
00BB 2F04 MOV R16,R20
00BC 940E00E5 CALL pop_gset1
00BE 9508 RET
(0045) }
(0046) /*******************************************
(0047) 函数名称: main
(0048) 功 能: 实现EEPROM的0-254地址单元写入0-254,然后读出
(0049) 参 数: 无
(0050) 返回值 : 无
(0051) /********************************************/
(0052) void main(void)
(0053) {
(0054) uchar i;
(0055) Board_init( ); //初始化开发板
_main:
i --> R20
00BF DFBF RCALL _Board_init
(0056) for(i=0;i<255;i++) //连续写入
00C0 2744 CLR R20
00C1 C005 RJMP 0x00C7
(0057) {
(0058) Eeprom_writeB(i,i);
00C2 2F24 MOV R18,R20
00C3 2F04 MOV R16,R20
00C4 2711 CLR R17
00C5 DFDF RCALL _Eeprom_writeB
00C6 9543 INC R20
00C7 3F4F CPI R20,0xFF
00C8 F3C8 BCS 0x00C2
(0059) }
(0060) for(i=0;i<255;i++) //连续读出
00C9 2744 CLR R20
00CA C004 RJMP 0x00CF
(0061) {
(0062) Eeprom_readB(i);
00CB 2F04 MOV R16,R20
00CC 2711 CLR R17
00CD DFE3 RCALL _Eeprom_readB
00CE 9543 INC R20
00CF 3F4F CPI R20,0xFF
00D0 F3D0 BCS 0x00CB
(0063) }
(0064) }FILE: <library>
00D1 9508 RET
empy16s:
00D2 920A ST R0,-Y
00D3 921A ST R1,-Y
00D4 938A ST R24,-Y
00D5 939A ST R25,-Y
00D6 9F02 MUL R16,R18
00D7 01C0 MOVW R24,R0
00D8 9F12 MUL R17,R18
00D9 0D90 ADD R25,R0
00DA 9F03 MUL R16,R19
00DB 0D90 ADD R25,R0
00DC 018C MOVW R16,R24
00DD 9199 LD R25,Y+
00DE 9189 LD R24,Y+
00DF 9019 LD R1,Y+
00E0 9009 LD R0,Y+
00E1 9508 RET
push_gset1:
00E2 935A ST R21,-Y
00E3 934A ST R20,-Y
00E4 9508 RET
pop_gset1:
00E5 E0E1 LDI R30,1
pop:
00E6 9149 LD R20,Y+
00E7 9159 LD R21,Y+
00E8 FDE0 SBRC R30,0
00E9 9508 RET
00EA 9169 LD R22,Y+
00EB 9179 LD R23,Y+
00EC FDE1 SBRC R30,1
00ED 9508 RET
00EE 90A9 LD R10,Y+
00EF 90B9 LD R11,Y+
00F0 FDE2 SBRC R30,2
00F1 9508 RET
00F2 90C9 LD R12,Y+
00F3 90D9 LD R13,Y+
00F4 FDE3 SBRC R30,3
00F5 9508 RET
00F6 90E9 LD R14,Y+
00F7 90F9 LD R15,Y+
00F8 9508 RET
push_gset2:
00F9 937A ST R23,-Y
00FA 936A ST R22,-Y
00FB 940C00E2 JMP push_gset1
pop_gset2:
00FD E0E2 LDI R30,2
00FE 940C00E6 JMP pop
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -