📄 avr.lst
字号:
(0063) }
(0064) }
(0065) }
(0066) if( (Keyvalue==Keyvalue_first)&&(Keyvalue==Keyvalue_second) )
100D 902008DA LDS R2,Keyvalue_first
100F 90300193 LDS R3,Keyvalue
1011 1432 CP R3,R2
1012 F461 BNE 0x101F
1013 902008D9 LDS R2,Keyvalue_second
1015 1432 CP R3,R2
1016 F441 BNE 0x101F
(0067) {//如果长时间按,则Key_time累加,程序判断Key_time大于某个值就知道长时间按了
(0068) if(Key_time<255)
1017 91800196 LDS R24,Key_time
1019 3F8F CPI R24,0xFF
101A F438 BCC 0x1022
(0069) Key_time++;
101B 5F8F SUBI R24,0xFF
101C 93800196 STS Key_time,R24
(0070) }
101E C003 RJMP 0x1022
(0071) else
(0072) {
(0073) Key_time=0;
101F 2422 CLR R2
1020 92200196 STS Key_time,R2
(0074) }
1022 9029 LD R2,Y+
1023 BE2F OUT 0x3F,R2
1024 91E9 LD R30,Y+
1025 9199 LD R25,Y+
1026 9189 LD R24,Y+
1027 9119 LD R17,Y+
1028 9109 LD R16,Y+
1029 9039 LD R3,Y+
102A 9029 LD R2,Y+
102B 9518 RETI
FILE: E:\电子制作\FAT_SD_MENU\MENU\Menu.C
(0001) #include "SYS_Config.h"
(0002) #include "Menu.H"
(0003)
(0004) #include "PIC.h"
(0005) //图标
(0006) /*
(0007) ----------------------------------------------------------------------------
(0008) 菜单相关变量
(0009) ----------------------------------------------------------------------------
(0010) */
(0011) INT8U LessCPUUseage=TRUE;
(0012)
(0013) INT8U Flash = 0; //跳转进入子菜单 刷新标志 >1刷新
(0014) INT8U language = EN; //语言标志
(0015) INT8U KeyFuncIndex = 0; //索引
(0016) //3个备份数组
(0017) INT8U FatherIndex[MenuSize+1]; //父菜单备份数组
(0018) INT8U Layer = 0; //菜单层数
(0019)
(0020) INT8U ItemBackup[MenuSize]; //当前菜单项备份
(0021) INT8U ItemBackup_i = 0; //
(0022)
(0023) INT8U WhereBackup[MenuSize]; //反显位置备份
(0024) INT8U WhereBackup_i = 0; //
(0025)
(0026)
(0027) INT8U KeyPressCount = 0; //用于版本显示
(0028)
(0029) INT8U Item; //当前Bar项 范围:[0,ItemNum-1] 包括0 包括ItemNum-1 共包括ItemNum个取值
(0030) INT8U ItemNum; //Bar项数
(0031) INT8U Where; //当前反显位置,[0,DispMax-1] 反映反显的Bar在屏幕上的位置
(0032) //INT8U DispMax = 3; //单屏可以显示的最大项 通常这是个固定值--因为你的液晶的大小决定了你一次可以显示的多少,你也可以在程序中修改,但记得维护它--因为所有的Bar型菜单都是要用到它的
(0033) #define DispMax 3
(0034)
(0035) INT8U DispMin; //ItemNum和DispMax中的小者
(0036) //当前Bar显示内容指针
(0037)
(0038) INT8U **DispItem; //项显示内容指针
(0039)
(0040) #ifdef DynamicBar
(0041) INT8U BarDataMode = FixedData;
(0042) INT8U ** DynamicBarDispItem; //动态项显示内容指针
(0043) #endif
(0044)
(0045) //菜单资源指针
(0046) const struct Menu * BarMenu;
(0047) //Tip指针
(0048) const struct Menu * TipBar;
(0049)
(0050) /*
(0051) ----------------------------------------------------------------------------
(0052) |---->指针对象存放地址,也就是{"Function"},{"Parameter"},{"Measure"},等等这些文本存放在哪里
(0053) | |---->指针存放的位置,是这些字符的首地址应当存放在哪里 因为这是个指针数组存放的内容就是每个字符串的开始地址
(0054) | |
(0055) INT8U const * const TopItemEN[]=
(0056) {
(0057) {"Function"},
(0058) {"Parameter"},
(0059) {"Measure"},
(0060) {"Language"},
(0061) {"Test"},
(0062) };
(0063) 我们均把这些存放在代码区,以减少对RAM的占用
(0064)
(0065) ----------------------------------------------------------------------------
(0066) */
(0067)
(0068)
(0069) //---------------------------------------------------
(0070) //各个菜单的资源
(0071) //命名方式是:
(0072) //---------------------------------------------------
(0073) //顶层菜单
(0074)
(0075) //INT8U const * const TopItemCN[]=
(0076) INT8U * TopItemCN[]=
(0077) {
(0078) {"功能"},
(0079) {"参数"},
(0080) {"测量"},
(0081) {"语言"},
(0082) {"设置"},
(0083) };
(0084)
(0085)
(0086) //INT8U const * const TopItemEN[]=
(0087) INT8U * TopItemEN[]=
(0088) {
(0089) {"Function"},
(0090) {"Parameter"},
(0091) {"Measure"},
(0092) {"Language"},
(0093) {"Settings"},
(0094) };
(0095)
(0096)
(0097) //"功能"菜单项的内容和长度
(0098)
(0099) //INT8U const * const FuncItemCN[]=
(0100) INT8U * FuncItemCN[]=
(0101) {
(0102) {"读出数据"},
(0103) {"背光控制"},
(0104) {"出厂设置"},
(0105) {"修改密码"},
(0106) };
(0107)
(0108) //INT8U const * const FuncItemEN[]=
(0109) INT8U * FuncItemEN[]=
(0110) {
(0111) {"Read Data"},
(0112) {"BackLight"},
(0113) {"Factory Set"},
(0114) {"Change CODE"}
(0115) };
(0116) //"参数"菜单项的内容和长度
(0117)
(0118) //INT8U const * const ParaItemCN[]=
(0119) INT8U * ParaItemCN[]=
(0120) {
(0121) {"阈值"},
(0122) {"时间T"},
(0123) {"灵敏度K"},
(0124) {"测量时间"}
(0125) };
(0126)
(0127) //INT8U const * const ParaItemEN[]=
(0128) INT8U * ParaItemEN[]=
(0129) {
(0130) {"Menu0"},
(0131) {"Menu1"},
(0132) {"Menu2"},
(0133) {"Menu3"},
(0134) {"Menu4"},
(0135) {"Menu5"},
(0136) {"Menu6"},
(0137) {"Menu7"},
(0138) };
(0139) //"语言"菜单项的内容和长度
(0140)
(0141) //INT8U const * const LanguageItemCN[]=
(0142) INT8U * LanguageItemCN[]=
(0143) {
(0144) {"中文"},
(0145) {"English"},
(0146) };
(0147)
(0148) //INT8U const * const LanguageItemEN[]=
(0149) //INT8U * LanguageItemEN[]=
(0150) //{
(0151) //{"中文"},
(0152) //{"English"},
(0153) //};
(0154)
(0155) //测量
(0156) //INT8U const * const MeasureItemCN[]=
(0157) INT8U * MeasureItemCN[]=
(0158) {
(0159) {"测试1"},
(0160) {"测试2"},
(0161) {"测试3"},
(0162) {"测试4"},
(0163) {"测试5"},
(0164) {"测试6"},
(0165) {"测试7"},
(0166) };
(0167)
(0168) //INT8U const * const MeasureItemEN[]=
(0169) INT8U * MeasureItemEN[]=
(0170) {
(0171) {"PushUp Res"},
(0172) {"ClearErrCount"},
(0173) {"OnlineCMD"},
(0174) {"SysInputTest"},
(0175) {"SVC TEST"},
(0176) {"AXis TEST"},
(0177) {"Relay TEST"},
(0178) };
(0179)
(0180) //设置
(0181) //INT8U const * const MeasureItemCN[]=
(0182) INT8U * SetupItemCN[]=
(0183) {
(0184) {"时钟设置"},
(0185) {"设置2"},
(0186) {"设置3"},
(0187) {"设置4"},
(0188) {"设置5"},
(0189) {"设置6"},
(0190) };
(0191)
(0192) //INT8U const * const MeasureItemEN[]=
(0193) INT8U * SetupItemEN[]=
(0194) {
(0195) {"Time settings"},
(0196) {"setup 2"},
(0197) {"setup 3"},
(0198) {"setup 4"},
(0199) {"setup 5"},
(0200) {"setup 6"},
(0201) };
(0202)
(0203)
(0204) //提示键的文本
(0205) //INT8U const * const TipCN[]=
(0206) INT8U * TipCN[]=
(0207) {
(0208) {"功能表"},
(0209) {"选择"},
(0210) {"确认"},
(0211) {"取消"},
(0212) {"退出"},
(0213) {"捷径"},
(0214) };
(0215)
(0216)
(0217)
(0218) //INT8U const * const TipEN[]=
(0219) INT8U * TipEN[]=
(0220) {
(0221) {"Menu"},
(0222) {"Select"},
(0223) {"OK"},
(0224) {"Cancel"},
(0225) {"Exit"},
(0226) {"Goto"},
(0227) };
(0228)
(0229) //----------------------------------------
(0230) //宏定义:
(0231) #define MenuWhat(n) {(INT8U **)n,(sizeof(n)/sizeof(INT8U *)),0}
(0232)
(0233) //图标层
(0234) const struct Menu IcoMenu[] =
(0235) {
(0236) MenuWhat(TopItemCN),
(0237) MenuWhat(TopItemEN),
(0238) };
(0239)
(0240) //功能菜单
(0241) const struct Menu MenuFunc[] =
(0242) {
(0243) MenuWhat(FuncItemCN),
(0244) MenuWhat(FuncItemEN),
(0245) };
(0246)
(0247) //参数菜单
(0248) const struct Menu MenuPara[] =
(0249) {
(0250) MenuWhat(ParaItemCN),
(0251) MenuWhat(ParaItemEN),
(0252) };
(0253)
(0254) //测量菜单
(0255) const struct Menu MenuMeasure[] =
(0256) {
(0257) MenuWhat(MeasureItemCN),
(0258) MenuWhat(MeasureItemEN),
(0259) };
(0260)
(0261) //语言菜单
(0262) const struct Menu MenuLanguage[] =
(0263) {
(0264) MenuWhat(LanguageItemCN),
(0265) MenuWhat(LanguageItemCN),
(0266) };
(0267)
(0268) //设置菜单
(0269) const struct Menu MenuSetup[] =
(0270) {
(0271) MenuWhat(SetupItemCN),
(0272) MenuWhat(SetupItemEN),
(0273) };
(0274)
(0275) //Tip
(0276) const struct Menu Tip[] =
(0277) {
(0278) MenuWhat(TipCN),
(0279) MenuWhat(TipEN),
(0280) //{(INT8U **)TipCN,5,0},
(0281) //{(INT8U **)TipEN,5,0}
(0282) };
(0283)
(0284)
(0285) //更改密码时询问的图标索引号
(0286) #define WarningICO 5
(0287) #define PassICO 0
(0288) //图标索引
(0289) const INT8U * const icos[]=
(0290) {
(0291) function, //功能
(0292) para, //参数
(0293) action, //测量
(0294) menu, //语言
(0295) time, //时钟
(0296) question, //询问
(0297) warning,
(0298) sound,
(0299) };
(0300)
(0301) void Jump2Menu(INT8U Index,INT8U FlashMode)
(0302) {
(0303) KeyFuncIndex = Index; //jump to Menu index
_Jump2Menu:
FlashMode --> R18
Index --> R16
102C 9300019A STS KeyFuncIndex,R16
(0304) if(FlashMode)
102E 2322 TST R18
102F F011 BEQ 0x1032
(0305) {
(0306) Flash = FlashMode;
1030 93200198 STS Flash,R18
(0307) }
1032 9508 RET
_CheckKey:
IsKey --> R20
1033 940E43BB CALL push_gset2
FILE: E:\电子制作\FAT_SD_MENU\MENU\MenuFSM.C
(0001) /*这份代码经源码格式软件格式化过
(0002) yang_hx@neusoft.com */
(0003) /******************************************************************************
(0004) * MenuFSM.C - 菜单框架和FSM代码
(0005) ******************************************************************************/
(0006)
(0007) #include "SYS_Config.h"
(0008) #include "KeyScan.H"
(0009) #include "LcdDrive.H"
(0010) #include "Menu.H"
(0011)
(0012) //FIXME!
(0013) //改进想法:如何在菜单中可以接管其它有效按键,这里程序仅仅接管了方向按键,若能根据1--9这些数字按键跳转也是不错
(0014) //额外的问题是如何在应用程序中得到按键而却不需要在应用程序中做键盘检查循环(抢占CPU时间了,会使得原有可以在背景运行的程序无法执行)
(0015) /*
(0016) * A>改进FSM编号的机制,使得维护更简单,能否自动编号?这样会使得添加FSM表容易
(0017) * B>
(0018) */
(0019) //-----------------------------------
(0020) //MenuTop.C
(0021) void DispMenuTop(void);
(0022) void DispMenuTopUp(void);
(0023) void DispMenuTopDown(void);
(0024) void DispMenuTopLeft(void);
(0025) void DispMenuTopRight(void);
(0026)
(0027) void DispIcoMenuInit(void);
(0028) void DispIcoMenuUp(void);
(0029) void DispIcoMenuDown(void);
(0030) void DispIcoMenuLeft(void);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -