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

📄 main.lst

📁 基于AVR单片机的24C02的仿真源码 用PROTUES软件
💻 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 52C0      SUBI	R28,0x20
    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 940E018F  CALL	_main
_exit:
    004A CFFF      RJMP	_exit
FILE: D:\avr\+++精华+++\24c02\delay.h
(0001) /*-----------------------------------------------------------------------
(0002) 延时函数
(0003) 编译器:ICC-AVR v6.31A 日期: 2005-11-24 20:29:57
(0004) 目标芯片 : M16
(0005) 时钟: 8.0000Mhz
(0006) 作者:archeng504
(0007) -----------------------------------------------------------------------*/
(0008) #ifndef __delay_h
(0009) #define __delay_h
(0010) void delay_nus(unsigned int n);
(0011) void delay_nms(unsigned int n);
(0012) void delay_1us(void);
(0013) void delay_1ms(void) ; 
(0014) 
(0015) void delay_1us(void)                 //1us延时函数
(0016)   {
(0017)    asm("nop");
_delay_1us:
    004B 0000      NOP
    004C 9508      RET
_delay_nus:
  i                    --> R20
  n                    --> R22
    004D 940E01C9  CALL	push_gset2
    004F 01B8      MOVW	R22,R16
(0018)   }
(0019) 
(0020) void delay_nus(unsigned int n)       //N us延时函数
(0021)   {
(0022)    unsigned int i=0;
    0050 2744      CLR	R20
    0051 2755      CLR	R21
(0023)    for (i=0;i<n;i++)
    0052 C003      RJMP	0x0056
(0024)    delay_1us();
    0053 DFF7      RCALL	_delay_1us
    0054 5F4F      SUBI	R20,0xFF
    0055 4F5F      SBCI	R21,0xFF
    0056 1746      CP	R20,R22
    0057 0757      CPC	R21,R23
    0058 F3D0      BCS	0x0053
    0059 940E01BD  CALL	pop_gset2
    005B 9508      RET
(0025)   }
(0026)   
(0027) void delay_1ms(void)                 //1ms延时函数
(0028)   {
(0029)    unsigned int i;
(0030)    for (i=0;i<1140;i++);
_delay_1ms:
  i                    --> R16
    005C 2700      CLR	R16
    005D 2711      CLR	R17
    005E C002      RJMP	0x0061
    005F 5F0F      SUBI	R16,0xFF
    0060 4F1F      SBCI	R17,0xFF
    0061 3704      CPI	R16,0x74
    0062 E0E4      LDI	R30,4
    0063 071E      CPC	R17,R30
    0064 F3D0      BCS	0x005F
    0065 9508      RET
_delay_nms:
  i                    --> R20
  n                    --> R22
    0066 940E01C9  CALL	push_gset2
    0068 01B8      MOVW	R22,R16
(0031)   }
(0032)   
(0033) void delay_nms(unsigned int n)       //N ms延时函数
(0034)   {
(0035)    unsigned int i=0;
    0069 2744      CLR	R20
    006A 2755      CLR	R21
(0036)    for (i=0;i<n;i++)
    006B C003      RJMP	0x006F
(0037)    delay_1ms();
    006C DFEF      RCALL	_delay_1ms
    006D 5F4F      SUBI	R20,0xFF
    006E 4F5F      SBCI	R21,0xFF
    006F 1746      CP	R20,R22
    0070 0757      CPC	R21,R23
    0071 F3D0      BCS	0x006C
    0072 940E01BD  CALL	pop_gset2
    0074 9508      RET
_I2C_Write:
  RegAddress           --> R22
  Wdata                --> R20
    0075 940E01C9  CALL	push_gset2
    0077 2F62      MOV	R22,R18
    0078 2F40      MOV	R20,R16
FILE: D:\avr\+++精华+++\24c02\I2C.h
(0001) #include <macros.h>
(0002) #include "delay.h"
(0003) 
(0004) //I2C 状态定义
(0005) //MT 主方式传输 MR 主方式接受
(0006) #define START			0x08
(0007) #define RE_START		0x10
(0008) #define MT_SLA_ACK		0x18
(0009) #define MT_SLA_NOACK 	0x20
(0010) #define MT_DATA_ACK		0x28
(0011) #define MT_DATA_NOACK	0x30
(0012) #define MR_SLA_ACK		0x40
(0013) #define MR_SLA_NOACK	0x48
(0014) #define MR_DATA_ACK		0x50
(0015) #define MR_DATA_NOACK	0x58		
(0016) 
(0017) #define RD_DEVICE_ADDR 0xA1
(0018) #define WD_DEVICE_ADDR 0xA0
(0019) 
(0020) //常用TWI操作(主模式写和读)
(0021) #define Start()			(TWCR=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN))		//启动I2C
(0022) #define Stop()			(TWCR=(1<<TWINT)|(1<<TWSTO)|(1<<TWEN))		//停止I2C
(0023) #define Wait()			{while(!(TWCR&(1<<TWINT)));}				//等待中断发生
(0024) #define TestAck()		(TWSR&0xf8)									//观察返回状态
(0025) #define SetAck			(TWCR|=(1<<TWEA))							//做出ACK应答
(0026) #define SetNoAck		(TWCR&=~(1<<TWEA))							//做出Not Ack应答
(0027) #define Twi()			(TWCR=(1<<TWINT)|(1<<TWEN))				    //启动I2C
(0028) #define Write8Bit(x)	{TWDR=(x);TWCR=(1<<TWINT)|(1<<TWEN);}		//写数据到TWDR
(0029) 
(0030) unsigned char I2C_Write(unsigned char Wdata,unsigned char RegAddress);
(0031) unsigned char I2C_Read(unsigned RegAddress);
(0032) 
(0033) /*********************************************
(0034) I2C总线写一个字节
(0035) 返回0:写成功
(0036) 返回1:写失败
(0037) **********************************************/
(0038) unsigned char I2C_Write(unsigned char Wdata,unsigned char RegAddress)
(0039) {
(0040) 	
(0041) 	  Start();						//I2C启动
    0079 EA84      LDI	R24,0xA4
    007A BF86      OUT	0x36,R24
(0042) 	  Wait();
    007B B626      IN	R2,0x36
    007C FE27      SBRS	R2,7
    007D CFFD      RJMP	0x007B
(0043) 	  if(TestAck()!=START) 
    007E B181      IN	R24,0x01
    007F 7F88      ANDI	R24,0xF8
    0080 3088      CPI	R24,0x8
    0081 F011      BEQ	0x0084
(0044) 		return 1;					//ACK
    0082 E001      LDI	R16,1
    0083 C02B      RJMP	0x00AF
(0045) 	  
(0046) 	  Write8Bit(WD_DEVICE_ADDR);	//写I2C从器件地址和写方式
    0084 EA80      LDI	R24,0xA0
    0085 B983      OUT	0x03,R24
    0086 E884      LDI	R24,0x84
    0087 BF86      OUT	0x36,R24
(0047) 	  Wait();
    0088 B626      IN	R2,0x36
    0089 FE27      SBRS	R2,7
    008A CFFD      RJMP	0x0088
(0048) 	  if(TestAck()!=MT_SLA_ACK) 
    008B B181      IN	R24,0x01
    008C 7F88      ANDI	R24,0xF8
    008D 3188      CPI	R24,0x18
    008E F011      BEQ	0x0091
(0049) 		return 1;					//ACK
    008F E001      LDI	R16,1
    0090 C01E      RJMP	0x00AF
(0050) 	  
(0051) 	  Write8Bit(RegAddress);		//写器件相应寄存器地址
    0091 B963      OUT	0x03,R22
    0092 E884      LDI	R24,0x84
    0093 BF86      OUT	0x36,R24
(0052) 	  Wait();
    0094 B626      IN	R2,0x36
    0095 FE27      SBRS	R2,7
    0096 CFFD      RJMP	0x0094
(0053) 	  if(TestAck()!=MT_DATA_ACK) 
    0097 B181      IN	R24,0x01
    0098 7F88      ANDI	R24,0xF8
    0099 3288      CPI	R24,0x28
    009A F011      BEQ	0x009D
(0054) 	  	return 1;				    //ACK
    009B E001      LDI	R16,1
    009C C012      RJMP	0x00AF
(0055) 	  
(0056) 	  Write8Bit(Wdata);			 	//写数据到器件相应寄存器
    009D B943      OUT	0x03,R20
    009E E884      LDI	R24,0x84
    009F BF86      OUT	0x36,R24
(0057) 	  Wait();
    00A0 B626      IN	R2,0x36
    00A1 FE27      SBRS	R2,7
    00A2 CFFD      RJMP	0x00A0
(0058) 	  if(TestAck()!=MT_DATA_ACK) 
    00A3 B181      IN	R24,0x01
    00A4 7F88      ANDI	R24,0xF8
    00A5 3288      CPI	R24,0x28
    00A6 F011      BEQ	0x00A9
(0059) 	  	return 1;				    //ACK	
    00A7 E001      LDI	R16,1
    00A8 C006      RJMP	0x00AF
(0060) 	  
(0061) 	  Stop();  						//I2C停止
    00A9 E984      LDI	R24,0x94
    00AA BF86      OUT	0x36,R24
(0062)  	  delay_nms(10);				//延时
    00AB E00A      LDI	R16,0xA
    00AC E010      LDI	R17,0
    00AD DFB8      RCALL	_delay_nms
(0063) 	  return 0;
    00AE 2700      CLR	R16
    00AF 940E01BD  CALL	pop_gset2
    00B1 9508      RET
_I2C_Read:
  temp                 --> R20
  RegAddress           --> R16
    00B2 940E01CB  CALL	push_gset1
(0064) }
(0065) 
(0066) /*********************************************
(0067) I2C总线读一个字节
(0068) 返回0:读成功
(0069) 返回1:读失败
(0070) **********************************************/
(0071) 
(0072) unsigned char I2C_Read(unsigned RegAddress)
(0073) 
(0074)  {
(0075) 	   unsigned char temp;
(0076) 	   Start();//I2C启动
    00B4 EA84      LDI	R24,0xA4
    00B5 BF86      OUT	0x36,R24
(0077) 	   Wait();
    00B6 B626      IN	R2,0x36
    00B7 FE27      SBRS	R2,7
    00B8 CFFD      RJMP	0x00B6
(0078) 	   if (TestAck()!=START) 
    00B9 B181      IN	R24,0x01
    00BA 7F88      ANDI	R24,0xF8
    00BB 3088      CPI	R24,0x8
    00BC F011      BEQ	0x00BF
(0079) 	   	  return 1;			 		//ACK	   
    00BD E001      LDI	R16,1
    00BE C040      RJMP	0x00FF
(0080) 	   
(0081) 	   Write8Bit(WD_DEVICE_ADDR);	//写I2C从器件地址和写方式
    00BF EA80      LDI	R24,0xA0
    00C0 B983      OUT	0x03,R24
    00C1 E884      LDI	R24,0x84
    00C2 BF86      OUT	0x36,R24
(0082) 	   Wait(); 
    00C3 B626      IN	R2,0x36
    00C4 FE27      SBRS	R2,7
    00C5 CFFD      RJMP	0x00C3
(0083) 	   if (TestAck()!=MT_SLA_ACK) 
    00C6 B181      IN	R24,0x01
    00C7 7F88      ANDI	R24,0xF8
    00C8 3188      CPI	R24,0x18
    00C9 F011      BEQ	0x00CC
(0084) 	   	  return 1;				    //ACK
    00CA E001      LDI	R16,1
    00CB C033      RJMP	0x00FF
(0085) 	   
(0086) 	   Write8Bit(RegAddress);		//写器件相应寄存器地址
    00CC B903      OUT	0x03,R16
    00CD E884      LDI	R24,0x84
    00CE BF86      OUT	0x36,R24
(0087) 	   Wait();
    00CF B626      IN	R2,0x36
    00D0 FE27      SBRS	R2,7
    00D1 CFFD      RJMP	0x00CF
(0088) 	   if (TestAck()!=MT_DATA_ACK) 
    00D2 B181      IN	R24,0x01
    00D3 7F88      ANDI	R24,0xF8
    00D4 3288      CPI	R24,0x28
    00D5 F011      BEQ	0x00D8
(0089) 	   	  return 1;
    00D6 E001      LDI	R16,1
    00D7 C027      RJMP	0x00FF
(0090) 	   
(0091) 	   Start();	   				   	//I2C重新启动
    00D8 EA84      LDI	R24,0xA4
    00D9 BF86      OUT	0x36,R24
(0092) 	   Wait();
    00DA B626      IN	R2,0x36
    00DB FE27      SBRS	R2,7
    00DC CFFD      RJMP	0x00DA
(0093) 	   if (TestAck()!=RE_START)  
    00DD B181      IN	R24,0x01
    00DE 7F88      ANDI	R24,0xF8
    00DF 3180      CPI	R24,0x10
    00E0 F011      BEQ	0x00E3
(0094) 	   	  return 1;
    00E1 E001      LDI	R16,1
    00E2 C01C      RJMP	0x00FF
(0095) 	   
(0096) 	   Write8Bit(RD_DEVICE_ADDR);	//写I2C从器件地址和读方式
    00E3 EA81      LDI	R24,0xA1
    00E4 B983      OUT	0x03,R24
    00E5 E884      LDI	R24,0x84
    00E6 BF86      OUT	0x36,R24
(0097) 	   Wait();
    00E7 B626      IN	R2,0x36
    00E8 FE27      SBRS	R2,7
    00E9 CFFD      RJMP	0x00E7
(0098) 	   if(TestAck()!=MR_SLA_ACK)  
    00EA B181      IN	R24,0x01
    00EB 7F88      ANDI	R24,0xF8
    00EC 3480      CPI	R24,0x40
    00ED F011      BEQ	0x00F0
(0099) 	   	  return 1;				   //ACK
    00EE E001      LDI	R16,1
    00EF C00F      RJMP	0x00FF
(0100) 	   
(0101) 	   Twi();	 				   //启动主I2C读方式
    00F0 E884      LDI	R24,0x84
    00F1 BF86      OUT	0x36,R24
(0102) 	   Wait();
    00F2 B626      IN	R2,0x36
    00F3 FE27      SBRS	R2,7
    00F4 CFFD      RJMP	0x00F2
(0103) 	   if(TestAck()!=MR_DATA_NOACK) 
    00F5 B181      IN	R24,0x01
    00F6 7F88      ANDI	R24,0xF8
    00F7 3588      CPI	R24,0x58
    00F8 F011      BEQ	0x00FB
(0104) 	   	 return 1;					//ACK	
    00F9 E001      LDI	R16,1
    00FA C004      RJMP	0x00FF
(0105) 	   
(0106) 	   temp=TWDR;//读取I2C接收数据
    00FB B143      IN	R20,0x03
(0107)        Stop();//I2C停止
    00FC E984      LDI	R24,0x94
    00FD BF86      OUT	0x36,R24
(0108) 	   return temp;
    00FE 2F04      MOV	R16,R20
    00FF 940E01CE  CALL	pop_gset1
    0101 9508      RET
FILE: D:\avr\+++精华+++\24c02\1602.h
(0001) 
(0002) /* 用法:
(0003)    LCD_init();
(0004)    LCD_write_string(列,行,"字符串");
(0005)    LCD_write_char(列,行,'字符'); 
(0006)  ---------------------------------------------------------------
(0007) 下面是AVR与LCD连接信息

⌨️ 快捷键说明

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