📄 计算器.lst
字号:
0243 F459 BNE 0x024F
0244 2422 CLR R2
0245 92200071 STS flag_a1,R2
0247 90200073 LDS R2,key
0249 92200074 STS flag_count,R2
024B 2422 CLR R2
024C 92200077 STS i,R2
024E C026 RJMP 0x0275
(0052) //运算符号记录,按下运算符号表示第一个数输入完成
(0053) else if(key=='=')
024F 91800073 LDS R24,key
0251 338D CPI R24,0x3D
0252 F4D9 BNE 0x026E
(0054) {
(0055)
(0056) ok='=';
0253 E38D LDI R24,0x3D
0254 93800075 STS ok,R24
(0057) if(flag_a2==1&&a2[0]==32)
0256 91800072 LDS R24,flag_a2
0258 3081 CPI R24,1
0259 F479 BNE 0x0269
025A 91800065 LDS R24,a2
025C 3280 CPI R24,0x20
025D F459 BNE 0x0269
(0058) {error=1;
025E E081 LDI R24,1
025F 93800076 STS error,R24
(0059)
(0060) LCD_write_string(10,1,"ERROR");
0261 E988 LDI R24,0x98
0262 E090 LDI R25,0
0263 8399 STD Y+1,R25
0264 8388 STD Y+0,R24
0265 E021 LDI R18,1
0266 E00A LDI R16,0xA
0267 DE97 RCALL _LCD_write_string
(0061) }//如果第二个数没有输入着输入有错
0268 C00C RJMP 0x0275
(0062) else
(0063) {process_data();
0269 D0A3 RCALL _process_data
(0064) flag_a2=0;}//按下等于号表示第二个数输入完成
026A 2422 CLR R2
026B 92200072 STS flag_a2,R2
(0065) }
026D C007 RJMP 0x0275
(0066)
(0067) else if(key=='R')i=0;//如果复位着数字位标志也要复位
026E 91800073 LDS R24,key
0270 3582 CPI R24,0x52
0271 F419 BNE 0x0275
0272 2422 CLR R2
0273 92200077 STS i,R2
(0068) key_display();//输入接受完毕,调用显示函数显示输入值
0275 D002 RCALL _key_display
0276 9622 ADIW R28,2
0277 9508 RET
_key_display:
i --> R20
0278 940E06CE CALL push_gset1
027A 9722 SBIW R28,2
(0069) }
(0070)
(0071) void key_display(void)//按键显示函数
(0072) {unsigned char i;
(0073)
(0074) if(key!=0x00&&key!='R')//如果不是按下复位按键着显示,没有输入到的地方都是空格(ASCII=32)
027B 90200073 LDS R2,key
027D 2022 TST R2
027E F409 BNE 0x0280
027F C043 RJMP 0x02C3
0280 2D82 MOV R24,R2
0281 3582 CPI R24,0x52
0282 F409 BNE 0x0284
0283 C03F RJMP 0x02C3
(0075) {LCD_write_char(0,1,a1[0]);
0284 90200060 LDS R2,a1
0286 8228 STD Y+0,R2
0287 E021 LDI R18,1
0288 2700 CLR R16
0289 DE8B RCALL _LCD_write_char
(0076) LCD_write_char(1,1,a1[1]);
028A 90200061 LDS R2,a1+1
028C 8228 STD Y+0,R2
028D E021 LDI R18,1
028E E001 LDI R16,1
028F DE85 RCALL _LCD_write_char
(0077) LCD_write_char(2,1,a1[2]);
0290 90200062 LDS R2,a1+2
0292 8228 STD Y+0,R2
0293 E021 LDI R18,1
0294 E002 LDI R16,2
0295 DE7F RCALL _LCD_write_char
(0078) LCD_write_char(3,1,a1[3]);
0296 90200063 LDS R2,a1+3
0298 8228 STD Y+0,R2
0299 E021 LDI R18,1
029A E003 LDI R16,3
029B DE79 RCALL _LCD_write_char
(0079) LCD_write_char(4,1,flag_count);
029C 90200074 LDS R2,flag_count
029E 8228 STD Y+0,R2
029F E021 LDI R18,1
02A0 E004 LDI R16,4
02A1 DE73 RCALL _LCD_write_char
(0080) LCD_write_char(5,1,a2[0]);
02A2 90200065 LDS R2,a2
02A4 8228 STD Y+0,R2
02A5 E021 LDI R18,1
02A6 E005 LDI R16,5
02A7 DE6D RCALL _LCD_write_char
(0081) LCD_write_char(6,1,a2[1]);
02A8 90200066 LDS R2,a2+1
02AA 8228 STD Y+0,R2
02AB E021 LDI R18,1
02AC E006 LDI R16,6
02AD DE67 RCALL _LCD_write_char
(0082) LCD_write_char(7,1,a2[2]);
02AE 90200067 LDS R2,a2+2
02B0 8228 STD Y+0,R2
02B1 E021 LDI R18,1
02B2 E007 LDI R16,7
02B3 DE61 RCALL _LCD_write_char
(0083) LCD_write_char(8,1,a2[3]);
02B4 90200068 LDS R2,a2+3
02B6 8228 STD Y+0,R2
02B7 E021 LDI R18,1
02B8 E008 LDI R16,0x8
02B9 DE5B RCALL _LCD_write_char
(0084) LCD_write_char(9,1,ok);
02BA 90200075 LDS R2,ok
02BC 8228 STD Y+0,R2
02BD E021 LDI R18,1
02BE E009 LDI R16,0x9
02BF DE55 RCALL _LCD_write_char
(0085)
(0086) key=0x00;
02C0 2422 CLR R2
02C1 92200073 STS key,R2
(0087) }
(0088) if(key!=0x00&&key=='R')//复位按键
02C3 90200073 LDS R2,key
02C5 2022 TST R2
02C6 F409 BNE 0x02C8
02C7 C041 RJMP 0x0309
02C8 2D82 MOV R24,R2
02C9 3582 CPI R24,0x52
02CA F009 BEQ 0x02CC
02CB C03D RJMP 0x0309
(0089) {
(0090) LCD_write_string(0,1," ");
02CC E887 LDI R24,0x87
02CD E090 LDI R25,0
02CE 8399 STD Y+1,R25
02CF 8388 STD Y+0,R24
02D0 E021 LDI R18,1
02D1 2700 CLR R16
02D2 DE2C RCALL _LCD_write_string
(0091) for(i=0;i<5;i++)a1[i]=32;
02D3 2744 CLR R20
02D4 C009 RJMP 0x02DE
02D5 E680 LDI R24,0x60
02D6 E090 LDI R25,0
02D7 2FE4 MOV R30,R20
02D8 27FF CLR R31
02D9 0FE8 ADD R30,R24
02DA 1FF9 ADC R31,R25
02DB E280 LDI R24,0x20
02DC 8380 STD Z+0,R24
02DD 9543 INC R20
02DE 3045 CPI R20,5
02DF F3A8 BCS 0x02D5
(0092) for(i=0;i<5;i++)a2[i]=32;
02E0 2744 CLR R20
02E1 C009 RJMP 0x02EB
02E2 E685 LDI R24,0x65
02E3 E090 LDI R25,0
02E4 2FE4 MOV R30,R20
02E5 27FF CLR R31
02E6 0FE8 ADD R30,R24
02E7 1FF9 ADC R31,R25
02E8 E280 LDI R24,0x20
02E9 8380 STD Z+0,R24
02EA 9543 INC R20
02EB 3045 CPI R20,5
02EC F3A8 BCS 0x02E2
(0093) for(i=0;i<7;i++)result_dp[i]=32;
02ED 2744 CLR R20
02EE C009 RJMP 0x02F8
02EF E68A LDI R24,0x6A
02F0 E090 LDI R25,0
02F1 2FE4 MOV R30,R20
02F2 27FF CLR R31
02F3 0FE8 ADD R30,R24
02F4 1FF9 ADC R31,R25
02F5 E280 LDI R24,0x20
02F6 8380 STD Z+0,R24
02F7 9543 INC R20
02F8 3047 CPI R20,7
02F9 F3A8 BCS 0x02EF
(0094) flag_a1=1;
02FA E081 LDI R24,1
02FB 93800071 STS flag_a1,R24
(0095) flag_a2=1;
02FD 93800072 STS flag_a2,R24
(0096) key=0x00;
02FF 2422 CLR R2
0300 92200073 STS key,R2
(0097) flag_count=32;
0302 E280 LDI R24,0x20
0303 93800074 STS flag_count,R24
(0098) ok=32;
0305 93800075 STS ok,R24
(0099) error=0;
0307 92200076 STS error,R2
(0100) }
0309 9622 ADIW R28,2
030A 940E06D1 CALL pop_gset1
030C 9508 RET
(0101) }
(0102)
(0103)
(0104)
(0105) void process_data(void)//数字处理函数
(0106) {if(a1[3]!=32){data1=(a1[0]-48)*1000+(a1[1]-48)*100+(a1[2]-48)*10+(a1[3]-48);}
_process_data:
030D 91800063 LDS R24,a1+3
030F 3280 CPI R24,0x20
0310 F139 BEQ 0x0338
0311 90200061 LDS R2,a1+1
0313 E684 LDI R24,0x64
0314 9D82 MUL R24,R2
0315 01C0 MOVW R24,R0
0316 5C80 SUBI R24,0xC0
0317 4192 SBCI R25,0x12
0318 91200060 LDS R18,a1
031A 2733 CLR R19
031B EE08 LDI R16,0xE8
031C E013 LDI R17,3
031D 940E0680 CALL empy16s
031F 01F8 MOVW R30,R16
0320 58E0 SUBI R30,0x80
0321 4BFB SBCI R31,0xBB
0322 0FE8 ADD R30,R24
0323 1FF9 ADC R31,R25
0324 90200062 LDS R2,a1+2
0326 E08A LDI R24,0xA
0327 9D82 MUL R24,R2
0328 01C0 MOVW R24,R0
0329 5E80 SUBI R24,0xE0
032A 4091 SBCI R25,1
032B 0FE8 ADD R30,R24
032C 1FF9 ADC R31,R25
032D 91800063 LDS R24,a1+3
032F 2799 CLR R25
0330 97C0 SBIW R24,0x30
0331 0FE8 ADD R30,R24
0332 1FF9 ADC R31,R25
0333 93F000A6 STS data1+1,R31
0335 93E000A5 STS data1,R30
0337 C046 RJMP 0x037E
(0107) else if(a1[2]!=32){data1=(a1[0]-48)*100+(a1[1]-48)*10+(a1[2]-48);}
0338 91800062 LDS R24,a1+2
033A 3280 CPI R24,0x20
033B F0D9 BEQ 0x0357
033C 90200061 LDS R2,a1+1
033E E08A LDI R24,0xA
033F 9D82 MUL R24,R2
0340 01C0 MOVW R24,R0
0341 5E80 SUBI R24,0xE0
0342 4091 SBCI R25,1
0343 90200060 LDS R2,a1
0345 E6E4 LDI R30,0x64
0346 9DE2 MUL R30,R2
0347 01F0 MOVW R30,R0
0348 5CE0 SUBI R30,0xC0
0349 41F2 SBCI R31,0x12
034A 0FE8 ADD R30,R24
034B 1FF9 ADC R31,R25
034C 91800062 LDS R24,a1+2
034E 2799 CLR R25
034F 97C0 SBIW R24,0x30
0350 0FE8 ADD R30,R24
0351 1FF9 ADC R31,R25
0352 93F000A6 STS data1+1,R31
0354 93E000A5 STS data1,R30
0356 C027 RJMP 0x037E
(0108) else if(a1[1]!=32){data1=(a1[0]-48)*10+(a1[1]-48);}
0357 91800061 LDS R24,a1+1
0359 3280 CPI R24,0x20
035A F091 BEQ 0x036D
035B 90200060 LDS R2,a1
035D E08A LDI R24,0xA
035E 9D82 MUL R24,R2
035F 01C0 MOVW R24,R0
0360 5E80 SUBI R24,0xE0
0361 4091 SBCI R25,1
0362 91E00061 LDS R30,a1+1
0364 27FF CLR R31
0365 97F0 SBIW R30,0x30
0366 0F8E ADD R24,R30
0367 1F9F ADC R25,R31
0368 939000A6 STS data1+1,R25
036A 938000A5 STS data1,R24
036C C011 RJMP 0x037E
(0109) else if(a1[0]!=32){data1=a1[0]-48;}
036D 91800060 LDS R24,a1
036F 3280 CPI R24,0x20
0370 F039 BEQ 0x0378
0371 2799 CLR R25
0372 97C0 SBIW R24,0x30
0373 939000A6 STS data1+1,R25
0375 938000A5 STS data1,R24
0377 C006 RJMP 0x037E
(0110) else data1=0;//ASCII-48才是对应的数字
0378 2422 CLR R2
0379 2433 CLR R3
037A 923000A6 STS data1+1,R3
037C 922000A5 STS data1,R2
(0111)
(0112) if(a2[3]!=32){data2=(a2[0]-48)*1000+(a2[1]-48)*100+(a2[2]-48)*10+(a2[3]-48);}
037E 91800068 LDS R24,a2+3
0380 3280 CPI R24,0x20
0381 F139 BEQ 0x03A9
0382 90200066 LDS R2,a2+1
0384 E684 LDI R24,0x64
0385 9D82 MUL R24,R2
0386 01C0 MOVW R24,R0
0387 5C80 SUBI R24,0xC0
0388 4192 SBCI R25,0x12
0389 91200065 LDS R18,a2
038B 2733 CLR R19
038C EE08 LDI R16,0xE8
038D E013 LDI R17,3
038E 940E0680 CALL empy16s
0390 01F8 MOVW R30,R16
0391 58E0 SUBI R30,0x80
0392 4BFB SBCI R31,0xBB
0393 0FE8 ADD R30,R24
0394 1FF9 ADC R31,R25
0395 90200067 LDS R2,a2+2
0397 E08A LDI R24,0xA
0398 9D82 MUL R24,R2
0399 01C0 MOVW R24,R0
039A 5E80 SUBI R24,0xE0
039B 4091 SBCI R25,1
039C 0FE8 ADD R30,R24
039D 1FF9 ADC R31,R25
039E 91800068 LDS R24,a2+3
03A0 2799 CLR R25
03A1 97C0 SBIW R24,0x30
03A2 0FE8 ADD R30,R24
03A3 1FF9 ADC R31,R25
03A4 93F000A4 STS data2+1,R31
03A6 93E000A3 STS data2,R30
03A8 C046 RJMP 0x03EF
(0113) else if(a2[2]!=32){data2=(a2[0]-48)*100+(a2[1]-48)*10+(a2[2]-48);}
03A9 91800067 LDS R24,a2+2
03AB 3280 CPI R24,0x20
03AC F0D9 BEQ 0x03C8
03AD 90200066 LDS R2,a2+1
03AF E08A LDI R24,0xA
03B0 9D82 MUL R24,R2
03B1 01C0 MOVW R24,R0
03B2 5E80 SUBI R24,0xE0
03B3 4091 SBCI R25,1
03B4 90200065 LDS R2,a2
03B6 E6E4 LDI R30,0x64
03B7 9DE2 MUL R30,R2
03B8 01F0 MOVW R30,R0
03B9 5CE0 SUBI R30,0xC0
03BA 41F2 SBCI R31,0x12
03BB 0FE8 ADD R30,R24
03BC 1FF9 ADC R31,R25
03BD 91800067 LDS R24,a2+2
03BF 2799 CLR R25
03C0 97C0 SBIW R24,0x30
03C1 0FE8 ADD R30,R24
03C2 1FF9 ADC R31,R25
03C3 93F000A4 STS data2+1,R31
03C5 93E000A3 STS data2,R30
03C7 C027 RJMP 0x03EF
(0114) else if(a2[1]!=32){data2=(a2[0]-48)*10+(a2[1]-48);}
03C8 91800066 LDS R24,a2+1
03CA 3280 CPI R24,0x20
03CB F091 BEQ 0x03DE
03CC 90200065 LDS R2,a2
03CE E08A LDI R24,0xA
03CF 9D82 MUL R24,R2
03D0 01C0 MOVW R24,R0
03D1 5E80 SUBI R24,0xE0
03D2 4091 SBCI R25,1
03D3 91E00066 LDS R30,a2+1
03D5 27FF CLR R31
03D6 97F0 SBIW R30,0x30
03D7 0F8E ADD R24,R30
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -