📄 menu.lis
字号:
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 + -