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

📄 project.lst

📁 AVRkaifashili.rar
💻 LST
📖 第 1 页 / 共 5 页
字号:
(0134)  delay(20000);
    0206 E200      LDI	R16,0x20
    0207 E41E      LDI	R17,0x4E
    0208 DF3E      RCALL	_delay
(0135)  Set_PD(0); 
    0209 2700      CLR	R16
    020A DF4D      RCALL	_Set_PD
(0136)  Seek_Segment(Snd_Welc);		       //搜索相应语音信息段
    020B 9100006A  LDS	R16,0x6A
    020D DF6A      RCALL	_Seek_Segment
(0137)  Play();						       //播放
(0138) }
    020E CF8C      RJMP	_Play
(0139) 
(0140) //****************************I2C驱动程序****************************//
(0141) void Set_SCL(uchar i)                  //定义MAX6959时钟线为PA^7
(0142) {if(i)   PORTA |=0x80;
_Set_SCL:
  i                    --> R16
    020F 2300      TST	R16
    0210 F011      BEQ	0x0213
    0211 9ADF      SBI	0x1B,7
    0212 C003      RJMP	0x0216
(0143)  else    PORTA &=0x7f;
    0213 B38B      IN	R24,0x1B
    0214 778F      ANDI	R24,0x7F
    0215 BB8B      OUT	0x1B,R24
(0144) }
    0216 9508      RET
(0145)  
(0146) void Set_SDA(uchar i)                  //定义MAX6959数据线为PA^6
(0147) {if(i)   PORTA |=0x40;
_Set_SDA:
  i                    --> R16
    0217 2300      TST	R16
    0218 F011      BEQ	0x021B
    0219 9ADE      SBI	0x1B,6
    021A C003      RJMP	0x021E
(0148)  else    PORTA &=0xbf;
    021B B38B      IN	R24,0x1B
    021C 7B8F      ANDI	R24,0xBF
    021D BB8B      OUT	0x1B,R24
(0149) }
    021E 9508      RET
(0150) 
(0151) void Start()                           //I2C总线的开始条件
(0152) {Set_SDA(1);	                       //SDA=1;
_Start:
    021F E001      LDI	R16,1
    0220 DFF6      RCALL	_Set_SDA
(0153)  Set_SCL(1);	                       //SCL=1;
    0221 E001      LDI	R16,1
    0222 DFEC      RCALL	_Set_SCL
(0154)  delay(100);	                       //等待时钟信号变高
    0223 E604      LDI	R16,0x64
    0224 E010      LDI	R17,0
    0225 DF21      RCALL	_delay
(0155)  Set_SDA(0);	                       //SDA=0;
    0226 2700      CLR	R16
    0227 DFEF      RCALL	_Set_SDA
(0156)  delay(100);
    0228 E604      LDI	R16,0x64
    0229 E010      LDI	R17,0
    022A DF1C      RCALL	_delay
(0157)  Set_SCL(0);	                       // SCL=0;
    022B 2700      CLR	R16
(0158) }
    022C CFE2      RJMP	_Set_SCL
(0159) 
(0160) void Stop()                            //I2C总线结束条件
(0161) {Set_SDA(0);	                       //SDA=0;
_Stop:
    022D 2700      CLR	R16
    022E DFE8      RCALL	_Set_SDA
(0162)  delay(100);
    022F E604      LDI	R16,0x64
    0230 E010      LDI	R17,0
    0231 DF15      RCALL	_delay
(0163)  Set_SCL(1);	                       //SCL=1;
    0232 E001      LDI	R16,1
    0233 DFDB      RCALL	_Set_SCL
(0164)  delay(100);	                       //等待时钟信号变低
    0234 E604      LDI	R16,0x64
    0235 E010      LDI	R17,0
    0236 DF10      RCALL	_delay
(0165)  Set_SDA(1);	                       //SDA=1;
    0237 E001      LDI	R16,1
    0238 DFDE      RCALL	_Set_SDA
(0166)  delay(100);
    0239 E604      LDI	R16,0x64
    023A E010      LDI	R17,0
    023B DF0B      RCALL	_delay
(0167)  Set_SCL(0);	                       //SCL=0;
    023C 2700      CLR	R16
(0168) }
    023D CFD1      RJMP	_Set_SCL
(0169) 
(0170) void Ack()                             //I2C总线应答
(0171) {Set_SDA(0);	                       //SDA=0;
_Ack:
    023E 2700      CLR	R16
    023F DFD7      RCALL	_Set_SDA
(0172)  delay(50);
    0240 E302      LDI	R16,0x32
    0241 E010      LDI	R17,0
    0242 DF04      RCALL	_delay
(0173)  Set_SCL(1);	                       //SCL=1;
    0243 E001      LDI	R16,1
    0244 DFCA      RCALL	_Set_SCL
(0174)  delay(100);
    0245 E604      LDI	R16,0x64
    0246 E010      LDI	R17,0
    0247 DEFF      RCALL	_delay
(0175)  Set_SCL(0);	                       //SCL=0;
    0248 2700      CLR	R16
    0249 DFC5      RCALL	_Set_SCL
(0176)  delay(50);
    024A E302      LDI	R16,0x32
    024B E010      LDI	R17,0
    024C DEFA      RCALL	_delay
(0177)  Set_SDA(1);	                       //SDA=1;
    024D E001      LDI	R16,1
(0178) }
    024E CFC8      RJMP	_Set_SDA
(0179) 
(0180) void Nack()                            //I2C总线应答非
(0181) {Set_SDA(1);	                       //SDA=1;
_Nack:
    024F E001      LDI	R16,1
    0250 DFC6      RCALL	_Set_SDA
(0182)  delay(50);
    0251 E302      LDI	R16,0x32
    0252 E010      LDI	R17,0
    0253 DEF3      RCALL	_delay
(0183)  Set_SCL(1);	                       //SCL=1;
    0254 E001      LDI	R16,1
    0255 DFB9      RCALL	_Set_SCL
(0184)  delay(100);
    0256 E604      LDI	R16,0x64
    0257 E010      LDI	R17,0
    0258 DEEE      RCALL	_delay
(0185)  Set_SCL(0);	                       //SCL=0;
    0259 2700      CLR	R16
    025A DFB4      RCALL	_Set_SCL
(0186)  delay(50);
    025B E302      LDI	R16,0x32
    025C E010      LDI	R17,0
    025D DEE9      RCALL	_delay
(0187)  Set_SDA(0);	                       //SDA=0;
    025E 2700      CLR	R16
(0188) }
    025F CFB7      RJMP	_Set_SDA
(0189) 
(0190) void Check_Ack()                       //I2C总线应答检查
(0191) {Set_SDA(1);	                       //SDA=1;
_Check_Ack:
    0260 E001      LDI	R16,1
    0261 DFB5      RCALL	_Set_SDA
(0192)  Set_SCL(1);	                       //SCL=1;
    0262 E001      LDI	R16,1
    0263 DFAB      RCALL	_Set_SCL
(0193)  Ack_Flag=0;	                       //清除应答标志;
    0264 2422      CLR	R2
    0265 922000B1  STS	_Ack_Flag,R2
(0194)  DDRA&=0xbf; 	                       //设置SDA为输入
    0267 B38A      IN	R24,0x1A
    0268 7B8F      ANDI	R24,0xBF
    0269 BB8A      OUT	0x1A,R24
(0195)  if(!((PINA & 0x40)>>6))
    026A B389      IN	R24,0x19
    026B 7480      ANDI	R24,0x40
    026C 9586      LSR	R24
    026D 9586      LSR	R24
    026E 9586      LSR	R24
    026F 9586      LSR	R24
    0270 9586      LSR	R24
    0271 9586      LSR	R24
    0272 2388      TST	R24
    0273 F449      BNE	0x027D
(0196)    {delay(50);
    0274 E302      LDI	R16,0x32
    0275 E010      LDI	R17,0
    0276 DED0      RCALL	_delay
(0197)     Set_SCL(0);	                       //SCL=0;
    0277 2700      CLR	R16
    0278 DF96      RCALL	_Set_SCL
(0198)     delay(100);}
    0279 E604      LDI	R16,0x64
    027A E010      LDI	R17,0
    027B DECB      RCALL	_delay
    027C C00B      RJMP	0x0288
(0199)  else
(0200)    {Ack_Flag=1;	                       //收到应答;
    027D E081      LDI	R24,1
    027E 938000B1  STS	_Ack_Flag,R24
(0201)     delay(50);
    0280 E302      LDI	R16,0x32
    0281 E010      LDI	R17,0
    0282 DEC4      RCALL	_delay
(0202)     Set_SCL(0);	                       //SCL=0;
    0283 2700      CLR	R16
    0284 DF8A      RCALL	_Set_SCL
(0203)     delay(100);}
    0285 E604      LDI	R16,0x64
    0286 E010      LDI	R17,0
    0287 DEBF      RCALL	_delay
(0204)  DDRA |=0xff; 	                       //重新设置SDA为输出	 
    0288 B38A      IN	R24,0x1A
    0289 6F8F      ORI	R24,0xFF
    028A BB8A      OUT	0x1A,R24
(0205) }
    028B 9508      RET
(0206) 
(0207) void Write_Bit0()                      //写1bit数据:0    
(0208) {Set_SDA(0);	                       //SDA=0;
_Write_Bit0:
    028C 2700      CLR	R16
    028D DF89      RCALL	_Set_SDA
(0209)  Set_SCL(1);	                       //SCL=1;
    028E E001      LDI	R16,1
    028F DF7F      RCALL	_Set_SCL
(0210)  delay(100);
    0290 E604      LDI	R16,0x64
    0291 E010      LDI	R17,0
    0292 DEB4      RCALL	_delay
(0211)  Set_SCL(0);	                       //SCL=0;
    0293 2700      CLR	R16
(0212) }
    0294 CF7A      RJMP	_Set_SCL
(0213) 
(0214) void Write_Bit1()                      //写1bit数据:1       
(0215) {Set_SDA(1);	                       //SDA=1;
_Write_Bit1:
    0295 E001      LDI	R16,1
    0296 DF80      RCALL	_Set_SDA
(0216)  Set_SCL(1);	                       //SCL=1;
    0297 E001      LDI	R16,1
    0298 DF76      RCALL	_Set_SCL
(0217)  delay(100);
    0299 E604      LDI	R16,0x64
    029A E010      LDI	R17,0
    029B DEAB      RCALL	_delay
(0218)  Set_SCL(0);	                       //SCL=0;
    029C 2700      CLR	R16
    029D DF71      RCALL	_Set_SCL
(0219)  Set_SDA(0);	                       //SDA=0;
    029E 2700      CLR	R16
(0220) }
    029F CF77      RJMP	_Set_SDA
_Write_Byte:
  i                    --> R20
  Data                 --> R22
    02A0 DCC6      RCALL	push_gset2
    02A1 2F60      MOV	R22,R16
(0221) 
(0222) void Write_Byte(uchar Data)            //写一字节数据Data  
(0223) {uchar i;
(0224)  for(i=0;i<8;i++)
    02A2 2744      CLR	R20
    02A3 C007      RJMP	0x02AB
(0225)   {if(Data & 0x80)  Write_Bit1();      //传输位从高位到低位,先传最高位 
    02A4 FF67      SBRS	R22,7
    02A5 C002      RJMP	0x02A8
    02A6 DFEE      RCALL	_Write_Bit1
    02A7 C001      RJMP	0x02A9
(0226)    else             Write_Bit0();
    02A8 DFE3      RCALL	_Write_Bit0
(0227)    Data <<=1;}                         //数据左移             
    02A9 0F66      LSL	R22
    02AA 9543      INC	R20
    02AB 3048      CPI	R20,0x8
    02AC F3B8      BCS	0x02A4
(0228) }
    02AD DC9C      RCALL	pop_gset2
    02AE 9508      RET
_Read_Byte:
  j                    --> R20
  Read_Data            --> R22
    02AF DCB7      RCALL	push_gset2
(0229) 
(0230) uchar Read_Byte()                      //读一字节数据:返回值即读的数据           
(0231) {uchar Read_Data=0xff;		           // Read_Data为读入的数据,初始值为0xff
    02B0 EF6F      LDI	R22,0xFF
(0232)  uchar j;
(0233)  for (j=0;j<8;j++)
    02B1 2744      CLR	R20
    02B2 C013      RJMP	0x02C6
(0234)   {Set_SDA(1);	   
    02B3 E001      LDI	R16,1
    02B4 DF62      RCALL	_Set_SDA
(0235)    Set_SCL(1);	   
    02B5 E001      LDI	R16,1
    02B6 DF58      RCALL	_Set_SCL
(0236)    DDRA &=0xbf;	   
    02B7 B38A      IN	R24,0x1A
    02B8 7B8F      ANDI	R24,0xBF
    02B9 BB8A      OUT	0x1A,R24
(0237)    if((PINA & 0x40)==0)
    02BA 99CE      SBIC	0x19,6
    02BB C005      RJMP	0x02C1
(0238)      {Read_Data <<=1;
    02BC 0F66      LSL	R22
(0239)       Read_Data=(Read_Data & 0xfe);                 
    02BD 7F6E      ANDI	R22,0xFE
(0240)       Set_SCL(0);}
    02BE 2700      CLR	R16
    02BF DF4F      RCALL	_Set_SCL
    02C0 C004      RJMP	0x02C5
(0241)    else 
(0242)     {Read_Data <<=1;
    02C1 0F66      LSL	R22
(0243)      Read_Data =( Read_Data  | 0x01);
    02C2 6061      ORI	R22,1
(0244)      Set_SCL(0);}}
    02C3 2700      CLR	R16
    02C4 DF4A      RCALL	_Set_SCL
    02C5 9543      INC	R20
    02C6 3048      CPI	R20,0x8
    02C7 F358      BCS	0x02B3
(0245)  DDRA |=0x40;		              
    02C8 9AD6      SBI	0x1A,6
(0246)  return(Read_Data);               
    02C9 2F06      MOV	R16,R22
    02CA DC7F      RCALL	pop_gset2
    02CB 9508      RET
_Write_1byte:
  Data                 --> R20
  Address              --> R22
  Slave                --> R10
    02CC DC9D      RCALL	push_gset3
    02CD 2F62      MOV	R22,R18
    02CE 2EA0      MOV	R10,R16
    02CF 814E      LDD	R20,Y+6
(0247) }
(0248) 
(0249) //***************************写一字节数据****************************//
(0250) //向从地址为Slave的IIC器件的Address地址写一字节数据Data
(0251) void Write_1byte(uchar Slave,uchar Address,uchar Data)
(0252) {Start();		                       //开始
    02D0 DF4E      RCALL	_Start
(0253)  Write_Byte(Slave);		               //写I2C器件地址
    02D1 2D0A      MOV	R16,R10
    02D2 DFCD      RCALL	_Write_Byte
(0254)  do Check_Ack();		               //检查应答位
    02D3 DF8C      RCALL	_Check_Ack
(0255)  while(Ack_Flag==1);
    02D4 918000B1  LDS	R24,_Ack_Flag
    02D6 3081      CPI	R24,1
    02D7 F3D9      BEQ	0x02D3
(0256)  Write_Byte(Address);                  //送寄存器地址
    02D8 2F06      MOV	R16,R22
    02D9 DFC6      RCALL	_Write_Byte
(0257)  do Check_Ack();		               //检查应答位
    02DA DF85      RCALL	_Check_Ack
(0258)  while(Ack_Flag==1);
    02DB 918000B1  LDS	R24,_Ack_Flag
    02DD 3081      CPI	R24,1
    02DE F3D9      BEQ	0x02DA
(0259)  Write_Byte(Data);		               //写入一字节数据
    02DF 2F04      MOV	R16,R20
    02E0 DFBF      RCALL	_Write_Byte
(0260)  do Check_Ack();                       //检查应答位
    02E1 DF7E      RCALL	_Check_Ack
(0261)  while(Ack_Flag==1);
    02E2 918000B1  LDS	R24,_Ack_Flag
    02E4 3081      CPI	R24,1
    02E5 F3D9      BEQ	0x02E1
(0262)  Stop();                               //停止
    02E6 DF46      RCALL	_Stop
(0263) }
    02E7 DC64      RCALL	pop_gset3
    02E8 9508      RET
_Write_2byte:
  Data1                --> R20

⌨️ 快捷键说明

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