📄 at93c46.lis
字号:
.module AT93C46.C
.area text(rom, con, rel)
0000 .dbfile E:\MyDesign\ICCAVR\ATmega16_DEV\AT93C46\AT93C46.C
0000 .dbfunc e main _main fV
0000 ; temp_1 -> R20
.even
0000 _main::
0000 .dbline -1
0000 .dbline 75
0000 ; /**********************************************
0000 ; *工程名称:eeprom AT93C46 读写
0000 ; *工作模式:8位字节模式(ORG=GND),IO口模拟时序,mega16使用内部 8Mhz RC
0000 ; *作 者:朱海峰
0000 ; *邮 箱:ntzhf@163.com QQ:543376422
0000 ; *创建日期:2007.10.26
0000 ; *修改日期:2007.10.30
0000 ; ************************************************/
0000 ;
0000 ; #include <iom16v.h>
0000 ; #include <macros.h>
0000 ;
0000 ; #define uint8_t unsigned char
0000 ; #define uint16_t unsigned int
0000 ; #define nop NOP()
0000 ;
0000 ; //op code
0000 ; #define READ 0X80 //只包括前3个控制BIT--下同
0000 ; #define EWEN 0X00
0000 ; #define ERASE 0Xc0
0000 ; #define WRITE 0X40
0000 ; #define ERAL 0X00
0000 ; #define WRAL 0X00
0000 ; #define EWDS 0X00
0000 ;
0000 ; #define DI 5
0000 ; #define DO 6
0000 ; #define CS 4
0000 ; #define SK 7
0000 ; #define ORG 0 //0=接地(8位模式);1=接VCC(16位模式)
0000 ; #define DDR_DI DDRB
0000 ; #define DDR_DO DDRB
0000 ; #define DDR_CS DDRB
0000 ; #define DDR_SK DDRB
0000 ;
0000 ; #define PORT_DI PORTB
0000 ; #define PORT_DO PORTB
0000 ; #define PORT_CS PORTB
0000 ; #define PORT_SK PORTB
0000 ;
0000 ; #define PIN_DI PINB
0000 ; #define PIN_DO PINB
0000 ; #define PIN_CS PINB
0000 ; #define PIN_SK PINB
0000 ;
0000 ; #define set_di() PORT_DI |= (1<<DI)
0000 ; #define clr_di() PORT_DI &= ~(1<<DI)
0000 ; #define set_cs() PORT_CS |= (1<<CS)
0000 ; #define clr_cs() PORT_CS &= ~(1<<CS)
0000 ; #define set_sk() PORT_SK |= (1<<SK)
0000 ; #define clr_sk() PORT_SK &= ~(1<<SK)
0000 ;
0000 ;
0000 ; #define buzzer_on() DDRD |= (1<<2);PORTD |= (1<<2)
0000 ; #define buzzer_off() DDRD |= (1<<2);PORTD &= ~(1<<2)
0000 ;
0000 ; #define Green_off() DDRB |= (1<<0);PORTB |= (1<<0)
0000 ; #define Green_on() DDRB |= (1<<0);PORTB &= ~(1<<0)
0000 ; #define Red_off() DDRB |= (1<<1);PORTB |= (1<<1)
0000 ; #define Red_on() DDRB |= (1<<1);PORTB &= ~(1<<1)
0000 ;
0000 ; uint8_t Read(uint8_t add);
0000 ; void EW_enable(void);
0000 ; void EW_disable(void);
0000 ; void Erase(uint8_t add);
0000 ; void Erase_all(void);
0000 ; void Write(uint8_t add,uint8_t w_data);
0000 ; void IO_init(void);
0000 ; void Delay_ms(uint16_t ms);
0000 ; void Send_str_op(uint8_t op);
0000 ; void Send_bits(uint8_t s_data);
0000 ; void delay_us(void);
0000 ; /*********************************************/
0000 ; void main(void)
0000 ; {
0000 .dbline 76
0000 ; uint8_t temp_1 = 0x00;
0000 4427 clr R20
0002 .dbline 77
0002 ; nop;
0002 0000 nop
0004 .dbline 78
0004 ; IO_init();
0004 1CD0 xcall _IO_init
0006 19C0 xjmp L3
0008 L2:
0008 .dbline 80
0008 ; while (2)
0008 ; {
0008 .dbline 81
0008 ; EW_enable(); //读写使能
0008 9AD0 xcall _EW_enable
000A .dbline 83
000A ; //Erase(0x03);
000A ; Write(0x01,0x28); //在地址为0X01的EEPROM中写入数据0x28
000A 28E2 ldi R18,40
000C 01E0 ldi R16,1
000E B7D0 xcall _Write
0010 .dbline 84
0010 ; nop;
0010 0000 nop
0012 .dbline 85
0012 ; nop;
0012 0000 nop
0014 .dbline 89
0014 ; //EW_disable();
0014 ; //Delay_ms(100);
0014 ; //EW_enable();
0014 ; temp_1 = Read(0x01); //读取地址为0X01的EEPROM中的数据
0014 01E0 ldi R16,1
0016 55D0 xcall _Read
0018 402F mov R20,R16
001A .dbline 90
001A ; nop;
001A 0000 nop
001C .dbline 91
001C ; nop;
001C 0000 nop
001E .dbline 92
001E ; EW_disable();
001E 86D0 xcall _EW_disable
0020 .dbline 93
0020 ; if (temp_1 == 0x28) //校验读取的数据是写入的
0020 4832 cpi R20,40
0022 29F4 brne L5
0024 .dbline 94
0024 ; {
0024 .dbline 95
0024 ; Green_on(); //校验正确,绿色LED亮
0024 B89A sbi 0x17,0
0026 .dbline 95
0026 C098 cbi 0x18,0
0028 .dbline 96
0028 ; Red_off();
0028 B99A sbi 0x17,1
002A .dbline 96
002A C19A sbi 0x18,1
002C .dbline 97
002C ; }
002C 04C0 xjmp L6
002E L5:
002E .dbline 99
002E ; else
002E ; {
002E .dbline 100
002E ; Green_off(); //校验不正确,红色LED亮
002E B89A sbi 0x17,0
0030 .dbline 100
0030 C09A sbi 0x18,0
0032 .dbline 101
0032 ; Red_on();
0032 B99A sbi 0x17,1
0034 .dbline 101
0034 C198 cbi 0x18,1
0036 .dbline 102
0036 ; }
0036 L6:
0036 .dbline 103
0036 ; for(;;)
0036 L7:
0036 .dbline 104
0036 0000 nop
0038 .dbline 103
0038 .dbline 103
0038 FECF xjmp L7
003A L3:
003A .dbline 79
003A E6CF xjmp L2
003C X0:
003C .dbline -2
003C L1:
003C .dbline 0 ; func end
003C 0895 ret
003E .dbsym r temp_1 20 c
003E .dbend
003E .dbfunc e IO_init _IO_init fV
.even
003E _IO_init::
003E .dbline -1
003E .dbline 109
003E ; nop;
003E ; }
003E ; }
003E ; /*********************************************/
003E ; void IO_init(void)
003E ; {
003E .dbline 110
003E ; DDR_DI |= (1<<DI);
003E BD9A sbi 0x17,5
0040 .dbline 111
0040 ; PORT_DI &= ~(1<<DI);
0040 C598 cbi 0x18,5
0042 .dbline 112
0042 ; DDR_CS |= (1<<CS);
0042 BC9A sbi 0x17,4
0044 .dbline 113
0044 ; PORT_CS &= ~(1<<CS);
0044 C498 cbi 0x18,4
0046 .dbline 114
0046 ; DDR_SK |= (1<<SK);
0046 BF9A sbi 0x17,7
0048 .dbline 115
0048 ; PORT_SK &= ~(1<<SK);
0048 C798 cbi 0x18,7
004A .dbline -2
004A L11:
004A .dbline 0 ; func end
004A 0895 ret
004C .dbend
004C .dbfunc e delay_us _delay_us fV
.even
004C _delay_us::
004C .dbline -1
004C .dbline 119
004C ; }
004C ; /*********************************************/
004C ; void delay_us(void)
004C ; {
004C .dbline 120
004C ; nop;
004C 0000 nop
004E .dbline 121
004E ; nop;
004E 0000 nop
0050 .dbline 122
0050 ; nop;
0050 0000 nop
0052 .dbline 123
0052 ; nop;
0052 0000 nop
0054 .dbline -2
0054 L12:
0054 .dbline 0 ; func end
0054 0895 ret
0056 .dbend
0056 .dbfunc e Send_str_op _Send_str_op fV
0056 ; i -> R20
0056 ; op -> R22
.even
0056 _Send_str_op::
0056 0E940000 xcall push_gset2
005A 602F mov R22,R16
005C .dbline -1
005C .dbline 133
005C ; }
005C ; /*********************************************/
005C ; /*********************************************
005C ; 函数功能:发送起始位和操作码
005C ; 描 述:一个BIT的起始位+两个BIT的操作码
005C ; 入口参数:OP
005C ; 出口参数:无
005C ; *********************************************/
005C ; void Send_str_op(uint8_t op)
005C ; {
005C .dbline 136
005C ; uint8_t i;
005C ; //===========start bit=================//
005C ; set_di();
005C C59A sbi 0x18,5
005E .dbline 137
005E ; delay_us();
005E F6DF xcall _delay_us
0060 .dbline 138
0060 ; set_sk();
0060 C79A sbi 0x18,7
0062 .dbline 139
0062 ; delay_us();
0062 F4DF xcall _delay_us
0064 .dbline 140
0064 ; clr_sk();
0064 C798 cbi 0x18,7
0066 .dbline 141
0066 ; delay_us();
0066 F2DF xcall _delay_us
0068 .dbline 143
0068 ; //===========send op code================//
0068 ; for (i=0;i<2;i++,op <<=1)
0068 4427 clr R20
006A 0DC0 xjmp L17
006C L14:
006C .dbline 144
006C ; {
006C .dbline 145
006C ; if (op & 0x80)
006C 67FF sbrs R22,7
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -