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

📄 icc_gmj.lst

📁 一款挂面机的自动化控制源程序
💻 LST
📖 第 1 页 / 共 5 页
字号:
__text_start:
__start:
    0144 E5CF      LDI	R28,0x5F
    0145 E0D4      LDI	R29,4
    0146 BFCD      OUT	0x3D,R28
    0147 BFDE      OUT	0x3E,R29
    0148 51C0      SUBI	R28,0x10
    0149 40D0      SBCI	R29,0
    014A EA0A      LDI	R16,0xAA
    014B 8308      STD	Y+0,R16
    014C 2400      CLR	R0
    014D EDEC      LDI	R30,0xDC
    014E E0F0      LDI	R31,0
    014F E011      LDI	R17,1
    0150 32EC      CPI	R30,0x2C
    0151 07F1      CPC	R31,R17
    0152 F011      BEQ	0x0155
    0153 9201      ST	R0,Z+
    0154 CFFB      RJMP	0x0150
    0155 8300      STD	Z+0,R16
    0156 E0EB      LDI	R30,0xB
    0157 E0F2      LDI	R31,2
    0158 E6A0      LDI	R26,0x60
    0159 E0B0      LDI	R27,0
    015A E012      LDI	R17,2
    015B 38E7      CPI	R30,0x87
    015C 07F1      CPC	R31,R17
    015D F021      BEQ	0x0162
    015E 95C8      LPM
    015F 9631      ADIW	R30,1
    0160 920D      ST	R0,X+
    0161 CFF9      RJMP	0x015B
    0162 940E0A55  CALL	_main
_exit:
    0164 CFFF      RJMP	_exit
_ISendStr:
  i                    --> R20
  no                   --> R22
  s                    --> R10
  suba                 --> R18
  sla                  --> R16
    0165 940E0FB7  CALL	push_gset3
    0167 80AE      LDD	R10,Y+6
    0168 80BF      LDD	R11,Y+7
    0169 8568      LDD	R22,Y+8
FILE: C:\icc\include\h_iic.c
(0001) #include <iom16v.h>
(0002) //TWI状态定义
(0003) //MT 主方式传输  MR 主方式接收
(0004) #define START 0x08 
(0005) #define RE_START 0x10
(0006) #define MT_SLA_ACK 0x18
(0007) #define MT_SLA_NOACK 0x20
(0008) #define MT_DATA_ACK  0x28
(0009) #define MT_DATA_NOACK 0x30
(0010) #define MR_SLA_ACK  0x40
(0011) #define MR_SLA_NOACK 0x48
(0012) #define MR_DATA_ACK 0x50
(0013) #define MR_DATA_NOACK 0x58
(0014) //hardware IIC
(0015) #define TWINT   7
(0016) #define TWEA    6
(0017) #define TWSTA   5
(0018) #define TWSTO   4
(0019) #define TWEN    2 
(0020) 
(0021) //常用TWI操作(主模式写和主模式读)
(0022) #define Start()    	  (TWCR=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN))
(0023) #define Stop()     	  (TWCR=(1<<TWINT)|(1<<TWSTO)|(1<<TWEN))
(0024) #define Wait()	   	  {while(!(TWCR&(1<<TWINT)));}
(0025) #define TestAck() 	  (TWSR&0xf8)
(0026) #define SetAck()	  (TWCR|=(1<<TWEA))
(0027) #define SetNoAck()        (TWCR&=~(1<<TWEA))
(0028) #define TWI()	  	  (TWCR=(1<<TWINT)|(1<<TWEN)) 
(0029) #define TWE()             (TWCR=(1<<TWINT)|(1<<TWEA)|(1<<TWEN))
(0030) #define Write8Bit(x)      {TWDR=(x);TWCR=(1<<TWINT)|(1<<TWEN);} 
(0031) 
(0032) #define zlg7290  0x70
(0033) 
(0034) /******************************************
(0035)                I2C总线写字符串
(0036) 	       返回0:写成功
(0037) 	       返回非0:写失败
(0038) *******************************************/
(0039)       
(0040) unsigned char ISendStr(unsigned char sla,unsigned char suba,unsigned char *s,unsigned char no)
(0041) {     unsigned char i;
(0042)           //CLI();
(0043)           Start();//I2C启动
    016A EA84      LDI	R24,0xA4
    016B BF86      OUT	0x36,R24
(0044) 	  Wait();
    016C B626      IN	R2,0x36
    016D FE27      SBRS	R2,7
    016E CFFD      RJMP	0x016C
(0045) 	  if(TestAck()!=START){Stop(); return 1;}        //ACK
    016F B181      IN	R24,0x01
    0170 7F88      ANDI	R24,0xF8
    0171 3088      CPI	R24,0x8
    0172 F021      BEQ	0x0177
    0173 E984      LDI	R24,0x94
    0174 BF86      OUT	0x36,R24
    0175 E001      LDI	R16,1
    0176 C037      RJMP	0x01AE
(0046) 	  Write8Bit(sla);//写I2C从器件地址和写方式
    0177 B903      OUT	0x03,R16
    0178 E884      LDI	R24,0x84
    0179 BF86      OUT	0x36,R24
(0047) 	  Wait();
    017A B626      IN	R2,0x36
    017B FE27      SBRS	R2,7
    017C CFFD      RJMP	0x017A
(0048) 	  if(TestAck()!=MT_SLA_ACK){Stop(); return 1;}   //ACK
    017D B181      IN	R24,0x01
    017E 7F88      ANDI	R24,0xF8
    017F 3188      CPI	R24,0x18
    0180 F021      BEQ	0x0185
    0181 E984      LDI	R24,0x94
    0182 BF86      OUT	0x36,R24
    0183 E001      LDI	R16,1
    0184 C029      RJMP	0x01AE
(0049) 	  Write8Bit(suba);//写地址
    0185 B923      OUT	0x03,R18
    0186 E884      LDI	R24,0x84
    0187 BF86      OUT	0x36,R24
(0050) 	  for(i=0;i<no;i++)
    0188 2744      CLR	R20
    0189 C014      RJMP	0x019E
(0051) 	  { Wait();
    018A B626      IN	R2,0x36
    018B FE27      SBRS	R2,7
    018C CFFD      RJMP	0x018A
(0052) 	    if(TestAck()!=MT_DATA_ACK){Stop(); return 1;}//ACK
    018D B181      IN	R24,0x01
    018E 7F88      ANDI	R24,0xF8
    018F 3288      CPI	R24,0x28
    0190 F021      BEQ	0x0195
    0191 E984      LDI	R24,0x94
    0192 BF86      OUT	0x36,R24
    0193 E001      LDI	R16,1
    0194 C019      RJMP	0x01AE
(0053) 	    Write8Bit(*s);//写数据
    0195 01F5      MOVW	R30,R10
    0196 8020      LDD	R2,Z+0
    0197 B823      OUT	0x03,R2
    0198 E884      LDI	R24,0x84
    0199 BF86      OUT	0x36,R24
(0054) 	    s++;
    019A 01CF      MOVW	R24,R30
    019B 9601      ADIW	R24,1
    019C 015C      MOVW	R10,R24
    019D 9543      INC	R20
    019E 1746      CP	R20,R22
    019F F350      BCS	0x018A
(0055) 	  }	
(0056) 	  Wait(); 
    01A0 B626      IN	R2,0x36
    01A1 FE27      SBRS	R2,7
    01A2 CFFD      RJMP	0x01A0
(0057) 	  if(TestAck()!=MT_DATA_ACK){Stop(); return 1;}  //ACK	
    01A3 B181      IN	R24,0x01
    01A4 7F88      ANDI	R24,0xF8
    01A5 3288      CPI	R24,0x28
    01A6 F021      BEQ	0x01AB
    01A7 E984      LDI	R24,0x94
    01A8 BF86      OUT	0x36,R24
    01A9 E001      LDI	R16,1
    01AA C003      RJMP	0x01AE
(0058) 	  Stop();//I2C停止
    01AB E984      LDI	R24,0x94
    01AC BF86      OUT	0x36,R24
(0059) 	 // asm("sei");
(0060)  	  return 0;
    01AD 2700      CLR	R16
    01AE 940E0FAA  CALL	pop_gset3
    01B0 9508      RET
_IRcvStr:
  i                    --> R22
  no                   --> R10
  s                    --> R20
  suba                 --> R18
  sla                  --> R16
    01B1 940E0FB7  CALL	push_gset3
    01B3 814E      LDD	R20,Y+6
    01B4 815F      LDD	R21,Y+7
    01B5 84A8      LDD	R10,Y+8
(0061) }
(0062) 
(0063) /******************************************
(0064)                I2C总线读字符串
(0065) 	       如果读失败也返回0,正确返回1;
(0066) *******************************************/
(0067) unsigned char IRcvStr(unsigned char sla,unsigned char suba,unsigned char *s,unsigned char no) 
(0068)       {    
(0069) 	   unsigned char i;
(0070) 	   //asm("cli");
(0071) 	   Start();//I2C启动
    01B6 EA84      LDI	R24,0xA4
    01B7 BF86      OUT	0x36,R24
(0072) 	   Wait();
    01B8 B626      IN	R2,0x36
    01B9 FE27      SBRS	R2,7
    01BA CFFD      RJMP	0x01B8
(0073) 	   if (TestAck()!=START) {Stop(); return 0;}//ACK	   
    01BB B181      IN	R24,0x01
    01BC 7F88      ANDI	R24,0xF8
    01BD 3088      CPI	R24,0x8
    01BE F021      BEQ	0x01C3
    01BF E984      LDI	R24,0x94
    01C0 BF86      OUT	0x36,R24
    01C1 2700      CLR	R16
    01C2 C065      RJMP	0x0228
(0074) 	   Write8Bit(sla);//写I2C从器件地址和写方式
    01C3 B903      OUT	0x03,R16
    01C4 E884      LDI	R24,0x84
    01C5 BF86      OUT	0x36,R24
(0075) 	   Wait(); 
    01C6 B626      IN	R2,0x36
    01C7 FE27      SBRS	R2,7
    01C8 CFFD      RJMP	0x01C6
(0076) 	   if (TestAck()!=MT_SLA_ACK) {Stop(); return 0;}//ACK
    01C9 B181      IN	R24,0x01
    01CA 7F88      ANDI	R24,0xF8
    01CB 3188      CPI	R24,0x18
    01CC F021      BEQ	0x01D1
    01CD E984      LDI	R24,0x94
    01CE BF86      OUT	0x36,R24
    01CF 2700      CLR	R16
    01D0 C057      RJMP	0x0228
(0077) 	   Write8Bit(suba);//写地址
    01D1 B923      OUT	0x03,R18
    01D2 E884      LDI	R24,0x84
    01D3 BF86      OUT	0x36,R24
(0078) 	   Wait();
    01D4 B626      IN	R2,0x36
    01D5 FE27      SBRS	R2,7
    01D6 CFFD      RJMP	0x01D4
(0079) 	   if (TestAck()!=MT_DATA_ACK) {Stop(); return 0;}
    01D7 B181      IN	R24,0x01
    01D8 7F88      ANDI	R24,0xF8
    01D9 3288      CPI	R24,0x28
    01DA F021      BEQ	0x01DF
    01DB E984      LDI	R24,0x94
    01DC BF86      OUT	0x36,R24
    01DD 2700      CLR	R16
    01DE C049      RJMP	0x0228
(0080) 	   Start();//I2C重新启动
    01DF EA84      LDI	R24,0xA4
    01E0 BF86      OUT	0x36,R24
(0081) 	   Wait();
    01E1 B626      IN	R2,0x36
    01E2 FE27      SBRS	R2,7
    01E3 CFFD      RJMP	0x01E1
(0082) 	   if (TestAck()!=RE_START)  {Stop(); return 0;}
    01E4 B181      IN	R24,0x01
    01E5 7F88      ANDI	R24,0xF8
    01E6 3180      CPI	R24,0x10
    01E7 F021      BEQ	0x01EC
    01E8 E984      LDI	R24,0x94
    01E9 BF86      OUT	0x36,R24
    01EA 2700      CLR	R16
    01EB C03C      RJMP	0x0228
(0083) 	   Write8Bit(sla+1);//写I2C从器件地址和读方式
    01EC 2F80      MOV	R24,R16
    01ED 5F8F      SUBI	R24,0xFF
    01EE B983      OUT	0x03,R24
    01EF E884      LDI	R24,0x84
    01F0 BF86      OUT	0x36,R24
(0084) 	   Wait();
    01F1 B626      IN	R2,0x36
    01F2 FE27      SBRS	R2,7
    01F3 CFFD      RJMP	0x01F1
(0085) 	   if(TestAck()!=MR_SLA_ACK)   {Stop(); return 0;}//ACK 
    01F4 B181      IN	R24,0x01
    01F5 7F88      ANDI	R24,0xF8
    01F6 3480      CPI	R24,0x40
    01F7 F021      BEQ	0x01FC
    01F8 E984      LDI	R24,0x94
    01F9 BF86      OUT	0x36,R24
    01FA 2700      CLR	R16
    01FB C02C      RJMP	0x0228
(0086) 	   for(i=0;i<no-1;i++)
    01FC 2766      CLR	R22
    01FD C013      RJMP	0x0211
(0087) 	   {  TWE();//启动主I2C读方式
    01FE EC84      LDI	R24,0xC4
    01FF BF86      OUT	0x36,R24
(0088) 	      Wait();
    0200 B626      IN	R2,0x36
    0201 FE27      SBRS	R2,7
    0202 CFFD      RJMP	0x0200
(0089) 	      if(TestAck()!=MR_DATA_ACK)  {Stop(); return 0;};//ACK
    0203 B181      IN	R24,0x01
    0204 7F88      ANDI	R24,0xF8
    0205 3580      CPI	R24,0x50
    0206 F021      BEQ	0x020B
    0207 E984      LDI	R24,0x94
    0208 BF86      OUT	0x36,R24
    0209 2700      CLR	R16
    020A C01D      RJMP	0x0228
(0090) 	      *s=TWDR;//读取I2C接收数据
    020B B023      IN	R2,0x03
    020C 01FA      MOVW	R30,R20
    020D 8220      STD	Z+0,R2
(0091) 	      s++;
    020E 5F4F      SUBI	R20,0xFF
    020F 4F5F      SBCI	R21,0xFF
    0210 9563      INC	R22
    0211 2D8A      MOV	R24,R10
    0212 5081      SUBI	R24,1
    0213 1768      CP	R22,R24
    0214 F348      BCS	0x01FE
(0092) 	   }
(0093) 	   TWI();//启动主I2C读方式
    0215 E884      LDI	R24,0x84
    0216 BF86      OUT	0x36,R24
(0094) 	   Wait();
    0217 B626      IN	R2,0x36
    0218 FE27      SBRS	R2,7
    0219 CFFD      RJMP	0x0217
(0095) 	   if(TestAck()!=MR_DATA_NOACK)  {Stop(); return 0;}//ACK	
    021A B181      IN	R24,0x01
    021B 7F88      ANDI	R24,0xF8
    021C 3588      CPI	R24,0x58
    021D F021      BEQ	0x0222
    021E E984      LDI	R24,0x94
    021F BF86      OUT	0x36,R24
    0220 2700      CLR	R16
    0221 C006      RJMP	0x0228
(0096) 	   *s=TWDR;//读取I2C接收数据	
    0222 B023      IN	R2,0x03
    0223 01FA      MOVW	R30,R20
    0224 8220      STD	Z+0,R2
(0097) 	   Stop();//I2C停止 
    0225 E984      LDI	R24,0x94
    0226 BF86      OUT	0x36,R24
(0098) 	  // asm("sei");
(0099) 	   return 1;
    0227 E001      LDI	R16,1
    0228 940E0FAA  CALL	pop_gset3
    022A 9508      RET
_ZLG7290_SendData:
  Data                 --> Y+5
  SubAdd               --> R20
    022B 933A      ST	R19,-Y
    022C 932A      ST	R18,-Y
    022D 940E0FBB  CALL	push_gset1
    022F 2F40      MOV	R20,R16
    0230 9723      SBIW	R28,3
(0100)       }
(0101) unsigned char ZLG7290_SendData(unsigned char SubAdd,unsigned char Data)
(0102) {
(0103) 	if(SubAdd>0x17)
    0231 E187      LDI	R24,0x17
    0232 1784      CP	R24,R20
    0233 F410      BCC	0x0236
(0104) 	return 0;
    0234 2700      CLR	R16
    0235 C00A      RJMP	0x0240
(0105) 	ISendStr(zlg7290,SubAdd,&Data,1);
    0236 E081      LDI	R24,1
    0237 838A      STD	Y+2,R24
    0238 01CE      MOVW	R24,R28
    0239 9605      ADIW	R24,5
    023A 8399      STD	Y+1,R25
    023B 8388      STD	Y+0,R24
    023C 2F24      MOV	R18,R20
    023D E700      LDI	R16,0x70
    023E DF26      RCALL	_ISendStr
(0106)        //	delay_ms(10);
(0107) 	return 1;
    023F E001      LDI	R16,1
    0240 9623      ADIW	R28,3
    0241 940E0FBE  CALL	pop_gset1
    0243 9622      ADIW	R28,2
    0244 9508      RET
_ZLG7290_SendCmd:
  Data                 --> Y+3
  Data2                --> R20
  Data1                --> R22
    0245 940E0FB9  CALL	push_gset2
    0247 2F42      MOV	R20,R18
    0248 2F60      MOV	R22,R16
    0249 9725      SBIW	R28,5
(0108) }
(0109) //向zlg7290命令缓冲区发送命令(2个字节)
(0110) unsigned char ZLG7290_SendCmd(unsigned char Data1,unsigned char Data2)
(0111) {  
(0112)     unsigned char Data[2];
(0113) 	Data[0]=Data1;
    024A 836B      STD	Y+3,R22
(0114) 	Data[1]=Data2;
    024B 834C      STD	Y+4,R20
(0115) 	ISendStr(zlg7290,0x07,Data,2);
    024C E082      LDI	R24,2
    024D 838A      STD	Y+2,R24
    024E 01CE      MOVW	R24,R28
    024F 9603      ADIW	R24,3
    0250 8399      STD	Y+1,R25
    0251 8388      STD	Y+0,R24
    0252 E027      LDI	R18,7
    0253 E700      LDI	R16,0x70
    0254 DF10      RCALL	_ISendStr
(0116)        //	delay_ms(10);
(0117) 	return 1;
    0255 E001      LDI	R16,1
    0256 9625      ADIW	R28,5

⌨️ 快捷键说明

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