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

📄 menu.lis

📁 做点阵式lcd多级菜单开发的一个例子 可以帮助初学者了解 交互式界面简单设计的部分
💻 LIS
📖 第 1 页 / 共 5 页
字号:
 0066 A990              ld R10,y+
 0068 0895              ret
 006A                   .dbsym r dat 10 c
 006A                   .dbend
 006A                   .dbfunc e lcd_init _lcd_init fV
                        .even
 006A           _lcd_init::
 006A                   .dbline -1
 006A                   .dbline 55
 006A           ; }
 006A           ; 
 006A           ; /********************LCD初始化******************************************/
 006A           ; void lcd_init(void)                           //LCD初始化.
 006A           ; {
 006A                   .dbline 56
 006A           ;       send_comm(disp_start_set);      //设置显示起始行为第一行.
 006A 00EC              ldi R16,192
 006C E9DF              xcall _send_comm
 006E                   .dbline 57
 006E           ;       send_comm(page_addr_set);       //页地址设为0
 006E 08EB              ldi R16,184
 0070 E7DF              xcall _send_comm
 0072                   .dbline 58
 0072           ;       send_comm(col_addr_set);        //列地址设为0
 0072 00E4              ldi R16,64
 0074 E5DF              xcall _send_comm
 0076                   .dbline 59
 0076           ;       send_comm(disp_on);                     //打开显示.
 0076 0FE3              ldi R16,63
 0078 E3DF              xcall _send_comm
 007A                   .dbline -2
 007A           L18:
 007A                   .dbline 0 ; func end
 007A 0895              ret
 007C                   .dbend
 007C                   .dbfunc e lcd_clr _lcd_clr fV
 007C           ;           page -> R20
 007C           ;            col -> R22
                        .even
 007C           _lcd_clr::
 007C 4A93              st -y,R20
 007E 6A93              st -y,R22
 0080                   .dbline -1
 0080                   .dbline 64
 0080           ; }
 0080           ; 
 0080           ; /********************LCD清屏******************************************/
 0080           ; void lcd_clr(void)                            //LCD清屏.
 0080           ; {
 0080                   .dbline 66
 0080           ;       uchar page,col;
 0080           ;       L_off;                                          //对右边控制器操作.
 0080 C09A              sbi 0x18,0
 0082                   .dbline 67
 0082           ;       R_on;
 0082 C198              cbi 0x18,1
 0084                   .dbline 68
 0084           ;       for (page=0;page<8;page++)
 0084 4427              clr R20
 0086 0DC0              xjmp L23
 0088           L20:
 0088                   .dbline 69
 0088           ;       {
 0088                   .dbline 70
 0088           ;               send_comm(page_addr_set | page);
 0088 042F              mov R16,R20
 008A 086B              ori R16,184
 008C D9DF              xcall _send_comm
 008E                   .dbline 71
 008E           ;               send_comm(col_addr_set);
 008E 00E4              ldi R16,64
 0090 D7DF              xcall _send_comm
 0092                   .dbline 72
 0092           ;               for (col=0;col<64;col++)
 0092 6627              clr R22
 0094 03C0              xjmp L27
 0096           L24:
 0096                   .dbline 73
 0096           ;               {
 0096                   .dbline 74
 0096           ;                       send_data(0x00);        //列地址自动加一.
 0096 0027              clr R16
 0098 DEDF              xcall _send_data
 009A                   .dbline 75
 009A           ;               }
 009A           L25:
 009A                   .dbline 72
 009A 6395              inc R22
 009C           L27:
 009C                   .dbline 72
 009C 6034              cpi R22,64
 009E D8F3              brlo L24
 00A0           X3:
 00A0                   .dbline 76
 00A0           ;       }
 00A0           L21:
 00A0                   .dbline 68
 00A0 4395              inc R20
 00A2           L23:
 00A2                   .dbline 68
 00A2 4830              cpi R20,8
 00A4 88F3              brlo L20
 00A6           X4:
 00A6                   .dbline 78
 00A6           ; 
 00A6           ;       L_on;
 00A6 C098              cbi 0x18,0
 00A8                   .dbline 79
 00A8           ;       R_off;                                          //对左边控制器进行操作
 00A8 C19A              sbi 0x18,1
 00AA                   .dbline 80
 00AA           ;       for (page=0;page<8;page++)
 00AA 4427              clr R20
 00AC 0DC0              xjmp L31
 00AE           L28:
 00AE                   .dbline 81
 00AE           ;       {
 00AE                   .dbline 82
 00AE           ;               send_comm(page_addr_set | page);
 00AE 042F              mov R16,R20
 00B0 086B              ori R16,184
 00B2 C6DF              xcall _send_comm
 00B4                   .dbline 83
 00B4           ;               send_comm(col_addr_set);
 00B4 00E4              ldi R16,64
 00B6 C4DF              xcall _send_comm
 00B8                   .dbline 84
 00B8           ;               for (col=0;col<64;col++)
 00B8 6627              clr R22
 00BA 03C0              xjmp L35
 00BC           L32:
 00BC                   .dbline 85
 00BC           ;               {
 00BC                   .dbline 86
 00BC           ;                       send_data(0x00);        //列地址自动加一.
 00BC 0027              clr R16
 00BE CBDF              xcall _send_data
 00C0                   .dbline 87
 00C0           ;               }
 00C0           L33:
 00C0                   .dbline 84
 00C0 6395              inc R22
 00C2           L35:
 00C2                   .dbline 84
 00C2 6034              cpi R22,64
 00C4 D8F3              brlo L32
 00C6           X5:
 00C6                   .dbline 88
 00C6           ;       }        
 00C6           L29:
 00C6                   .dbline 80
 00C6 4395              inc R20
 00C8           L31:
 00C8                   .dbline 80
 00C8 4830              cpi R20,8
 00CA 88F3              brlo L28
 00CC           X6:
 00CC                   .dbline -2
 00CC           L19:
 00CC                   .dbline 0 ; func end
 00CC 6991              ld R22,y+
 00CE 4991              ld R20,y+
 00D0 0895              ret
 00D2                   .dbsym r page 20 c
 00D2                   .dbsym r col 22 c
 00D2                   .dbend
 00D2                   .dbfunc e draw_bmp _draw_bmp fV
 00D2           ;        address -> R20
 00D2           ;              p -> R12
 00D2           ;         window -> R22
 00D2           ;              x -> R10
 00D2           ;            bmp -> R14,R15
 00D2           ;            mod -> y+16
 00D2           ;          width -> y+14
 00D2           ;            col -> y+12
 00D2           ;           page -> y+10
                        .even
 00D2           _draw_bmp::
 00D2 0E940000          xcall push_arg4
 00D6 0E940000          xcall push_xgsetF0FC
 00DA EA88              ldd R14,y+18
 00DC FB88              ldd R15,y+19
 00DE                   .dbline -1
 00DE                   .dbline 97
 00DE           ; }
 00DE           ; 
 00DE           ; 
 00DE           ; /********************************************************************************
 00DE           ; 画一个图.页地址是page,列地址是col,图形宽度为width,高固定为16,bmp是图形指针.
 00DE           ; 是否反向标志为mod,mod=0为正常,mod=1表示需要反向显示,一般用在菜单上.取模方式为字节倒序.
 00DE           ; ********************************************************************************/
 00DE           ; void draw_bmp(uchar page,uchar col,uchar width,uchar mod,const uchar *bmp)
 00DE           ; {
 00DE                   .dbline 99
 00DE           ;       uchar x,address;
 00DE           ;       uchar window=0;
 00DE 6627              clr R22
 00E0                   .dbline 100
 00E0           ;       uchar p=0;                      //p表示宽度的索引,即它的值为0到width之间.
 00E0 CC24              clr R12
 00E2                   .dbline 102
 00E2           ; 
 00E2           ;       for(x=col;x<col+width;x++)      //列地址自动加一,但对于x,一个循环后必须加一才能与列地址保持同步.
 00E2 AC84              ldd R10,y+12
 00E4 57C0              xjmp L40
 00E6           L37:
 00E6                   .dbline 103
 00E6           ;       {
 00E6                   .dbline 105
 00E6           ;                                               //每一个循环显示同一列的两个字节(连续两页).
 00E6           ;               if (x>127) return;              //若列坐标大于127,则为无效数据,硬返回,防止显示乱码.
 00E6 8FE7              ldi R24,127
 00E8 8A15              cp R24,R10
 00EA 08F4              brsh L41
 00EC           X7:
 00EC                   .dbline 105
 00EC 59C0              xjmp L36
 00EE           L41:
 00EE                   .dbline 106
 00EE           ;               if (x>63)                               //若列地址大于63,则表示要显示在右半区.
 00EE 8FE3              ldi R24,63
 00F0 8A15              cp R24,R10
 00F2 38F4              brsh L43
 00F4           X8:
 00F4                   .dbline 107
 00F4           ;               {
 00F4                   .dbline 108
 00F4           ;                       window=1;                       //表示在右窗口显示.
 00F4 61E0              ldi R22,1
 00F6                   .dbline 109
 00F6           ;                       address=x%64;
 00F6 10E4              ldi R17,64
 00F8 0A2D              mov R16,R10
 00FA 0E940000          xcall mod8u
 00FE 402F              mov R20,R16
 0100                   .dbline 110
 0100           ;               }
 0100 02C0              xjmp L44
 0102           L43:
 0102                   .dbline 112
 0102           ;               else                                    
 0102           ;               {
 0102                   .dbline 113
 0102           ;                       window=0;                       //左窗口显示.
 0102 6627              clr R22
 0104                   .dbline 114
 0104           ;                       address=x;
 0104 4A2D              mov R20,R10
 0106                   .dbline 115
 0106           ;               }
 0106           L44:
 0106                   .dbline 117
 0106           ; 
 0106           ;               if(window)                              //发送是在左屏还是右屏.
 0106 6623              tst R22
 0108 19F0              breq L45
 010A           X9:
 010A                   .dbline 118
 010A           ;               {
 010A                   .dbline 119
 010A           ;                       L_on;
 010A C098              cbi 0x18,0
 010C                   .dbline 120
 010C           ;                       R_off;                  
 010C C19A              sbi 0x18,1
 010E                   .dbline 121
 010E           ;               }
 010E 02C0              xjmp L46
 0110           L45:
 0110                   .dbline 124
 0110           ; 
 0110           ;               else
 0110           ;               {
 0110                   .dbline 125
 0110           ;                       L_off;
 0110 C09A              sbi 0x18,0
 0112                   .dbline 126
 0112           ;                       R_on;
 0112 C198              cbi 0x18,1
 0114                   .dbline 127
 0114           ;               }
 0114           L46:
 0114                   .dbline 128
 0114           ;               send_comm(page_addr_set | page);                //发送页面地址.
 0114 0A85              ldd R16,y+10
 0116 086B              ori R16,184
 0118 93DF              xcall _send_comm
 011A                   .dbline 129
 011A           ;               send_comm(col_addr_set | address);              //发送列地址.
 011A 042F              mov R16,R20
 011C 0064              ori R16,64
 011E 90DF              xcall _send_comm
 0120                   .dbline 131
 0120           ; 
 0120           ;               if (mod) send_data(~bmp[p]);
 0120 0888              ldd R0,y+16
 0122 0020              tst R0
 0124 41F0              breq L47
 0126           X10:
 0126                   .dbline 131
 0126 EC2D              mov R30,R12
 0128 FF27              clr R31
 012A EE0D              add R30,R14
 012C FF1D              adc R31,R15
 012E 0491              lpm R16,Z
 0130 0095              com R16
 0132 91DF              xcall _send_data
 0134 06C0              xjmp L48
 0136           L47:
 0136                   .dbline 132
 0136           ;               else send_data(bmp[p]);                                         //发送数据.
 0136 EC2D              mov R30,R12
 0138 FF27              clr R31
 013A EE0D              add R30,R14
 013C FF1D              adc R31,R15
 013E 0491              lpm R16,Z
 0140 8ADF              xcall _send_data
 0142           L48:
 0142                   .dbline 134
 0142           ; 
 0142           ;               if(window)
 0142 6623              tst R22
 0144 19F0              breq L49
 0146           X11:
 0146                   .dbline 135
 0146           ;               {
 0146                   .dbline 136
 0146           ;                       L_on;
 0146 C098              cbi 0x18,0
 0148                   .dbline 137
 0148           ;                       R_off;
 0148 C19A              sbi 0x18,1
 014A                   .dbline 138
 014A           ;               }
 014A 02C0              xjmp L50
 014C           L49:
 014C                   .dbline 141

⌨️ 快捷键说明

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