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

📄 at93c46.s

📁 93c46的驱动程序,C51代码
💻 S
📖 第 1 页 / 共 2 页
字号:
	.module AT93C46.C
	.area text(rom, con, rel)
	.dbfile E:\MyDesign\ICCAVR\ATmega16_DEV\AT93C46\AT93C46.C
	.dbfunc e main _main fV
;         temp_1 -> R20
	.even
_main::
	.dbline -1
	.dbline 75
; /**********************************************
; *工程名称:eeprom AT93C46 读写
; *工作模式:8位字节模式(ORG=GND),IO口模拟时序,mega16使用内部 8Mhz RC
; *作    者:朱海峰
; *邮    箱:ntzhf@163.com       QQ:543376422
; *创建日期:2007.10.26
; *修改日期:2007.10.30
; ************************************************/
; 
; #include <iom16v.h>
; #include <macros.h>
; 
; #define uint8_t	   unsigned char
; #define uint16_t   unsigned int
; #define nop		   NOP()
; 
; //op code
; #define READ	   0X80		   //只包括前3个控制BIT--下同
; #define EWEN	   0X00
; #define ERASE	   0Xc0
; #define WRITE	   0X40
; #define ERAL	   0X00
; #define WRAL	   0X00
; #define EWDS	   0X00
; 
; #define DI		   5
; #define DO		   6
; #define CS		   4
; #define SK		   7
; #define ORG		   0	 	   //0=接地(8位模式);1=接VCC(16位模式)
; #define DDR_DI	   DDRB
; #define DDR_DO	   DDRB
; #define DDR_CS	   DDRB
; #define DDR_SK	   DDRB
; 
; #define PORT_DI	   PORTB
; #define PORT_DO	   PORTB
; #define PORT_CS	   PORTB
; #define PORT_SK	   PORTB
; 
; #define PIN_DI	   PINB
; #define PIN_DO	   PINB
; #define PIN_CS	   PINB
; #define PIN_SK	   PINB
; 
; #define set_di()   PORT_DI |= (1<<DI)
; #define clr_di()   PORT_DI &= ~(1<<DI)
; #define set_cs()   PORT_CS |= (1<<CS)
; #define clr_cs()   PORT_CS &= ~(1<<CS)
; #define set_sk()   PORT_SK |= (1<<SK)
; #define clr_sk()   PORT_SK &= ~(1<<SK)
; 
; 
; #define buzzer_on()    DDRD |= (1<<2);PORTD |= (1<<2)
; #define buzzer_off()   DDRD |= (1<<2);PORTD &= ~(1<<2)
; 
; #define Green_off()	   DDRB |= (1<<0);PORTB |= (1<<0)
; #define Green_on()	   DDRB |= (1<<0);PORTB &= ~(1<<0)
; #define Red_off()	   DDRB |= (1<<1);PORTB |= (1<<1)
; #define Red_on()	   DDRB |= (1<<1);PORTB &= ~(1<<1)
; 
; uint8_t Read(uint8_t add);
; void EW_enable(void);
; void EW_disable(void);
; void Erase(uint8_t add);
; void Erase_all(void);
; void Write(uint8_t add,uint8_t w_data);
; void IO_init(void);
; void Delay_ms(uint16_t ms);
; void Send_str_op(uint8_t op);
; void Send_bits(uint8_t s_data);
; void delay_us(void);
; /*********************************************/
; void main(void)
; {
	.dbline 76
;  	uint8_t temp_1 = 0x00;
	clr R20
	.dbline 77
; 	nop;
	nop
	.dbline 78
; 	IO_init();
	xcall _IO_init
	xjmp L3
L2:
	.dbline 80
; 	while (2)
; 	{
	.dbline 81
; 	 	EW_enable(); 	  //读写使能
	xcall _EW_enable
	.dbline 83
; 		//Erase(0x03);
; 		Write(0x01,0x28); //在地址为0X01的EEPROM中写入数据0x28
	ldi R18,40
	ldi R16,1
	xcall _Write
	.dbline 84
; 		nop;
	nop
	.dbline 85
; 		nop;
	nop
	.dbline 89
; 		//EW_disable();
; 		//Delay_ms(100);
; 		//EW_enable();
; 		temp_1 = Read(0x01); //读取地址为0X01的EEPROM中的数据
	ldi R16,1
	xcall _Read
	mov R20,R16
	.dbline 90
; 		nop;
	nop
	.dbline 91
; 		nop;
	nop
	.dbline 92
; 		EW_disable();
	xcall _EW_disable
	.dbline 93
; 		if (temp_1 == 0x28)  //校验读取的数据是写入的
	cpi R20,40
	brne L5
	.dbline 94
; 		{
	.dbline 95
; 		   	Green_on();		 //校验正确,绿色LED亮
	sbi 0x17,0
	.dbline 95
	cbi 0x18,0
	.dbline 96
; 			Red_off();
	sbi 0x17,1
	.dbline 96
	sbi 0x18,1
	.dbline 97
; 		}
	xjmp L6
L5:
	.dbline 99
; 		else
; 		{
	.dbline 100
; 		 	Green_off();	 //校验不正确,红色LED亮
	sbi 0x17,0
	.dbline 100
	sbi 0x18,0
	.dbline 101
; 			Red_on();
	sbi 0x17,1
	.dbline 101
	cbi 0x18,1
	.dbline 102
; 		}
L6:
	.dbline 103
; 		for(;;)
L7:
	.dbline 104
	nop
	.dbline 103
	.dbline 103
	xjmp L7
L3:
	.dbline 79
	xjmp L2
X0:
	.dbline -2
L1:
	.dbline 0 ; func end
	ret
	.dbsym r temp_1 20 c
	.dbend
	.dbfunc e IO_init _IO_init fV
	.even
_IO_init::
	.dbline -1
	.dbline 109
; 		nop;
; 	}
; }
; /*********************************************/
; void IO_init(void)
; {
	.dbline 110
;  	 DDR_DI |= (1<<DI);
	sbi 0x17,5
	.dbline 111
; 	 PORT_DI &= ~(1<<DI);
	cbi 0x18,5
	.dbline 112
; 	 DDR_CS |= (1<<CS);
	sbi 0x17,4
	.dbline 113
; 	 PORT_CS &= ~(1<<CS);
	cbi 0x18,4
	.dbline 114
; 	 DDR_SK |= (1<<SK);
	sbi 0x17,7
	.dbline 115
; 	 PORT_SK &= ~(1<<SK);
	cbi 0x18,7
	.dbline -2
L11:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e delay_us _delay_us fV
	.even
_delay_us::
	.dbline -1
	.dbline 119
; }
; /*********************************************/
; void delay_us(void)
; {
	.dbline 120
;  	 nop;
	nop
	.dbline 121
; 	 nop;
	nop
	.dbline 122
; 	 nop;
	nop
	.dbline 123
; 	 nop;
	nop
	.dbline -2
L12:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e Send_str_op _Send_str_op fV
;              i -> R20
;             op -> R22
	.even
_Send_str_op::
	xcall push_gset2
	mov R22,R16
	.dbline -1
	.dbline 133
; }
; /*********************************************/
; /*********************************************
; 函数功能:发送起始位和操作码 
; 描    述:一个BIT的起始位+两个BIT的操作码
; 入口参数:OP
; 出口参数:无
; *********************************************/
; void Send_str_op(uint8_t op)
; {
	.dbline 136
;  	uint8_t i;
; //===========start bit=================//
; 	set_di();
	sbi 0x18,5
	.dbline 137
; 	delay_us();
	xcall _delay_us
	.dbline 138
; 	set_sk();
	sbi 0x18,7
	.dbline 139
; 	delay_us();
	xcall _delay_us
	.dbline 140
; 	clr_sk();
	cbi 0x18,7
	.dbline 141
; 	delay_us();
	xcall _delay_us
	.dbline 143
; //===========send op code================//
; 	for (i=0;i<2;i++,op <<=1)
	clr R20
	xjmp L17
L14:
	.dbline 144
; 	{
	.dbline 145
; 	 	if (op & 0x80)
	sbrs R22,7
	rjmp L18
	.dbline 146
; 	 	{
	.dbline 147
; 	  	   	set_di();
	sbi 0x18,5
	.dbline 148
; 	 	}
	xjmp L19
L18:
	.dbline 150
; 	 	else
; 	 	{
	.dbline 151
; 	  	 	clr_di();
	cbi 0x18,5
	.dbline 152
; 	 	}
L19:
	.dbline 153
	xcall _delay_us
	.dbline 154
	sbi 0x18,7
	.dbline 155
	xcall _delay_us
	.dbline 156
	cbi 0x18,7
	.dbline 157
	xcall _delay_us
	.dbline 158
	cbi 0x18,5
	.dbline 159
L15:
	.dbline 143
	inc R20
	lsl R22
L17:
	.dbline 143
	cpi R20,2
	brlo L14
	.dbline -2
L13:
	xcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r i 20 c
	.dbsym r op 22 c
	.dbend
	.dbfunc e Send_bits _Send_bits fV
;      temp_data -> R20
;              i -> R22
;         s_data -> R10
	.even
_Send_bits::
	xcall push_gset3
	mov R10,R16
	.dbline -1
	.dbline 168
; 	 	delay_us();
; 	 	set_sk();
; 	 	delay_us();
; 	 	clr_sk();
; 		delay_us();
; 		clr_di();
; 	}
; }
; /*********************************************
; 函数功能:发送7个BIT 
; 描    述:地址或其他
; 入口参数:s_data
; 出口参数:无
; *********************************************/
; void Send_bits(uint8_t s_data)
; {
	.dbline 169
;  	 uint8_t i,temp_data = 0;
	clr R20
	.dbline 170
; 	 for (i=0;i<7;i++,s_data <<=1)
	clr R22
	xjmp L24
L21:
	.dbline 171
; 	 {
	.dbline 172
; 	  	temp_data = s_data;
	mov R20,R10
	.dbline 173
; 		if (temp_data & 0x40)	  //   xxxx'xxxx
	sbrs R10,6
	rjmp L25
	.dbline 174
; 	 	{  			  			  //  &0100'0000
	.dbline 175
; 	  	   	set_di();
	sbi 0x18,5
	.dbline 176
; 	 	}
	xjmp L26
L25:
	.dbline 178
; 	 	else
; 	 	{
	.dbline 179
; 	  	 	clr_di();
	cbi 0x18,5
	.dbline 180
; 	 	}
L26:
	.dbline 181
	xcall _delay_us
	.dbline 182
	sbi 0x18,7
	.dbline 183
	xcall _delay_us
	.dbline 184
	cbi 0x18,7
	.dbline 185
	xcall _delay_us
	.dbline 186
	cbi 0x18,5
	.dbline 187
L22:
	.dbline 170
	inc R22
	lsl R10
L24:
	.dbline 170
	cpi R22,7
	brlo L21
	.dbline -2
L20:
	xcall pop_gset3
	.dbline 0 ; func end
	ret
	.dbsym r temp_data 20 c
	.dbsym r i 22 c
	.dbsym r s_data 10 c
	.dbend
	.dbfunc e Read _Read fc
;              i -> R20
;      read_data -> R22
;         buffer -> R10
;            add -> R20
	.even
_Read::
	xcall push_gset3

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -