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

📄 at93c46.lst

📁 93c46的驱动程序,C51代码
💻 LST
📖 第 1 页 / 共 2 页
字号:
__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 + -