📄 project.lst
字号:
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 + -