📄 avr.lst
字号:
(0031) void DispIcoMenuRight(void);
(0032)
(0033) //MenuFunc.C
(0034) void DispMenuFuncInit(void);
(0035) void DispMenuFuncUp(void);
(0036) void DispMenuFuncDown(void);
(0037) void DispMenuFuncLeft(void);
(0038) void DispMenuFuncRight(void);
(0039)
(0040) //MenuPara.C
(0041) void DispMenuParaInit(void);
(0042) void DispMenuParaUp(void);
(0043) void DispMenuParaDown(void);
(0044) void DispMenuParaLeft(void);
(0045) void DispMenuParaRight(void);
(0046)
(0047) //MenuLanguage.C
(0048) void DispMenuLanguageInit(void);
(0049) void DispMenuLanguageUp(void);
(0050) void DispMenuLanguageDown(void);
(0051) void DispMenuLanguageLeft(void);
(0052) void DispMenuLanguageRight(void);
(0053)
(0054) //MenuMeasure.C
(0055) void DispMenuMeasureInit(void);
(0056) void DispMenuMeasureUp(void);
(0057) void DispMenuMeasureDown(void);
(0058) void DispMenuMeasureLeft(void);
(0059) void DispMenuMeasureRight(void);
(0060)
(0061) //MenuSetup.C
(0062) void DispMenuSetupInit(void);
(0063) void DispMenuSetupUp(void);
(0064) void DispMenuSetupDown(void);
(0065) void DispMenuSetupLeft(void);
(0066) void DispMenuSetupRight(void);
(0067)
(0068) #ifdef DynamicBar
(0069) //MenuFunc.C
(0070) void DispMenuDataInit(void);
(0071) void DispMenuDataUp(void);
(0072) void DispMenuDataDown(void);
(0073) void DispMenuDataLeft(void);
(0074) void DispMenuDataRight(void);
(0075) #endif
(0076)
(0077) void(*KeyFuncPtr)(void);//按键功能指针
(0078)
(0079) typedef struct
(0080) {
(0081) INT8U KeyStateIndex ; //当前状态索引号
(0082) INT8U KeyUpState ; //按下"向上"键时转向的状态索引号
(0083) INT8U KeyDnState ; //按下"向下"键时转向的状态索引号
(0084) INT8U KeyLState ; //按下"向左"键时转向的状态索引号
(0085) INT8U KeyRState ; //按下"向右"键时转向的状态索引号
(0086) void(*CurrentOperate)(void);//当前状态应该执行的功能操作
(0087) }KbdTabStruct ;
(0088)
(0089) //如下是菜单的关键代码
(0090) //不清楚具体含义 不能改动
(0091) //因为跟编译器相关
(0092) //如下的函数的名称也不可以轻易修改
(0093) /********************************************************************************
(0094)
(0095) FSM菜单实现机制说明:
(0096) A.一些约定:只有4个按键来做菜单周转,这四个按键Up/Down/Left/Down 对应功能是:确认/回退/向上/向下
(0097) B.每一层的bar型菜单需要大概5个状态(也就是5个函数)来实现,分别是MenuInit/MenuUp/MenuDown/MenuLeft/MenuRight
(0098) 对应的功能解释:
(0099) MenuInit : 初始化菜单/重新初始化菜单,在进入一个子Bar菜单时,该函数把Bar显示指针根据语言指向子Bar的资源数组,
(0100) 获得需要的参数:该子菜单多少个Bar项(ItemNum)/每个Bar项的字符长度(Size)/指向Bar显示内容的指针(DispItem).
(0101) 而后,调用函数BarMenuInit,该函数初始化全部Bar显示--这就是初始化菜单.
(0102) 若是是从子菜单返回时,那么在返回前,Pop函数被调用,各种菜单参数被还原,在进入本函数后,本函数根据得到参数显示Bar项
(0103) 初始化菜单/重新初始化菜单的不同点在于:
(0104) 初始化时 高亮显示的位置是在顶部,对应选中的Item也是在顶部
(0105) 重新初始化时 由于用户通过按键向上/向下来选择Bar项,而后通过按键确认来进入子菜单,为了在退出子菜单时能得到跟进入
(0106) 前一致的显示内容,因此需要备份一些相关数据:高亮的位置/选中的Item/当前FSM的Index号 在退出子菜单时Pop还原这些数据
(0107) 本函数根据这些还原数据恢复显示.
(0108)
(0109) MenuUp : 根据Bar显示内容执行对应动作函数/或者周转到某层子菜单
(0110) MenuDown : 返回上层菜单 通常是简单调用Pop函数
(0111) MenuLeft : 移至上一个Bar项 通常是调用BarMenuLeft函数--该函数维护Bar的显示后FSM状态返回MenunInit,但由于没有打开Flash/Reflash项,因此没有执行MenuInit函数
(0112) MenuRight: 移至下一个Bar项 通常是调用BarMenuright函数--该函数维护Bar的显示后FSM状态返回MenunInit,但由于没有打开Flash/Reflash项,因此没有执行MenuInit函数
(0113)
(0114)
(0115) ********************************************************************************
(0116) */
(0117) const KbdTabStruct KeyTab[]=
(0118) {
(0119) // |-----------> Index
(0120) // | Up
(0121) // | | Down
(0122) // | | | Left
(0123) // | | | | Right --->功能函数
(0124) // | | | | | |
(0125) { 0, 1, 2, 3, 4,(*DispMenuTop)}, // 待机画面
(0126) { 1, 0, 0, 0, 0,(*DispMenuTopUp)},
(0127) { 2, 0, 0, 0, 0,(*DispMenuTopDown)},
(0128) { 3, 0, 0, 0, 0,(*DispMenuTopLeft)},
(0129) { 4, 0, 0, 0, 0,(*DispMenuTopRight)},
(0130)
(0131) { 5, 6, 7, 8, 9,(*DispIcoMenuInit)}, //图标层菜单
(0132) { 6, 0, 0, 0, 0,(*DispIcoMenuUp)}, //
(0133) { 7, 0, 0, 0, 0,(*DispIcoMenuDown)}, //
(0134) { 8, 0, 0, 0, 0,(*DispIcoMenuLeft)}, //
(0135) { 9, 0, 0, 0, 0,(*DispIcoMenuRight)},//
(0136)
(0137) {10,11,12,13,14,(*DispMenuFuncInit)}, //"功能"
(0138) {11, 0, 0, 0, 0,(*DispMenuFuncUp)}, //
(0139) {12, 0, 0, 0, 0,(*DispMenuFuncDown)}, //
(0140) {13, 0, 0, 0, 0,(*DispMenuFuncLeft)}, //
(0141) {14, 0, 0, 0, 0,(*DispMenuFuncRight)},//
(0142)
(0143) {15,16,17,18,19,(*DispMenuParaInit)}, //"参数"
(0144) {16, 0, 0, 0, 0,(*DispMenuParaUp)}, //
(0145) {17, 0, 0, 0, 0,(*DispMenuParaDown)}, //
(0146) {18, 0, 0, 0, 0,(*DispMenuParaLeft)}, //
(0147) {19, 0, 0, 0, 0,(*DispMenuParaRight)},//
(0148)
(0149) {20,21,22,23,24,(*DispMenuLanguageInit)}, //"语言"
(0150) {21, 0, 0, 0, 0,(*DispMenuLanguageUp)}, //
(0151) {22, 0, 0, 0, 0,(*DispMenuLanguageDown)}, //
(0152) {23, 0, 0, 0, 0,(*DispMenuLanguageLeft)}, //
(0153) {24, 0, 0, 0, 0,(*DispMenuLanguageRight)},//
(0154)
(0155) {25,26,27,28,29,(*DispMenuMeasureInit)}, //"测量"
(0156) {26, 0, 0, 0, 0,(*DispMenuMeasureUp)}, //
(0157) {27, 0, 0, 0, 0,(*DispMenuMeasureDown)}, //
(0158) {28, 0, 0, 0, 0,(*DispMenuMeasureLeft)}, //
(0159) {29, 0, 0, 0, 0,(*DispMenuMeasureRight)},//
(0160)
(0161) {30,31,32,33,34,(*DispMenuSetupInit)}, //"设置"
(0162) {31, 0, 0, 0, 0,(*DispMenuSetupUp)}, //
(0163) {32, 0, 0, 0, 0,(*DispMenuSetupDown)}, //
(0164) {33, 0, 0, 0, 0,(*DispMenuSetupLeft)}, //
(0165) {34, 0, 0, 0, 0,(*DispMenuSetupRight)},//
(0166)
(0167) #ifdef DynamicBar
(0168) {35,36,37,38,39,(*DispMenuDataInit)}, //"Data"
(0169) {36, 0, 0, 0, 0,(*DispMenuDataUp)}, //
(0170) {37, 0, 0, 0, 0,(*DispMenuDataDown)}, //
(0171) {38, 0, 0, 0, 0,(*DispMenuDataLeft)}, //
(0172) {39, 0, 0, 0, 0,(*DispMenuDataRight)},//
(0173) #endif
(0174) }
(0175) ;
(0176)
(0177) /****************************************************************************
(0178) * CheckKey - 菜单键盘扫描函数
(0179) * 有有效按键则执行对应的功能函数
(0180) * 同时,若刷新标志有效,也执行相应的功能函数
(0181) 返回0表示有效按键输入,否则当作无效按键
(0182) ****************************************************************************/
(0183)
(0184) extern INT8U Keyvalue;
(0185) extern INT8U Key_Deal_Flag;
(0186)
(0187) INT8U CheckKey(void)
(0188) {
(0189) INT8U IsKey ;
(0190)
(0191) IsKey=1 ;
1035 E041 LDI R20,1
(0192) if(Key_Deal_Flag==1)
1036 91800194 LDS R24,Key_Deal_Flag
1038 3081 CPI R24,1
1039 F009 BEQ 0x103B
103A C06C RJMP 0x10A7
(0193) {
(0194) IsKey=0 ;
103B 2744 CLR R20
(0195) switch(Keyvalue)
103C 91600193 LDS R22,Keyvalue
103E 2777 CLR R23
103F 3161 CPI R22,0x11
1040 E0E0 LDI R30,0
1041 077E CPC R23,R30
1042 F409 BNE 0x1044
1043 C023 RJMP 0x1067
1044 3162 CPI R22,0x12
1045 E0E0 LDI R30,0
1046 077E CPC R23,R30
1047 F059 BEQ 0x1053
1048 3163 CPI R22,0x13
1049 E0E0 LDI R30,0
104A 077E CPC R23,R30
104B F409 BNE 0x104D
104C C02E RJMP 0x107B
104D 3164 CPI R22,0x14
104E E0E0 LDI R30,0
104F 077E CPC R23,R30
1050 F409 BNE 0x1052
1051 C03D RJMP 0x108F
1052 C050 RJMP 0x10A3
(0196) {
(0197) case Key_Up :
(0198) {
(0199) //向上键,找出新的菜单状态编号
(0200) KeyFuncIndex=KeyTab[KeyFuncIndex].KeyUpState ;
1053 940E4A18 CALL 0x4A18
1055 E08D LDI R24,0xD
1056 E099 LDI R25,0x9
1057 0FE8 ADD R30,R24
1058 1FF9 ADC R31,R25
1059 91E4 LPM R30,0(Z)
105A 93E0019A STS KeyFuncIndex,R30
(0201) KeyFuncPtr=KeyTab[KeyFuncIndex].CurrentOperate ;
105C 2E2E MOV R2,R30
105D E087 LDI R24,7
105E 9D82 MUL R24,R2
105F 01F0 MOVW R30,R0
1060 E181 LDI R24,0x11
1061 E099 LDI R25,0x9
1062 940E4635 CALL 0x4635
1064 940E4986 CALL 0x4986
(0202) (*KeyFuncPtr)();//执行当前按键的操作
(0203) break ;
1066 C03D RJMP 0x10A4
(0204) }
(0205) case Key_Down :
(0206) {
(0207) //向下键,找出新的菜单状态编号
(0208) KeyFuncIndex=KeyTab[KeyFuncIndex].KeyDnState ;
1067 940E4A18 CALL 0x4A18
1069 E08E LDI R24,0xE
106A E099 LDI R25,0x9
106B 0FE8 ADD R30,R24
106C 1FF9 ADC R31,R25
106D 91E4 LPM R30,0(Z)
106E 93E0019A STS KeyFuncIndex,R30
(0209) KeyFuncPtr=KeyTab[KeyFuncIndex].CurrentOperate ;
1070 2E2E MOV R2,R30
1071 E087 LDI R24,7
1072 9D82 MUL R24,R2
1073 01F0 MOVW R30,R0
1074 E181 LDI R24,0x11
1075 E099 LDI R25,0x9
1076 940E4635 CALL 0x4635
1078 940E4986 CALL 0x4986
(0210) (*KeyFuncPtr)();//执行当前按键的操作
(0211) break ;
107A C029 RJMP 0x10A4
(0212) }
(0213) case Key_Left :
(0214) {
(0215) //向左键,找出新的菜单状态编号
(0216) KeyFuncIndex=KeyTab[KeyFuncIndex].KeyLState ;
107B 940E4A18 CALL 0x4A18
107D E08F LDI R24,0xF
107E E099 LDI R25,0x9
107F 0FE8 ADD R30,R24
1080 1FF9 ADC R31,R25
1081 91E4 LPM R30,0(Z)
1082 93E0019A STS KeyFuncIndex,R30
(0217) KeyFuncPtr=KeyTab[KeyFuncIndex].CurrentOperate ;
1084 2E2E MOV R2,R30
1085 E087 LDI R24,7
1086 9D82 MUL R24,R2
1087 01F0 MOVW R30,R0
1088 E181 LDI R24,0x11
1089 E099 LDI R25,0x9
108A 940E4635 CALL 0x4635
108C 940E4986 CALL 0x4986
(0218) (*KeyFuncPtr)();//执行当前按键的操作
(0219) break ;
108E C015 RJMP 0x10A4
(0220) }
(0221) case Key_Right :
(0222) {
(0223) //向右键,找出新的菜单状态编号
(0224) KeyFuncIndex=KeyTab[KeyFuncIndex].KeyRState ;
108F 940E4A18 CALL 0x4A18
1091 E180 LDI R24,0x10
1092 E099 LDI R25,0x9
1093 0FE8 ADD R30,R24
1094 1FF9 ADC R31,R25
1095 91E4 LPM R30,0(Z)
1096 93E0019A STS KeyFuncIndex,R30
(0225) KeyFuncPtr=KeyTab[KeyFuncIndex].CurrentOperate ;
1098 2E2E MOV R2,R30
1099 E087 LDI R24,7
109A 9D82 MUL R24,R2
109B 01F0 MOVW R30,R0
109C E181 LDI R24,0x11
109D E099 LDI R25,0x9
109E 940E4635 CALL 0x4635
10A0 940E4986 CALL 0x4986
(0226) (*KeyFuncPtr)();//执行当前按键的操作
(0227) break ;
10A2 C001 RJMP 0x10A4
(0228) }
(0229) default :IsKey=1 ;break ;//按键错误的处理
10A3 E041 LDI R20,1
(0230) }
(0231) Key_Deal_Flag=0;
10A4 2422 CLR R2
10A5 92200194 STS Key_Deal_Flag,R2
(0232) }
(0233) if(Flash)
10A7 90200198 LDS R2,Flash
10A9 2022 TST R2
10AA F059 BEQ 0x10B6
10AB 940E4A18 CALL 0x4A18
(0234) {
(0235) //两个当中有任意一个不为零,那么执行一次,我们应该不会出现Flash和ReFlash都是1的情况
(0236) KeyFuncPtr=KeyTab[KeyFuncIndex].CurrentOperate ;
10AD E181 LDI R24,0x11
10AE E099 LDI R25,0x9
10AF 940E4635 CALL 0x4635
10B1 940E4986 CALL 0x4986
(0237) (*KeyFuncPtr)();//执行当前按键的操作
(0238) Flash=0 ; // ReFlash = 0;
10B3 2422 CLR R2
10B4 92200198 STS Flash,R2
(0239) }
(0240) return IsKey ;
10B6 2F04 MOV R16,R20
10B7 940E43AD CALL pop_gset2
10B9 9508 RET
_DispMenuFuncInit:
10BA 9721 SBIW R28,1
FILE: E:\电子制作\FAT_SD_MENU\MENU\MenuFunc.C
(0001) /*这份代码经源码格式软件格式化过
(0002) yang_hx@neusoft.com */
(0003) /******************************************************************************
(0004) * MenuFunc.C - "功能"菜单 条项动态生成代码
(0005) ******************************************************************************/
(0006) #include "SYS_Config.h"
(0007) #include "GUI_Config.h"
(0008) #include "GUI.H"
(0009) #include "Menu.H"
(0010) #include "KeyScan.H"
(0011)
(0012)
(0013) //功能
(0014) //Bar型菜单
(0015) void DispMenuFuncInit()
(0016) {
(0017) //--------------------
(0018) GUI_Clear();
10BB 940E3AAD CALL _GUI_Clear
10BD 940E4699 CALL 0x4699
(0019) //--------------------
(0020) BarMenu=&MenuFunc[language];
10BF 0110 MOVW R2,R0
10C0 EC80 LDI R24,0xC0
10C1 940E4571 CALL 0x4571
(0021) ItemNum=(*BarMenu).TextNum ;
(0022) DispItem=(*BarMenu).Text ;
(0023)
(0024) //显示按键对应的文字提示,1-->"选择"
(0025) GUI_DispStringAt(*(Tip[language].Text+1),1,LCD_YSIZE-14);
(0026) //显示按键对应的文字提示,0-->"退出"
(0027) GUI_DispStringAt(*(Tip[language].Text+4),LCD_XSIZE-24,LCD_YSIZE-14);
(0028)
(0029) //用户定义的初始化代码请放在这里
(0030) BarMenuInit();
10C3 D31D RCALL _BarMenuInit
10C4 9621 ADIW R28,1
10C5 9508 RET
_DispMenuFuncUp:
10C6 940E43BD CALL push_gset1
10C8 940E4A2A CALL 0x4A2A
(0031) //调用公共初始化的代码
(0032) }
(0033)
(0034) void DispMenuFuncUp()
(0035) {
(0036)
(0037) switch(Item)
10CA F029 BEQ 0x10D0
10CB 3041 CPI R20,1
10CC E0E0 LDI R30,0
10CD 075E CPC R21,R30
10CE F031 BEQ 0x10D5
10CF C00A RJMP 0x10DA
(0038) {
(0039) case 0 :
(0040) {
(0041) #ifdef DynamicBar
(0042) Jump2Menu(MenuDataIndex,FlashMode_AutoInit);
(0043) #else
(0044) Jump2Menu(SelfMenuIndex,FlashMode_NoAction);
10D0 2722 CLR R18
10D1 940E4664 CALL 0x4664
10D3 DF58 RCALL _Jump2Menu
(0045) #endif
(0046)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -