📄 main.lst
字号:
(0114) {5, "4.Flash Option", NullSubs, FlashMenu, Null},
(0115) {5, "5.Back", NullSubs, MainMenu, MainMenu},
(0116) };
(0117) //------------------------------------------------------------------------------
(0118)
(0119)
(0120)
(0121)
(0122)
(0123)
(0124) /***********************
(0125) * 全局变量声明区 *
(0126) ***********************/
(0127) struct MenuItem (*MenuPoint) = MainMenu; //结构体指针,指向结构体后由内部函数指针指向功能函数
(0128) unsigned char DisplayStart = 0; //显示时的第一个菜单项
(0129) unsigned char UserChoose = 0; //用户所选菜单项
(0130) unsigned char DisplayPoint = 0; //显示指针
(0131) unsigned MaxItems; //同级最大菜单数
(0132) unsigned char ShowCount=2; //同屏显示菜单数
(0133)
(0134)
(0135) /***********************
(0136) *显示函数区 *
(0137) ***********************/
(0138) void ShowMenu(void)
(0139) {
(0140) unsigned char n;
(0141) MaxItems = MenuPoint[0].MenuCount;//定义最大同级菜单
02EA 91E00138 LDS R30,MenuPoint
02EC 91F00139 LDS R31,MenuPoint+1
02EE 8020 LDD R2,Z+0
02EF 2433 CLR R3
02F0 92300232 STS MaxItems+1,R3
02F2 92200231 STS MaxItems,R2
(0142) DisplayPoint = DisplayStart;
02F4 9020013A LDS R2,DisplayStart
02F6 9220013C STS DisplayPoint,R2
(0143) for(n=0;DisplayPoint<MaxItems&&n<ShowCount;n++)
02F8 2744 CLR R20
02F9 C02E RJMP 0x0328
(0144) {if(DisplayPoint==UserChoose)
02FA 9020013B LDS R2,UserChoose
02FC 9030013C LDS R3,DisplayPoint
02FE 1432 CP R3,R2
02FF F451 BNE 0x030A
(0145) LCD_write_string(0,n,"->");
0300 E38E LDI R24,0x3E
0301 E091 LDI R25,1
0302 8399 STD Y+1,R25
0303 8388 STD Y+0,R24
0304 2F24 MOV R18,R20
0305 2733 CLR R19
0306 2700 CLR R16
0307 2711 CLR R17
0308 940E01CC CALL _LCD_write_string
(0146) LCD_write_string(2,n,MenuPoint[DisplayPoint++].DisplayString);
030A 9020013C LDS R2,DisplayPoint
030C 2433 CLR R3
030D 2D82 MOV R24,R2
030E 5F8F SUBI R24,0xFF
030F 9380013C STS DisplayPoint,R24
0311 E009 LDI R16,0x9
0312 E010 LDI R17,0
0313 0191 MOVW R18,R2
0314 940E043F CALL empy16s
0316 01F8 MOVW R30,R16
0317 90200138 LDS R2,MenuPoint
0319 90300139 LDS R3,MenuPoint+1
031B 0DE2 ADD R30,R2
031C 1DF3 ADC R31,R3
031D 8021 LDD R2,Z+1
031E 8032 LDD R3,Z+2
031F 8239 STD Y+1,R3
0320 8228 STD Y+0,R2
0321 2F24 MOV R18,R20
0322 2733 CLR R19
0323 E002 LDI R16,2
0324 E010 LDI R17,0
0325 940E01CC CALL _LCD_write_string
0327 9543 INC R20
0328 90200231 LDS R2,MaxItems
032A 90300232 LDS R3,MaxItems+1
032C 9040013C LDS R4,DisplayPoint
032E 2455 CLR R5
032F 1442 CP R4,R2
0330 0453 CPC R5,R3
0331 F420 BCC 0x0336
0332 9020013D LDS R2,ShowCount
0334 1542 CP R20,R2
0335 F220 BCS 0x02FA
0336 9622 ADIW R28,2
0337 940E0460 CALL pop_gset1
0339 9508 RET
_Menu_Change:
KeyNum --> R20
033A 940E045D CALL push_gset1
033C 2F40 MOV R20,R16
(0147)
(0148) }
(0149)
(0150) }
(0151)
(0152) void Menu_Change(unsigned char KeyNum)
(0153) {
(0154) if(KeyNum)
033D 2344 TST R20
033E F409 BNE 0x0340
033F C0E4 RJMP 0x0424
(0155) {
(0156) switch(KeyNum)
0340 2755 CLR R21
0341 3347 CPI R20,0x37
0342 E0E0 LDI R30,0
0343 075E CPC R21,R30
0344 F409 BNE 0x0346
0345 C053 RJMP 0x0399
0346 E387 LDI R24,0x37
0347 E090 LDI R25,0
0348 1784 CP R24,R20
0349 0795 CPC R25,R21
034A F054 BLT 0x0355
034B 3340 CPI R20,0x30
034C E0E0 LDI R30,0
034D 075E CPC R21,R30
034E F409 BNE 0x0350
034F C0A8 RJMP 0x03F8
0350 3343 CPI R20,0x33
0351 E0E0 LDI R30,0
0352 075E CPC R21,R30
0353 F081 BEQ 0x0364
0354 C0AE RJMP 0x0403
0355 3442 CPI R20,0x42
0356 E0E0 LDI R30,0
0357 075E CPC R21,R30
0358 F0B9 BEQ 0x0370
0359 3442 CPI R20,0x42
035A E0E0 LDI R30,0
035B 075E CPC R21,R30
035C F40C BGE 0x035E
035D C0A5 RJMP 0x0403
035E 3446 CPI R20,0x46
035F E0E0 LDI R30,0
0360 075E CPC R21,R30
0361 F409 BNE 0x0363
0362 C04A RJMP 0x03AD
0363 C09F RJMP 0x0403
(0157) {
(0158) case UP:
(0159) UserChoose --;
0364 9180013B LDS R24,UserChoose
0366 5081 SUBI R24,1
0367 9380013B STS UserChoose,R24
(0160) if (UserChoose ==255)
0369 3F8F CPI R24,0xFF
036A F009 BEQ 0x036C
036B C097 RJMP 0x0403
(0161) {
(0162) UserChoose = 0;//上翻截至,如果要回滚赋值MaxItems-1
036C 2422 CLR R2
036D 9220013B STS UserChoose,R2
(0163) }
(0164) break;
036F C093 RJMP 0x0403
(0165) case Esc:
(0166) if (MenuPoint[UserChoose].ParentMenus != Null)
0370 9020013B LDS R2,UserChoose
0372 E089 LDI R24,0x9
0373 9D82 MUL R24,R2
0374 01F0 MOVW R30,R0
0375 90200138 LDS R2,MenuPoint
0377 90300139 LDS R3,MenuPoint+1
0379 0DE2 ADD R30,R2
037A 1DF3 ADC R31,R3
037B 8027 LDD R2,Z+7
037C 8430 LDD R3,Z+8
037D 2022 TST R2
037E F419 BNE 0x0382
037F 2033 TST R3
0380 F409 BNE 0x0382
0381 C081 RJMP 0x0403
(0167) {
(0168) MenuPoint = MenuPoint[UserChoose].ParentMenus;
0382 9020013B LDS R2,UserChoose
0384 E089 LDI R24,0x9
0385 9D82 MUL R24,R2
0386 01F0 MOVW R30,R0
0387 90200138 LDS R2,MenuPoint
0389 90300139 LDS R3,MenuPoint+1
038B 0DE2 ADD R30,R2
038C 1DF3 ADC R31,R3
038D 8027 LDD R2,Z+7
038E 8430 LDD R3,Z+8
038F 92300139 STS MenuPoint+1,R3
0391 92200138 STS MenuPoint,R2
(0169) UserChoose = 0;
0393 2422 CLR R2
0394 9220013B STS UserChoose,R2
(0170) DisplayStart = 0;
0396 9220013A STS DisplayStart,R2
(0171) }
(0172) break;
0398 C06A RJMP 0x0403
(0173) case Down:
(0174) UserChoose ++;
0399 9180013B LDS R24,UserChoose
039B 5F8F SUBI R24,0xFF
039C 9380013B STS UserChoose,R24
(0175) if (UserChoose == MaxItems)
039E 90200231 LDS R2,MaxItems
03A0 90300232 LDS R3,MaxItems+1
03A2 2E48 MOV R4,R24
03A3 2455 CLR R5
03A4 1442 CP R4,R2
03A5 0453 CPC R5,R3
03A6 F009 BEQ 0x03A8
03A7 C05B RJMP 0x0403
(0176) {
(0177) UserChoose = MaxItems-1;//下翻截至,如要回滚赋值为0
03A8 01C1 MOVW R24,R2
03A9 9701 SBIW R24,1
03AA 9380013B STS UserChoose,R24
(0178) }
(0179) break;
03AC C056 RJMP 0x0403
(0180) case Enter:
(0181) if (MenuPoint[UserChoose].Subs != NullSubs)
03AD 9020013B LDS R2,UserChoose
03AF E089 LDI R24,0x9
03B0 9D82 MUL R24,R2
03B1 01F0 MOVW R30,R0
03B2 90200138 LDS R2,MenuPoint
03B4 90300139 LDS R3,MenuPoint+1
03B6 0DE2 ADD R30,R2
03B7 1DF3 ADC R31,R3
03B8 8023 LDD R2,Z+3
03B9 8034 LDD R3,Z+4
03BA E584 LDI R24,0x54
03BB E090 LDI R25,0
03BC 1628 CP R2,R24
03BD 0639 CPC R3,R25
03BE F089 BEQ 0x03D0
(0182) {
(0183) (*MenuPoint[UserChoose].Subs)();
03BF 9020013B LDS R2,UserChoose
03C1 E089 LDI R24,0x9
03C2 9D82 MUL R24,R2
03C3 01F0 MOVW R30,R0
03C4 90200138 LDS R2,MenuPoint
03C6 90300139 LDS R3,MenuPoint+1
03C8 0DE2 ADD R30,R2
03C9 1DF3 ADC R31,R3
03CA 81A3 LDD R26,Z+3
03CB 81B4 LDD R27,Z+4
03CC 01FD MOVW R30,R26
03CD 940E0474 CALL xicall
(0184) }
03CF C033 RJMP 0x0403
(0185) else if (MenuPoint[UserChoose].ChildrenMenus != Null)
03D0 9020013B LDS R2,UserChoose
03D2 E089 LDI R24,0x9
03D3 9D82 MUL R24,R2
03D4 01F0 MOVW R30,R0
03D5 90200138 LDS R2,MenuPoint
03D7 90300139 LDS R3,MenuPoint+1
03D9 0DE2 ADD R30,R2
03DA 1DF3 ADC R31,R3
03DB 8025 LDD R2,Z+5
03DC 8036 LDD R3,Z+6
03DD 2022 TST R2
03DE F411 BNE 0x03E1
03DF 2033 TST R3
03E0 F111 BEQ 0x0403
(0186) {
(0187) MenuPoint = MenuPoint[UserChoose].ChildrenMenus;
03E1 9020013B LDS R2,UserChoose
03E3 E089 LDI R24,0x9
03E4 9D82 MUL R24,R2
03E5 01F0 MOVW R30,R0
03E6 90200138 LDS R2,MenuPoint
03E8 90300139 LDS R3,MenuPoint+1
03EA 0DE2 ADD R30,R2
03EB 1DF3 ADC R31,R3
03EC 8025 LDD R2,Z+5
03ED 8036 LDD R3,Z+6
03EE 92300139 STS MenuPoint+1,R3
03F0 92200138 STS MenuPoint,R2
(0188) UserChoose = 0;
03F2 2422 CLR R2
03F3 9220013B STS UserChoose,R2
(0189) DisplayStart = 0;
03F5 9220013A STS DisplayStart,R2
(0190) }
(0191) break;
03F7 C00B RJMP 0x0403
(0192) case Reset:
(0193) MenuPoint = MainMenu;
03F8 E08B LDI R24,0xB
03F9 E091 LDI R25,1
03FA 93900139 STS MenuPoint+1,R25
03FC 93800138 STS MenuPoint,R24
(0194) UserChoose = 0;
03FE 2422 CLR R2
03FF 9220013B STS UserChoose,R2
(0195) DisplayStart = 0;
0401 9220013A STS DisplayStart,R2
(0196) break;
(0197) default:break;
(0198) }
(0199) if (UserChoose%ShowCount==0) //一屏只能显示ShowCount行
0403 9110013D LDS R17,ShowCount
0405 9100013B LDS R16,UserChoose
0407 940E0427 CALL mod8u
0409 2300 TST R16
040A F429 BNE 0x0410
(0200) DisplayStart = UserChoose;
040B 9020013B LDS R2,UserChoose
040D 9220013A STS DisplayStart,R2
040F C00B RJMP 0x041B
(0201) else if(UserChoose==1||UserChoose== 3)
0410 9180013B LDS R24,UserChoose
0412 3081 CPI R24,1
0413 F011 BEQ 0x0416
0414 3083 CPI R24,3
0415 F429 BNE 0x041B
(0202) DisplayStart = UserChoose-1; //实现滚屏的关键
0416 9180013B LDS R24,UserChoose
0418 5081 SUBI R24,1
0419 9380013A STS DisplayStart,R24
(0203) LCD_write_command(0x01); //液晶清屏,根据不同液晶函数自行修改
041B E001 LDI R16,1
041C E010 LDI R17,0
041D 940E017C CALL _LCD_write_command
(0204) delay_nms(5); //液晶为慢速器件
041F E005 LDI R16,5
0420 E010 LDI R17,0
0421 940E0152 CALL _delay_nms
(0205) ShowMenu();
0423 DEC3 RCALL _ShowMenu
(0206) }
FILE: <library>
0424 940E0460 CALL pop_gset1
0426 9508 RET
mod8u:
0427 9468 BSET 6
0428 C001 RJMP xdiv8u
div8u:
0429 94E8 BCLR 6
xdiv8u:
042A 932A ST R18,-Y
042B 92FA ST R15,-Y
042C 92EA ST R14,-Y
042D 24FF CLR R15
042E 24EE CLR R14
042F E120 LDI R18,0x10
0430 0F00 LSL R16
0431 1CFF ROL R15
0432 1CEE ROL R14
0433 16E1 CP R14,R17
0434 F010 BCS 0x0437
0435 1AE1 SUB R14,R17
0436 9503 INC R16
0437 952A DEC R18
0438 F7B9 BNE 0x0430
0439 F40E BRTC 0x043B
043A 2D0E MOV R16,R14
043B 90E9 LD R14,Y+
043C 90F9 LD R15,Y+
043D 9129 LD R18,Y+
043E 9508 RET
empy16s:
043F 920A ST R0,-Y
0440 921A ST R1,-Y
0441 938A ST R24,-Y
0442 939A ST R25,-Y
0443 9F02 MUL R16,R18
0444 01C0 MOVW R24,R0
0445 9F12 MUL R17,R18
0446 0D90 ADD R25,R0
0447 9F03 MUL R16,R19
0448 0D90 ADD R25,R0
0449 018C MOVW R16,R24
044A 9199 LD R25,Y+
044B 9189 LD R24,Y+
044C 9019 LD R1,Y+
044D 9009 LD R0,Y+
044E 9508 RET
pop_gset2:
044F E0E2 LDI R30,2
0450 940C0461 JMP pop
pop_gset3:
0452 E0E4 LDI R30,4
0453 940C0461 JMP pop
push_gset5:
0455 92FA ST R15,-Y
0456 92EA ST R14,-Y
push_gset4:
0457 92DA ST R13,-Y
0458 92CA ST R12,-Y
push_gset3:
0459 92BA ST R11,-Y
045A 92AA ST R10,-Y
push_gset2:
045B 937A ST R23,-Y
045C 936A ST R22,-Y
push_gset1:
045D 935A ST R21,-Y
045E 934A ST R20,-Y
045F 9508 RET
pop_gset1:
0460 E0E1 LDI R30,1
pop:
0461 9149 LD R20,Y+
0462 9159 LD R21,Y+
0463 FDE0 SBRC R30,0
0464 9508 RET
0465 9169 LD R22,Y+
0466 9179 LD R23,Y+
0467 FDE1 SBRC R30,1
0468 9508 RET
0469 90A9 LD R10,Y+
046A 90B9 LD R11,Y+
046B FDE2 SBRC R30,2
046C 9508 RET
046D 90C9 LD R12,Y+
046E 90D9 LD R13,Y+
046F FDE3 SBRC R30,3
0470 9508 RET
0471 90E9 LD R14,Y+
0472 90F9 LD R15,Y+
0473 9508 RET
xicall:
0474 920A ST R0,-Y
0475 95C8 LPM
0476 920A ST R0,-Y
0477 9631 ADIW R30,1
0478 95C8 LPM
0479 2DF0 MOV R31,R0
047A 91E9 LD R30,Y+
047B 9009 LD R0,Y+
047C 9409 IJMP
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -