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

📄 menu.lis

📁 一个用于LCD的菜单模式界面的程序,如何实现滚屏.
💻 LIS
📖 第 1 页 / 共 5 页
字号:
 0026           ; {  //MenuCount                 DisplayString                   Subs                           ChildrenMenus           ParentMenus
 0026           ;        {5,                     "1.Time Set"   ,                NullSubs,                      TimeMenu,                       Null},
 0026           ;        {5,                     "2.Voice Center",               NullSubs,                      VoiceMenu,                      Null},
 0026           ;        {5,                     "3.Robot Control",              NullSubs,                      RobotMenu,                      Null},
 0026           ;        {5,                     "4.Flash Option",               NullSubs,                      FlashMenu,                      Null},
 0026           ;        {5,                     "5.Back",                               NullSubs,                      MainMenu,                       MainMenu},
 0026           ; };    
 0026           ; //------------------------------------------------------------------------------
 0026           ; 
 0026           ; 
 0026           ; 
 0026           ; 
 0026           ; 
 0026           ; 
 0026           ; /*********************** 
 0026           ; * 全局变量声明区 * 
 0026           ; ***********************/ 
 0026           ; struct MenuItem (*MenuPoint) = MainMenu; //结构体指针,指向结构体后由内部函数指针指向功能函数
 0026           ; unsigned char DisplayStart = 0; //显示时的第一个菜单项
 0026           ; unsigned char UserChoose = 0;         //用户所选菜单项
 0026           ; unsigned char DisplayPoint = 0; //显示指针
 0026           ; unsigned MaxItems;                            //同级最大菜单数
 0026           ; unsigned char ShowCount=2;            //同屏显示菜单数
 0026           ; 
 0026           ; 
 0026           ; /*********************** 
 0026           ; *显示函数区 * 
 0026           ; ***********************/ 
 0026           ; void ShowMenu(void) 
 0026           ; {
 0026                   .dbline 141
 0026           ;        unsigned char n;
 0026           ;        MaxItems = MenuPoint[0].MenuCount;//定义最大同级菜单
 0026 E091D800          lds R30,_MenuPoint
 002A F091D900          lds R31,_MenuPoint+1
 002E 2080              ldd R2,z+0
 0030 3324              clr R3
 0032 30920100          sts _MaxItems+1,R3
 0036 20920000          sts _MaxItems,R2
 003A                   .dbline 142
 003A           ;        DisplayPoint = DisplayStart;
 003A 2090DA00          lds R2,_DisplayStart
 003E 2092DC00          sts _DisplayPoint,R2
 0042                   .dbline 143
 0042           ;        for(n=0;DisplayPoint<MaxItems&&n<ShowCount;n++) 
 0042 4427              clr R20
 0044 2EC0              xjmp L30
 0046           L27:
 0046                   .dbline 144
 0046           ;               {if(DisplayPoint==UserChoose)
 0046                   .dbline 144
 0046 2090DB00          lds R2,_UserChoose
 004A 3090DC00          lds R3,_DisplayPoint
 004E 3214              cp R3,R2
 0050 51F4              brne L31
 0052                   .dbline 145
 0052           ;                               LCD_write_string(0,n,"->");
 0052 80E0              ldi R24,<L33
 0054 90E0              ldi R25,>L33
 0056 9983              std y+1,R25
 0058 8883              std y+0,R24
 005A 242F              mov R18,R20
 005C 3327              clr R19
 005E 0027              clr R16
 0060 1127              clr R17
 0062 0E940000          xcall _LCD_write_string
 0066           L31:
 0066                   .dbline 146
 0066 2090DC00          lds R2,_DisplayPoint
 006A 3324              clr R3
 006C 822D              mov R24,R2
 006E 8F5F              subi R24,255    ; addi 1
 0070 8093DC00          sts _DisplayPoint,R24
 0074 09E0              ldi R16,9
 0076 10E0              ldi R17,0
 0078 9101              movw R18,R2
 007A 0E940000          xcall empy16s
 007E F801              movw R30,R16
 0080 2090D800          lds R2,_MenuPoint
 0084 3090D900          lds R3,_MenuPoint+1
 0088 E20D              add R30,R2
 008A F31D              adc R31,R3
 008C 2180              ldd R2,z+1
 008E 3280              ldd R3,z+2
 0090 3982              std y+1,R3
 0092 2882              std y+0,R2
 0094 242F              mov R18,R20
 0096 3327              clr R19
 0098 02E0              ldi R16,2
 009A 10E0              ldi R17,0
 009C 0E940000          xcall _LCD_write_string
 00A0                   .dbline 148
 00A0           L28:
 00A0                   .dbline 143
 00A0 4395              inc R20
 00A2           L30:
 00A2                   .dbline 143
 00A2 20900000          lds R2,_MaxItems
 00A6 30900100          lds R3,_MaxItems+1
 00AA 4090DC00          lds R4,_DisplayPoint
 00AE 5524              clr R5
 00B0 4214              cp R4,R2
 00B2 5304              cpc R5,R3
 00B4 20F4              brsh L34
 00B6 2090DD00          lds R2,_ShowCount
 00BA 4215              cp R20,R2
 00BC 20F2              brlo L27
 00BE           L34:
 00BE                   .dbline -2
 00BE           L26:
 00BE 2296              adiw R28,2
 00C0 0E940000          xcall pop_gset1
 00C4                   .dbline 0 ; func end
 00C4 0895              ret
 00C6                   .dbsym r n 20 c
 00C6                   .dbend
 00C6                   .dbfunc e Menu_Change _Menu_Change fV
 00C6           ;         KeyNum -> R20
                        .even
 00C6           _Menu_Change::
 00C6 0E940000          xcall push_gset1
 00CA 402F              mov R20,R16
 00CC                   .dbline -1
 00CC                   .dbline 153
 00CC           ;                LCD_write_string(2,n,MenuPoint[DisplayPoint++].DisplayString);
 00CC           ;                
 00CC           ;               }
 00CC           ; 
 00CC           ; }
 00CC           ; 
 00CC           ; void Menu_Change(unsigned char KeyNum)
 00CC           ; {
 00CC                   .dbline 154
 00CC           ;               if(KeyNum)
 00CC 4423              tst R20
 00CE 09F4              brne X3
 00D0 E4C0              xjmp L36
 00D2           X3:
 00D2                   .dbline 155
 00D2           ;               {
 00D2                   .dbline 156
 00D2           ;                  switch(KeyNum) 
 00D2 5527              clr R21
 00D4 4733              cpi R20,55
 00D6 E0E0              ldi R30,0
 00D8 5E07              cpc R21,R30
 00DA 09F4              brne X4
 00DC 53C0              xjmp L47
 00DE           X4:
 00DE 87E3              ldi R24,55
 00E0 90E0              ldi R25,0
 00E2 8417              cp R24,R20
 00E4 9507              cpc R25,R21
 00E6 54F0              brlt L57
 00E8           L56:
 00E8 4033              cpi R20,48
 00EA E0E0              ldi R30,0
 00EC 5E07              cpc R21,R30
 00EE 09F4              brne X5
 00F0 A8C0              xjmp L55
 00F2           X5:
 00F2 4333              cpi R20,51
 00F4 E0E0              ldi R30,0
 00F6 5E07              cpc R21,R30
 00F8 81F0              breq L41
 00FA AEC0              xjmp L39
 00FC           L57:
 00FC 4234              cpi R20,66
 00FE E0E0              ldi R30,0
 0100 5E07              cpc R21,R30
 0102 B9F0              breq L44
 0104 4234              cpi R20,66
 0106 E0E0              ldi R30,0
 0108 5E07              cpc R21,R30
 010A 0CF4              brge X6
 010C A5C0              xjmp L39
 010E           X6:
 010E           L58:
 010E 4634              cpi R20,70
 0110 E0E0              ldi R30,0
 0112 5E07              cpc R21,R30
 0114 09F4              brne X7
 0116 4AC0              xjmp L50
 0118           X7:
 0118 9FC0              xjmp L39
 011A           X0:
 011A                   .dbline 157
 011A           ;                  {                
 011A           L41:
 011A                   .dbline 159
 011A           ;                                               case UP: 
 011A           ;                                                        UserChoose --; 
 011A 8091DB00          lds R24,_UserChoose
 011E 8150              subi R24,1
 0120 8093DB00          sts _UserChoose,R24
 0124                   .dbline 160
 0124           ;                                                        if (UserChoose ==255)
 0124 8F3F              cpi R24,255
 0126 09F0              breq X8
 0128 97C0              xjmp L39
 012A           X8:
 012A                   .dbline 161
 012A           ;                                                        { 
 012A                   .dbline 162
 012A           ;                                                               UserChoose = 0;//上翻截至,如果要回滚赋值MaxItems-1
 012A 2224              clr R2
 012C 2092DB00          sts _UserChoose,R2
 0130                   .dbline 163
 0130           ;                                                        } 
 0130                   .dbline 164
 0130           ;                                                        break; 
 0130 93C0              xjmp L39
 0132           L44:
 0132                   .dbline 166
 0132           ;                                               case Esc: 
 0132           ;                                                        if (MenuPoint[UserChoose].ParentMenus != Null) 
 0132 2090DB00          lds R2,_UserChoose
 0136 89E0              ldi R24,9
 0138 829D              mul R24,R2
 013A F001              movw R30,R0
 013C 2090D800          lds R2,_MenuPoint
 0140 3090D900          lds R3,_MenuPoint+1
 0144 E20D              add R30,R2
 0146 F31D              adc R31,R3
 0148 2780              ldd R2,z+7
 014A 3084              ldd R3,z+8
 014C 2220              tst R2
 014E 19F4              brne X1
 0150 3320              tst R3
 0152 09F4              brne X9
 0154 81C0              xjmp L39
 0156           X9:
 0156           X1:
 0156                   .dbline 167
 0156           ;                                                        { 
 0156                   .dbline 168
 0156           ;                                                               MenuPoint = MenuPoint[UserChoose].ParentMenus; 
 0156 2090DB00          lds R2,_UserChoose
 015A 89E0              ldi R24,9
 015C 829D              mul R24,R2
 015E F001              movw R30,R0
 0160 2090D800          lds R2,_MenuPoint
 0164 3090D900          lds R3,_MenuPoint+1
 0168 E20D              add R30,R2
 016A F31D              adc R31,R3
 016C 2780              ldd R2,z+7
 016E 3084              ldd R3,z+8
 0170 3092D900          sts _MenuPoint+1,R3
 0174 2092D800          sts _MenuPoint,R2
 0178                   .dbline 169
 0178           ;                                                               UserChoose = 0; 
 0178 2224              clr R2
 017A 2092DB00          sts _UserChoose,R2
 017E                   .dbline 170
 017E           ;                                                               DisplayStart = 0; 
 017E 2092DA00          sts _DisplayStart,R2
 0182                   .dbline 171
 0182           ;                                                       } 
 0182                   .dbline 172
 0182           ;                                                       break; 
 0182 6AC0              xjmp L39
 0184           L47:
 0184                   .dbline 174
 0184           ;                                               case Down: 
 0184           ;                                                        UserChoose ++; 
 0184 8091DB00          lds R24,_UserChoose
 0188 8F5F              subi R24,255    ; addi 1
 018A 8093DB00          sts _UserChoose,R24
 018E                   .dbline 175
 018E           ;                                                        if (UserChoose == MaxItems) 
 018E 20900000          lds R2,_MaxItems
 0192 30900100          lds R3,_MaxItems+1
 0196 482E              mov R4,R24
 0198 5524              clr R5
 019A 4214              cp R4,R2
 019C 5304              cpc R5,R3

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -