⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 avr.lst

📁 Atmega64单片机程序(完整工程)
💻 LST
📖 第 1 页 / 共 5 页
字号:
(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 + -