📄 at93c46.lst
字号:
__start:
__text_start:
002A E5CF LDI R28,0x5F
002B E0D4 LDI R29,4
002C BFCD OUT 0x3D,R28
002D BFDE OUT 0x3E,R29
002E 51CE SUBI R28,0x1E
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 940E004B CALL _main
_exit:
004A CFFF RJMP _exit
FILE: E:\MyDesign\ICCAVR\ATmega16_DEV\AT93C46\AT93C46.C
(0001) /**********************************************
(0002) *工程名称:eeprom AT93C46 读写
(0003) *工作模式:8位字节模式(ORG=GND),IO口模拟时序,mega16使用内部 8Mhz RC
(0004) *作 者:朱海峰
(0005) *邮 箱:ntzhf@163.com QQ:543376422
(0006) *创建日期:2007.10.26
(0007) *修改日期:2007.10.30
(0008) ************************************************/
(0009)
(0010) #include <iom16v.h>
(0011) #include <macros.h>
(0012)
(0013) #define uint8_t unsigned char
(0014) #define uint16_t unsigned int
(0015) #define nop NOP()
(0016)
(0017) //op code
(0018) #define READ 0X80 //只包括前3个控制BIT--下同
(0019) #define EWEN 0X00
(0020) #define ERASE 0Xc0
(0021) #define WRITE 0X40
(0022) #define ERAL 0X00
(0023) #define WRAL 0X00
(0024) #define EWDS 0X00
(0025)
(0026) #define DI 5
(0027) #define DO 6
(0028) #define CS 4
(0029) #define SK 7
(0030) #define ORG 0 //0=接地(8位模式);1=接VCC(16位模式)
(0031) #define DDR_DI DDRB
(0032) #define DDR_DO DDRB
(0033) #define DDR_CS DDRB
(0034) #define DDR_SK DDRB
(0035)
(0036) #define PORT_DI PORTB
(0037) #define PORT_DO PORTB
(0038) #define PORT_CS PORTB
(0039) #define PORT_SK PORTB
(0040)
(0041) #define PIN_DI PINB
(0042) #define PIN_DO PINB
(0043) #define PIN_CS PINB
(0044) #define PIN_SK PINB
(0045)
(0046) #define set_di() PORT_DI |= (1<<DI)
(0047) #define clr_di() PORT_DI &= ~(1<<DI)
(0048) #define set_cs() PORT_CS |= (1<<CS)
(0049) #define clr_cs() PORT_CS &= ~(1<<CS)
(0050) #define set_sk() PORT_SK |= (1<<SK)
(0051) #define clr_sk() PORT_SK &= ~(1<<SK)
(0052)
(0053)
(0054) #define buzzer_on() DDRD |= (1<<2);PORTD |= (1<<2)
(0055) #define buzzer_off() DDRD |= (1<<2);PORTD &= ~(1<<2)
(0056)
(0057) #define Green_off() DDRB |= (1<<0);PORTB |= (1<<0)
(0058) #define Green_on() DDRB |= (1<<0);PORTB &= ~(1<<0)
(0059) #define Red_off() DDRB |= (1<<1);PORTB |= (1<<1)
(0060) #define Red_on() DDRB |= (1<<1);PORTB &= ~(1<<1)
(0061)
(0062) uint8_t Read(uint8_t add);
(0063) void EW_enable(void);
(0064) void EW_disable(void);
(0065) void Erase(uint8_t add);
(0066) void Erase_all(void);
(0067) void Write(uint8_t add,uint8_t w_data);
(0068) void IO_init(void);
(0069) void Delay_ms(uint16_t ms);
(0070) void Send_str_op(uint8_t op);
(0071) void Send_bits(uint8_t s_data);
(0072) void delay_us(void);
(0073) /*********************************************/
(0074) void main(void)
(0075) {
(0076) uint8_t temp_1 = 0x00;
_main:
temp_1 --> R20
004B 2744 CLR R20
(0077) nop;
004C 0000 NOP
(0078) IO_init();
004D D01C RCALL _IO_init
004E C019 RJMP 0x0068
(0079) while (2)
(0080) {
(0081) EW_enable(); //读写使能
004F D09A RCALL _EW_enable
(0082) //Erase(0x03);
(0083) Write(0x01,0x28); //在地址为0X01的EEPROM中写入数据0x28
0050 E228 LDI R18,0x28
0051 E001 LDI R16,1
0052 D0B7 RCALL _Write
(0084) nop;
0053 0000 NOP
(0085) nop;
0054 0000 NOP
(0086) //EW_disable();
(0087) //Delay_ms(100);
(0088) //EW_enable();
(0089) temp_1 = Read(0x01); //读取地址为0X01的EEPROM中的数据
0055 E001 LDI R16,1
0056 D055 RCALL _Read
0057 2F40 MOV R20,R16
(0090) nop;
0058 0000 NOP
(0091) nop;
0059 0000 NOP
(0092) EW_disable();
005A D086 RCALL _EW_disable
(0093) if (temp_1 == 0x28) //校验读取的数据是写入的
005B 3248 CPI R20,0x28
005C F429 BNE 0x0062
(0094) {
(0095) Green_on(); //校验正确,绿色LED亮
005D 9AB8 SBI 0x17,0
005E 98C0 CBI 0x18,0
(0096) Red_off();
005F 9AB9 SBI 0x17,1
0060 9AC1 SBI 0x18,1
(0097) }
0061 C004 RJMP 0x0066
(0098) else
(0099) {
(0100) Green_off(); //校验不正确,红色LED亮
0062 9AB8 SBI 0x17,0
0063 9AC0 SBI 0x18,0
(0101) Red_on();
0064 9AB9 SBI 0x17,1
0065 98C1 CBI 0x18,1
(0102) }
(0103) for(;;)
(0104) nop;
0066 0000 NOP
0067 CFFE RJMP 0x0066
0068 CFE6 RJMP 0x004F
0069 9508 RET
(0105) }
(0106) }
(0107) /*********************************************/
(0108) void IO_init(void)
(0109) {
(0110) DDR_DI |= (1<<DI);
_IO_init:
006A 9ABD SBI 0x17,5
(0111) PORT_DI &= ~(1<<DI);
006B 98C5 CBI 0x18,5
(0112) DDR_CS |= (1<<CS);
006C 9ABC SBI 0x17,4
(0113) PORT_CS &= ~(1<<CS);
006D 98C4 CBI 0x18,4
(0114) DDR_SK |= (1<<SK);
006E 9ABF SBI 0x17,7
(0115) PORT_SK &= ~(1<<SK);
006F 98C7 CBI 0x18,7
0070 9508 RET
(0116) }
(0117) /*********************************************/
(0118) void delay_us(void)
(0119) {
(0120) nop;
_delay_us:
0071 0000 NOP
(0121) nop;
0072 0000 NOP
(0122) nop;
0073 0000 NOP
(0123) nop;
0074 0000 NOP
0075 9508 RET
_Send_str_op:
i --> R20
op --> R22
0076 940E013E CALL push_gset2
0078 2F60 MOV R22,R16
(0124) }
(0125) /*********************************************/
(0126) /*********************************************
(0127) 函数功能:发送起始位和操作码
(0128) 描 述:一个BIT的起始位+两个BIT的操作码
(0129) 入口参数:OP
(0130) 出口参数:无
(0131) *********************************************/
(0132) void Send_str_op(uint8_t op)
(0133) {
(0134) uint8_t i;
(0135) //===========start bit=================//
(0136) set_di();
0079 9AC5 SBI 0x18,5
(0137) delay_us();
007A DFF6 RCALL _delay_us
(0138) set_sk();
007B 9AC7 SBI 0x18,7
(0139) delay_us();
007C DFF4 RCALL _delay_us
(0140) clr_sk();
007D 98C7 CBI 0x18,7
(0141) delay_us();
007E DFF2 RCALL _delay_us
(0142) //===========send op code================//
(0143) for (i=0;i<2;i++,op <<=1)
007F 2744 CLR R20
0080 C00D RJMP 0x008E
(0144) {
(0145) if (op & 0x80)
0081 FF67 SBRS R22,7
0082 C002 RJMP 0x0085
(0146) {
(0147) set_di();
0083 9AC5 SBI 0x18,5
(0148) }
0084 C001 RJMP 0x0086
(0149) else
(0150) {
(0151) clr_di();
0085 98C5 CBI 0x18,5
(0152) }
(0153) delay_us();
0086 DFEA RCALL _delay_us
(0154) set_sk();
0087 9AC7 SBI 0x18,7
(0155) delay_us();
0088 DFE8 RCALL _delay_us
(0156) clr_sk();
0089 98C7 CBI 0x18,7
(0157) delay_us();
008A DFE6 RCALL _delay_us
(0158) clr_di();
008B 98C5 CBI 0x18,5
008C 9543 INC R20
008D 0F66 LSL R22
008E 3042 CPI R20,2
008F F388 BCS 0x0081
0090 940E0132 CALL pop_gset2
0092 9508 RET
_Send_bits:
temp_data --> R20
i --> R22
s_data --> R10
0093 940E013C CALL push_gset3
0095 2EA0 MOV R10,R16
(0159) }
(0160) }
(0161) /*********************************************
(0162) 函数功能:发送7个BIT
(0163) 描 述:地址或其他
(0164) 入口参数:s_data
(0165) 出口参数:无
(0166) *********************************************/
(0167) void Send_bits(uint8_t s_data)
(0168) {
(0169) uint8_t i,temp_data = 0;
0096 2744 CLR R20
(0170) for (i=0;i<7;i++,s_data <<=1)
0097 2766 CLR R22
0098 C00E RJMP 0x00A7
(0171) {
(0172) temp_data = s_data;
0099 2D4A MOV R20,R10
(0173) if (temp_data & 0x40) // xxxx'xxxx
009A FEA6 SBRS R10,6
009B C002 RJMP 0x009E
(0174) { // &0100'0000
(0175) set_di();
009C 9AC5 SBI 0x18,5
(0176) }
009D C001 RJMP 0x009F
(0177) else
(0178) {
(0179) clr_di();
009E 98C5 CBI 0x18,5
(0180) }
(0181) delay_us();
009F DFD1 RCALL _delay_us
(0182) set_sk();
00A0 9AC7 SBI 0x18,7
(0183) delay_us();
00A1 DFCF RCALL _delay_us
(0184) clr_sk();
00A2 98C7 CBI 0x18,7
(0185) delay_us();
00A3 DFCD RCALL _delay_us
(0186) clr_di();
00A4 98C5 CBI 0x18,5
00A5 9563 INC R22
00A6 0CAA LSL R10
00A7 3067 CPI R22,7
00A8 F380 BCS 0x0099
00A9 940E0135 CALL pop_gset3
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -