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

📄 project.lst

📁 AVRkaifashili.rar
💻 LST
📖 第 1 页 / 共 5 页
字号:
  Data0                --> R22
  Address              --> R10
  Slave                --> R12
    02E9 DC83      RCALL	push_gset4
    02EA 2EA2      MOV	R10,R18
    02EB 2EC0      MOV	R12,R16
    02EC 8568      LDD	R22,Y+8
    02ED 854A      LDD	R20,Y+10
(0264) 
(0265) //***************************写两字节数据****************************//
(0266) //向从地址为Slave的IIC器件的Address地址开始写两字节数据Data0,Data1
(0267) void Write_2byte(uchar Slave,uchar Address,uchar Data0,uchar Data1)
(0268) {Start();		                       //开始
    02EE DF30      RCALL	_Start
(0269)  Write_Byte(Slave);		               //写I2C器件地址
    02EF 2D0C      MOV	R16,R12
    02F0 DFAF      RCALL	_Write_Byte
(0270)  do Check_Ack();		               //检查应答位
    02F1 DF6E      RCALL	_Check_Ack
(0271)  while(Ack_Flag==1);                  
    02F2 918000B1  LDS	R24,_Ack_Flag
    02F4 3081      CPI	R24,1
    02F5 F3D9      BEQ	0x02F1
(0272)  Write_Byte(Address);                  //送寄存器地址
    02F6 2D0A      MOV	R16,R10
    02F7 DFA8      RCALL	_Write_Byte
(0273)  do Check_Ack();		               //检查应答位
    02F8 DF67      RCALL	_Check_Ack
(0274)  while(Ack_Flag==1);
    02F9 918000B1  LDS	R24,_Ack_Flag
    02FB 3081      CPI	R24,1
    02FC F3D9      BEQ	0x02F8
(0275)  Write_Byte(Data0);
    02FD 2F06      MOV	R16,R22
    02FE DFA1      RCALL	_Write_Byte
(0276)  do Check_Ack();	     	           //检查应答位
    02FF DF60      RCALL	_Check_Ack
(0277)  while(Ack_Flag==1);
    0300 918000B1  LDS	R24,_Ack_Flag
    0302 3081      CPI	R24,1
    0303 F3D9      BEQ	0x02FF
(0278)  Write_Byte(Data1);
    0304 2F04      MOV	R16,R20
    0305 DF9A      RCALL	_Write_Byte
(0279)  do Check_Ack();		               //检查应答位
    0306 DF59      RCALL	_Check_Ack
(0280)  while(Ack_Flag==1);
    0307 918000B1  LDS	R24,_Ack_Flag
    0309 3081      CPI	R24,1
    030A F3D9      BEQ	0x0306
(0281)  Stop();		                       //停止信号
    030B DF21      RCALL	_Stop
(0282) }
    030C DC41      RCALL	pop_gset4
    030D 9508      RET
_Read_1byte:
  x                    --> Y+1
  data0                --> R22
  Address              --> R10
  Slave                --> R20
    030E DC5B      RCALL	push_gset3
    030F 2EA2      MOV	R10,R18
    0310 2F40      MOV	R20,R16
(0283) 
(0284) //***************************读一字节数据****************************//
(0285) //从从地址为Slave的IIC器件的Address地址处读一字节数据
(0286) uchar Read_1byte(uchar Slave,uchar Address)
(0287) {uchar data0,x;
(0288)  do{
(0289)     Start();		                   //开始信号
    0311 DF0D      RCALL	_Start
(0290)     Write_Byte(Slave);		           //写I2C器件地址
    0312 2F04      MOV	R16,R20
    0313 DF8C      RCALL	_Write_Byte
(0291)     Check_Ack();		               //检查应答位
    0314 DF4B      RCALL	_Check_Ack
(0292)    }while(Ack_Flag);              
    0315 902000B1  LDS	R2,_Ack_Flag
    0317 2022      TST	R2
    0318 F7C1      BNE	0x0311
(0293)  do{
(0294)     Write_Byte(Address);		       //写寄存器地址
    0319 2D0A      MOV	R16,R10
    031A DF85      RCALL	_Write_Byte
(0295)     Check_Ack();		               //检查应答位
    031B DF44      RCALL	_Check_Ack
(0296)    }while(Ack_Flag);                   
    031C 902000B1  LDS	R2,_Ack_Flag
    031E 2022      TST	R2
    031F F7C9      BNE	0x0319
(0297)  do{
(0298)     Start();		                   //开始
    0320 DEFE      RCALL	_Start
(0299)     Write_Byte(Slave+1);		       //写I2C器件地址(+1表示为读操作)
    0321 2F04      MOV	R16,R20
    0322 5F0F      SUBI	R16,0xFF
    0323 DF7C      RCALL	_Write_Byte
(0300)     Check_Ack();		               //检查应答位
    0324 DF3B      RCALL	_Check_Ack
(0301)    }while(Ack_Flag);
    0325 902000B1  LDS	R2,_Ack_Flag
    0327 2022      TST	R2
    0328 F7B9      BNE	0x0320
(0302)  data0=Read_Byte();		               //读1字节
    0329 DF85      RCALL	_Read_Byte
    032A 2F60      MOV	R22,R16
(0303)  Nack();		                       //读完发送一个Not Ack应答
    032B DF23      RCALL	_Nack
(0304)  Stop();		                       //停止
    032C DF00      RCALL	_Stop
(0305)  return data0;	                       //返回读取数据
    032D 2F06      MOV	R16,R22
    032E DC1D      RCALL	pop_gset3
    032F 9508      RET
_Led_Display:
  d1                   --> R20
  d0                   --> R22
  Number               --> R20
    0330 DC36      RCALL	push_gset2
    0331 2F40      MOV	R20,R16
    0332 9723      SBIW	R28,3
(0306) }
(0307) 
(0308) //***************************数字显示程序****************************//
(0309) void Led_Display(uchar Number)
(0310) {uchar d0,d1;
(0311)  d0=Number/10;		                   //取站数的个位
    0333 E01A      LDI	R17,0xA
    0334 2F04      MOV	R16,R20
    0335 DBFE      RCALL	div8u
    0336 2F60      MOV	R22,R16
(0312)  d1=Number%10;		                   //取站数的十位
    0337 E01A      LDI	R17,0xA
    0338 2F04      MOV	R16,R20
    0339 DBF8      RCALL	mod8u
    033A 2F40      MOV	R20,R16
(0313)  Write_2byte(0x70,0x20,d1,d0);	       //从显示位0开始连续显示两位
    033B 836A      STD	Y+2,R22
    033C 8348      STD	Y+0,R20
    033D E220      LDI	R18,0x20
    033E E700      LDI	R16,0x70
    033F DFA9      RCALL	_Write_2byte
(0314) }
    0340 9623      ADIW	R28,3
    0341 DC08      RCALL	pop_gset2
    0342 9508      RET
_change:
  m                    --> R20
    0343 DC23      RCALL	push_gset2
(0315) 
(0316) //***************************换下一个字显示**************************//
(0317) void change()
(0318) {unsigned char m;
(0319)  if(!Pre_Flag)				           //报站情形
    0344 902000B0  LDS	R2,_Pre_Flag
    0346 2022      TST	R2
    0347 F009      BEQ	0x0349
    0348 C53C      RJMP	0x0885
(0320)    {switch(State)			           //判断站名
    0349 91400061  LDS	R20,0x61
    034B 2755      CLR	R21
    034C 3041      CPI	R20,1
    034D E0E0      LDI	R30,0
    034E 075E      CPC	R21,R30
    034F F40C      BGE	0x0351
    0350 CA6F      RJMP	0x0DC0
    0351 E180      LDI	R24,0x10
    0352 E090      LDI	R25,0
    0353 1784      CP	R24,R20
    0354 0795      CPC	R25,R21
    0355 F40C      BGE	0x0357
    0356 CA69      RJMP	0x0DC0
    0357 E282      LDI	R24,0x22
    0358 E090      LDI	R25,0
    0359 2F04      MOV	R16,R20
    035A 2F15      MOV	R17,R21
    035B 5001      SUBI	R16,1
    035C 4010      SBCI	R17,0
    035D 0F00      LSL	R16
    035E 1F11      ROL	R17
    035F 0F08      ADD	R16,R24
    0360 1F19      ADC	R17,R25
    0361 DC0E      RCALL	lpm16
    0362 2FE0      MOV	R30,R16
    0363 2FF1      MOV	R31,R17
    0364 9409      IJMP
(0321)       {case 1:				           //若为第1站
(0322)          if(Word_Number<5)	           //判断已显示字数
    0365 918000AB  LDS	R24,_Word_Number
    0367 3085      CPI	R24,5
    0368 F008      BCS	0x036A
    0369 C049      RJMP	0x03B3
(0323)            {if(Word_Number<3)	       //若未显示完“第1站”,则
    036A 3083      CPI	R24,3
    036B F500      BCC	0x038C
(0324)               {for(m=0;m<32;m++)       //依次换字显示“第1站”
    036C 2744      CLR	R20
    036D C01B      RJMP	0x0389
(0325)                    next[m]=State1[Word_Number][m];}	
    036E E025      LDI	R18,5
    036F E030      LDI	R19,0
    0370 910000AB  LDS	R16,_Word_Number
    0372 2711      CLR	R17
    0373 DC38      RCALL	lsl16
    0374 2E20      MOV	R2,R16
    0375 2E31      MOV	R3,R17
    0376 E282      LDI	R24,0x22
    0377 E091      LDI	R25,1
    0378 0E28      ADD	R2,R24
    0379 1E39      ADC	R3,R25
    037A 2E44      MOV	R4,R20
    037B 2455      CLR	R5
    037C 0C42      ADD	R4,R2
    037D 1C53      ADC	R5,R3
    037E 2DE4      MOV	R30,R4
    037F 2DF5      MOV	R31,R5
    0380 95C8      LPM
    0381 E68B      LDI	R24,0x6B
    0382 E090      LDI	R25,0
    0383 2FE4      MOV	R30,R20
    0384 27FF      CLR	R31
    0385 0FE8      ADD	R30,R24
    0386 1FF9      ADC	R31,R25
    0387 8200      STD	Z+0,R0
    0388 9543      INC	R20
    0389 3240      CPI	R20,0x20
    038A F318      BCS	0x036E
    038B C021      RJMP	0x03AD
(0326)             else				
(0327)                for(m=0;m<32;m++)       //依次换字显示“到了”
    038C 2744      CLR	R20
    038D C01D      RJMP	0x03AB
(0328)                    next[m]=DL[Word_Number-3][m];	
    038E E025      LDI	R18,5
    038F E030      LDI	R19,0
    0390 910000AB  LDS	R16,_Word_Number
    0392 2711      CLR	R17
    0393 5003      SUBI	R16,3
    0394 4010      SBCI	R17,0
    0395 DC16      RCALL	lsl16
    0396 2E20      MOV	R2,R16
    0397 2E31      MOV	R3,R17
    0398 EE82      LDI	R24,0xE2
    0399 E090      LDI	R25,0
    039A 0E28      ADD	R2,R24
    039B 1E39      ADC	R3,R25
    039C 2E44      MOV	R4,R20
    039D 2455      CLR	R5
    039E 0C42      ADD	R4,R2
    039F 1C53      ADC	R5,R3
    03A0 2DE4      MOV	R30,R4
    03A1 2DF5      MOV	R31,R5
    03A2 95C8      LPM
    03A3 E68B      LDI	R24,0x6B
    03A4 E090      LDI	R25,0
    03A5 2FE4      MOV	R30,R20
    03A6 27FF      CLR	R31
    03A7 0FE8      ADD	R30,R24
    03A8 1FF9      ADC	R31,R25
    03A9 8200      STD	Z+0,R0
    03AA 9543      INC	R20
    03AB 3240      CPI	R20,0x20
    03AC F308      BCS	0x038E
(0329)             Word_Number++;}		       //显示字数+1
    03AD 918000AB  LDS	R24,_Word_Number
    03AF 5F8F      SUBI	R24,0xFF
    03B0 938000AB  STS	_Word_Number,R24
    03B2 CA0D      RJMP	0x0DC0
(0330)          else					       //若全部显示完,则
(0331)             Word_Number=0;		       //显示字数清0
    03B3 2422      CLR	R2
    03B4 922000AB  STS	_Word_Number,R2
(0332)          break;
    03B6 CA09      RJMP	0x0DC0
(0333)        case 2:				           //若为第2站
(0334)          if(Word_Number<5)	           //判断已显示字数
    03B7 918000AB  LDS	R24,_Word_Number
    03B9 3085      CPI	R24,5
    03BA F008      BCS	0x03BC
    03BB C049      RJMP	0x0405
(0335)            {if(Word_Number<3)	       //若未显示完“第2站”,则
    03BC 3083      CPI	R24,3
    03BD F500      BCC	0x03DE
(0336)               {for(m=0;m<32;m++)       //依次换字显示“第2站”
    03BE 2744      CLR	R20
    03BF C01B      RJMP	0x03DB
(0337)                next[m]=State2[Word_Number][m];}	
    03C0 E025      LDI	R18,5
    03C1 E030      LDI	R19,0
    03C2 910000AB  LDS	R16,_Word_Number
    03C4 2711      CLR	R17
    03C5 DBE6      RCALL	lsl16
    03C6 2E20      MOV	R2,R16
    03C7 2E31      MOV	R3,R17
    03C8 E882      LDI	R24,0x82
    03C9 E091      LDI	R25,1
    03CA 0E28      ADD	R2,R24
    03CB 1E39      ADC	R3,R25
    03CC 2E44      MOV	R4,R20
    03CD 2455      CLR	R5
    03CE 0C42      ADD	R4,R2
    03CF 1C53      ADC	R5,R3
    03D0 2DE4      MOV	R30,R4
    03D1 2DF5      MOV	R31,R5
    03D2 95C8      LPM
    03D3 E68B      LDI	R24,0x6B
    03D4 E090      LDI	R25,0
    03D5 2FE4      MOV	R30,R20
    03D6 27FF      CLR	R31
    03D7 0FE8      ADD	R30,R24
    03D8 1FF9      ADC	R31,R25
    03D9 8200      STD	Z+0,R0
    03DA 9543      INC	R20
    03DB 3240      CPI	R20,0x20
    03DC F318      BCS	0x03C0
    03DD C021      RJMP	0x03FF
(0338)             else				//否则
(0339)               for(m=0;m<32;m++)
    03DE 2744      CLR	R20
    03DF C01D      RJMP	0x03FD
(0340)                  next[m]=DL[Word_Number-3][m];		//依次换字显示“到了”
    03E0 E025      LDI	R18,5
    03E1 E030      LDI	R19,0
    03E2 910000AB  LDS	R16,_Word_Number
    03E4 2711      CLR	R17
    03E5 5003      SUBI	R16,3
    03E6 4010      SBCI	R17,0
    03E7 DBC4      RCALL	lsl16
    03E8 2E20      MOV	R2,R16
    03E9 2E31      MOV	R3,R17
    03EA EE82      LDI	R24,0xE2
    03EB E090      LDI	R25,0
    03EC 0E28      ADD	R2,R24
    03ED 1E39      ADC	R3,R25
    03EE 2E44      MOV	R4,R20
    03EF 2455      CLR	R5
    03F0 0C42      ADD	R4,R2
    03F1 1C53      ADC	R5,R3
    03F2 2DE4      MOV	R30,R4
    03F3 2DF5      MOV	R31,R5
    03F4 95C8      LPM
    03F5 E68B      LDI	R24,0x6B
    03F6 E090      LDI	R25,0
    03F7 2FE4      MOV	R30,R20
    03F8 27FF      CLR	R31
    03F9 0FE8      ADD	R30,R24
    03FA 1FF9      ADC	R31,R25
    03FB 8200      STD	Z+0,R0
    03FC 9543      INC	R20
    03FD 3240      CPI	R20,0x20
    03FE F308      BCS	0x03E0
(0341)             Word_Number++;}		//显示字数+1
    03FF 918000AB  LDS	R24,_Word_Number
    0401 5F8F      SUBI	R24,0xFF
    0402 938000AB  STS	_Word_Number,R24
    0404 C9BB      RJMP	0x0DC0
(0342)          else					//若全部显示完,则
(0343)            Word_Number=0;		//显示字数清0
    0405 2422      CLR	R2
    0406 922000AB  STS	_Word_Number,R2
(0344)          break;
    0408 C9B7      RJMP	0x0DC0
(0345)        case 3:				//若为第3站
(0346)          if(Word_Number<5)	//判断已显示字数
    0409 918000AB  LDS	R24,_Word_Number
    040B 3085      CPI	R24,5
    040C F008      BCS	0x040E
    040D C049      RJMP	0x0457
(0347)            {if(Word_Number<3)	//若未显示完“第3站”,则
    040E 3083      CPI	R24,3
    040F F500      BCC	0x0430
(0348)               {for(m=0;m<32;m++)
    0410 2744      CLR	R20
    0411 C01B      RJMP	0x042D

⌨️ 快捷键说明

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