📄 内部eeprom.lst
字号:
__text_start:
__start:
002A E5CF LDI R28,0x5F
002B E0D4 LDI R29,4
002C BFCD OUT 0x3D,R28
002D BFDE OUT 0x3E,R29
002E 51C0 SUBI R28,0x10
002F 40D0 SBCI R29,0
0030 EA0A LDI R16,0xAA
0031 8308 STD Y+0,R16
0032 2400 CLR R0
0033 E6E0 LDI R30,0x60
0034 E0F0 LDI R31,0
0035 E010 LDI R17,0
0036 36E0 CPI R30,0x60
0037 07F1 CPC R31,R17
0038 F011 BEQ 0x003B
0039 9201 ST R0,Z+
003A CFFB RJMP 0x0036
003B 8300 STD Z+0,R16
003C E5E4 LDI R30,0x54
003D E0F0 LDI R31,0
003E E6A0 LDI R26,0x60
003F E0B0 LDI R27,0
0040 E010 LDI R17,0
0041 35E4 CPI R30,0x54
0042 07F1 CPC R31,R17
0043 F021 BEQ 0x0048
0044 95C8 LPM
0045 9631 ADIW R30,1
0046 920D ST R0,X+
0047 CFF9 RJMP 0x0041
0048 940E008D CALL _main
_exit:
004A CFFF RJMP _exit
FILE: C:\DOCUME~1\Administrator\桌面\精雅系列单片机实验开发板演示程序\内部eeprom\delay.h
(0001) #define xtal 8 //8MS
(0002) /************************************************************
(0003) * 函数名称:void DelayUS(unsigned int time)
(0004) * 功 能:软件延时1.1Us
(0005) * 入口参数:time 延时时间
(0006) * 出口参数:无
(0007) ************************************************************/
(0008) void DelayUS(unsigned int time)
(0009) {
_DelayUS:
time --> R16
004B C002 RJMP 0x004E
(0010) while(time>1)
(0011) time--;
004C 5001 SUBI R16,1
004D 4010 SBCI R17,0
004E E081 LDI R24,1
004F E090 LDI R25,0
0050 1780 CP R24,R16
0051 0791 CPC R25,R17
0052 F3C8 BCS 0x004C
0053 9508 RET
_DelayMS:
i --> R20
time --> R16
0054 940E00D0 CALL push_gset1
(0012) }
(0013) /************************************************************
(0014) * 函数名称:void DelayMS(unsigned int time)
(0015) * 功 能:软件延时 1/1000s
(0016) * 入口参数:time 延时时间 MS
(0017) * 出口参数:无
(0018) ************************************************************/
(0019) void DelayMS (unsigned int time)
(0020) {
0056 C009 RJMP 0x0060
(0021) unsigned int i;
(0022) while(time--)
(0023) {
(0024) for(i=1;i<(unsigned int)(xtal*143-2);i++)
0057 E041 LDI R20,1
0058 E050 LDI R21,0
0059 C002 RJMP 0x005C
005A 5F4F SUBI R20,0xFF
005B 4F5F SBCI R21,0xFF
005C 3746 CPI R20,0x76
005D E0E4 LDI R30,4
005E 075E CPC R21,R30
005F F3D0 BCS 0x005A
0060 0118 MOVW R2,R16
0061 5001 SUBI R16,1
0062 4010 SBCI R17,0
0063 2022 TST R2
0064 F791 BNE 0x0057
0065 2033 TST R3
0066 F781 BNE 0x0057
0067 940E00D3 CALL pop_gset1
0069 9508 RET
FILE: C:\DOCUME~1\Administrator\桌面\精雅系列单片机实验开发板演示程序\内部eeprom\内部eeprom.c
(0001) //包含所需头文件
(0002) #include <ioM16v.h>
(0003) #include <macros.h>
(0004) #include "delay.h"
(0005)
(0006)
(0007)
(0008) /*------宏定义------*/
(0009) #define uchar unsigned char
(0010) #define uint unsigned int
(0011)
(0012)
(0013)
(0014) /*------函数定义------*/
(0015) uchar e2prom_read(uint addr);
(0016) void e2prom_write(uint addr,uchar wData);
(0017)
(0018)
(0019)
(0020)
(0021) //端口初始化
(0022) void port_init(void)
(0023) {
(0024) PORTA = 0xFF;//设置端口方向、数据
_port_init:
006A EF8F LDI R24,0xFF
006B BB8B OUT 0x1B,R24
(0025) DDRA = 0xFF;
006C BB8A OUT 0x1A,R24
(0026) PORTB = 0x00;
006D 2422 CLR R2
006E BA28 OUT 0x18,R2
(0027) DDRB = 0x00;
006F BA27 OUT 0x17,R2
(0028) PORTC = 0x00;
0070 BA25 OUT 0x15,R2
(0029) DDRC = 0x00;
0071 BA24 OUT 0x14,R2
(0030) PORTD = 0x00;
0072 BA22 OUT 0x12,R2
(0031) DDRD = 0x00;
0073 BA21 OUT 0x11,R2
0074 9508 RET
(0032) }
(0033)
(0034)
(0035) //功能:E2PROM单字节读函数
(0036) uchar e2prom_read(uint addr)
(0037) {
(0038) while(EECR & (1<<EEWE)); //判断EEPROM是否工作
_e2prom_read:
addr --> R16
0075 99E1 SBIC 0x1C,1
0076 CFFE RJMP _e2prom_read
(0039) EEAR = addr; //送入EEPROM地址
0077 BB1F OUT 0x1F,R17
0078 BB0E OUT 0x1E,R16
(0040) EECR|=BIT(EERE); //EEPROM读使能
0079 9AE0 SBI 0x1C,0
(0041) return EEDR; //返回EEPROM数据寄存器数值
007A B30D IN R16,0x1D
007B 9508 RET
(0042) }
(0043)
(0044)
(0045) //功能:单字节写函数
(0046) void e2prom_write(uint addr,uchar wData)
(0047) {
(0048) while(EECR & BIT(EEWE)); //判断EEPROM是否工作
_e2prom_write:
wData --> R18
addr --> R16
007C 99E1 SBIC 0x1C,1
007D CFFE RJMP _e2prom_write
(0049) EEAR=addr; //送入EEPROM地址
007E BB1F OUT 0x1F,R17
007F BB0E OUT 0x1E,R16
(0050) EEDR=wData; //送入EEPROM数据
0080 BB2D OUT 0x1D,R18
(0051) EECR|=BIT(EEMWE); //EEPROM主写使能
0081 9AE2 SBI 0x1C,2
(0052) EECR|=BIT(EEWE); //EEPROM写使能
0082 9AE1 SBI 0x1C,1
0083 9508 RET
(0053) }
(0054)
(0055)
(0056) void init_devices(void)
(0057) {
(0058) CLI(); //禁止所有中断
_init_devices:
0084 94F8 BCLR 7
(0059) MCUCR = 0x00;//INT0、INT1中断触发方式
0085 2422 CLR R2
0086 BE25 OUT 0x35,R2
(0060) MCUCSR = 0x80;//禁止JTAG
0087 E880 LDI R24,0x80
0088 BF84 OUT 0x34,R24
(0061) GICR = 0x00;//外部中断使能
0089 BE2B OUT 0x3B,R2
(0062) port_init();
008A DFDF RCALL _port_init
(0063) SEI();//开全局中断
008B 9478 BSET 7
008C 9508 RET
(0064) }
(0065) //主函数
(0066) void main(void)
(0067) {
(0068) init_devices();
_main:
008D DFF6 RCALL _init_devices
008E C037 RJMP 0x00C6
(0069) while(1)
(0070) {
(0071) e2prom_write(0x00,0x00);
008F 2722 CLR R18
0090 2700 CLR R16
0091 2711 CLR R17
0092 DFE9 RCALL _e2prom_write
(0072) PORTA=e2prom_read(0x00);
0093 2700 CLR R16
0094 2711 CLR R17
0095 DFDF RCALL _e2prom_read
0096 BB0B OUT 0x1B,R16
(0073) DelayMS(1000);
0097 EE08 LDI R16,0xE8
0098 E013 LDI R17,3
0099 DFBA RCALL _DelayMS
(0074) e2prom_write(0x01,0xF0);
009A EF20 LDI R18,0xF0
009B E001 LDI R16,1
009C E010 LDI R17,0
009D DFDE RCALL _e2prom_write
(0075) PORTA=e2prom_read(0x01);
009E E001 LDI R16,1
009F E010 LDI R17,0
00A0 DFD4 RCALL _e2prom_read
00A1 BB0B OUT 0x1B,R16
(0076) DelayMS(1000);
00A2 EE08 LDI R16,0xE8
00A3 E013 LDI R17,3
00A4 DFAF RCALL _DelayMS
(0077) e2prom_write(0x02,0x0F);
00A5 E02F LDI R18,0xF
00A6 E002 LDI R16,2
00A7 E010 LDI R17,0
00A8 DFD3 RCALL _e2prom_write
(0078) PORTA=e2prom_read(0x02);
00A9 E002 LDI R16,2
00AA E010 LDI R17,0
00AB DFC9 RCALL _e2prom_read
00AC BB0B OUT 0x1B,R16
(0079) DelayMS(1000);
00AD EE08 LDI R16,0xE8
00AE E013 LDI R17,3
00AF DFA4 RCALL _DelayMS
(0080) e2prom_write(0x03,0xaa);
00B0 EA2A LDI R18,0xAA
00B1 E003 LDI R16,3
00B2 E010 LDI R17,0
00B3 DFC8 RCALL _e2prom_write
(0081) PORTA=e2prom_read(0x03);
00B4 E003 LDI R16,3
00B5 E010 LDI R17,0
00B6 DFBE RCALL _e2prom_read
00B7 BB0B OUT 0x1B,R16
(0082) DelayMS(1000);
00B8 EE08 LDI R16,0xE8
00B9 E013 LDI R17,3
00BA DF99 RCALL _DelayMS
(0083) e2prom_write(0x04,0xFF);
00BB EF2F LDI R18,0xFF
00BC E004 LDI R16,4
00BD E010 LDI R17,0
00BE DFBD RCALL _e2prom_write
(0084) PORTA=e2prom_read(0x04);
00BF E004 LDI R16,4
00C0 E010 LDI R17,0
00C1 DFB3 RCALL _e2prom_read
00C2 BB0B OUT 0x1B,R16
(0085) DelayMS(1000);
FILE: <library>
00C3 EE08 LDI R16,0xE8
00C4 E013 LDI R17,3
00C5 DF8E RCALL _DelayMS
00C6 CFC8 RJMP 0x008F
00C7 9508 RET
push_gset5:
00C8 92FA ST R15,-Y
00C9 92EA ST R14,-Y
push_gset4:
00CA 92DA ST R13,-Y
00CB 92CA ST R12,-Y
push_gset3:
00CC 92BA ST R11,-Y
00CD 92AA ST R10,-Y
push_gset2:
00CE 937A ST R23,-Y
00CF 936A ST R22,-Y
push_gset1:
00D0 935A ST R21,-Y
00D1 934A ST R20,-Y
00D2 9508 RET
pop_gset1:
00D3 E0E1 LDI R30,1
pop:
00D4 9149 LD R20,Y+
00D5 9159 LD R21,Y+
00D6 FDE0 SBRC R30,0
00D7 9508 RET
00D8 9169 LD R22,Y+
00D9 9179 LD R23,Y+
00DA FDE1 SBRC R30,1
00DB 9508 RET
00DC 90A9 LD R10,Y+
00DD 90B9 LD R11,Y+
00DE FDE2 SBRC R30,2
00DF 9508 RET
00E0 90C9 LD R12,Y+
00E1 90D9 LD R13,Y+
00E2 FDE3 SBRC R30,3
00E3 9508 RET
00E4 90E9 LD R14,Y+
00E5 90F9 LD R15,Y+
00E6 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -