📄 lcddrive.lis
字号:
023C 11C0 xjmp L55
023E L52:
023E .dbline 336
023E .dbline 336
023E 00E1 ldi R16,16
0240 10E0 ldi R17,0
0242 9A01 movw R18,R20
0244 0E940000 xcall empy16s
0248 1801 movw R2,R16
024A 80E0 ldi R24,<_gui_disp_buf
024C 90E0 ldi R25,>_gui_disp_buf
024E 280E add R2,R24
0250 391E adc R3,R25
0252 F501 movw R30,R10
0254 E20D add R30,R2
0256 F31D adc R31,R3
0258 6083 std z+0,R22
025A .dbline 337
025A L53:
025A .dbline 335
025A C501 movw R24,R10
025C 0196 adiw R24,1
025E 5C01 movw R10,R24
0260 L55:
0260 .dbline 335
0260 C501 movw R24,R10
0262 8031 cpi R24,16
0264 E0E0 ldi R30,0
0266 9E07 cpc R25,R30
0268 50F3 brlo L52
026A .dbline 338
026A L49:
026A .dbline 334
026A 4F5F subi R20,255 ; offset = 1
026C 5F4F sbci R21,255
026E L51:
026E .dbline 334
026E 4034 cpi R20,64
0270 E0E0 ldi R30,0
0272 5E07 cpc R21,R30
0274 08F3 brlo L48
0276 .dbline 341
0276 ; { gui_disp_buf[i][j] = dat; // 填充数据
0276 ; }
0276 ; }
0276 ;
0276 ; /* 填充LCM */
0276 ; LCD_FillAll(dat);
0276 062F mov R16,R22
0278 82DF xcall _LCD_FillAll
027A .dbline -2
027A L47:
027A 0E940000 xcall pop_gset3
027E .dbline 0 ; func end
027E 0895 ret
0280 .dbsym r i 20 i
0280 .dbsym r j 10 i
0280 .dbsym r dat 22 c
0280 .dbend
0280 .dbfunc e GUI_Initialize _GUI_Initialize fV
.even
0280 _GUI_Initialize::
0280 .dbline -1
0280 .dbline 352
0280 ; }
0280 ;
0280 ;
0280 ; /****************************************************************************
0280 ; * 名称:GUI_Initialize()
0280 ; * 功能:初始化GUI,包括初始化显示缓冲区,初始化LCM并清屏。
0280 ; * 入口参数:无
0280 ; * 出口参数:无
0280 ; ****************************************************************************/
0280 ; void GUI_Initialize(void)
0280 ; { LCD_Initialize(); // 初始化LCM模块工作模式,纯图形模式
0280 .dbline 352
0280 63DF xcall _LCD_Initialize
0282 .dbline 353
0282 ; GUI_FillSCR(0x00); // 初始化缓冲区为0x00,并输出屏幕(清屏)
0282 0027 clr R16
0284 D3DF xcall _GUI_FillSCR
0286 .dbline -2
0286 L56:
0286 .dbline 0 ; func end
0286 0895 ret
0288 .dbend
0288 .dbfunc e GUI_ClearSCR _GUI_ClearSCR fV
.even
0288 _GUI_ClearSCR::
0288 .dbline -1
0288 .dbline 365
0288 ; }
0288 ;
0288 ;
0288 ; /****************************************************************************
0288 ; * 名称:GUI_ClearSCR()
0288 ; * 功能:清屏。
0288 ; * 入口参数:无
0288 ; * 出口参数:无
0288 ; * 说明:用户根据LCM的实际情况编写此函数。
0288 ; ****************************************************************************/
0288 ; void GUI_ClearSCR(void)
0288 ; { GUI_FillSCR(0x00);
0288 .dbline 365
0288 0027 clr R16
028A D0DF xcall _GUI_FillSCR
028C .dbline -2
028C L57:
028C .dbline 0 ; func end
028C 0895 ret
028E .dbend
.area lit(rom, con, rel)
0000 _DCB_HEX_TAB::
0000 8040 .byte 128,64
0002 2010 .byte 32,16
0004 0804 .byte 8,4
0006 0201 .byte 2,1
0008 .dbsym e DCB_HEX_TAB _DCB_HEX_TAB A[8:8]kc
.area text(rom, con, rel)
028E .dbfile G:\IccPro\mega128_lcd\lcddrive.c
028E .dbfunc e GUI_Point _GUI_Point fc
028E ; color -> y+4
028E ; y -> R22,R23
028E ; x -> R20,R21
.even
028E _GUI_Point::
028E 0E940000 xcall push_gset2
0292 B901 movw R22,R18
0294 A801 movw R20,R16
0296 .dbline -1
0296 .dbline 384
0296 ; }
0296 ;
0296 ;
0296 ; uint8 const DCB_HEX_TAB[8] = {0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01};
0296 ;
0296 ; /****************************************************************************
0296 ; * 名称:GUI_Point()
0296 ; * 功能:在指定位置上画点。
0296 ; * 入口参数: x 指定点所在列的位置
0296 ; * y 指定点所在行的位置
0296 ; * color 显示颜色(对于黑白色LCM,为0时灭,为1时显示)
0296 ; * 出口参数:返回值为1时表示操作成功,为0时表示操作失败。(操作失败原因是指定地址超出有
0296 ; * 效范围)
0296 ; * 说明:用户根据LCM的实际情况编写此函数。对于单色,只有一个位有效,则要使用左移的方法
0296 ; * 实现point_dat = (point_dat&MASK_TAB [i]) | (color<<n),其它位数的一样
0296 ; * 处理。
0296 ; ****************************************************************************/
0296 ; uint8 GUI_Point(uint32 x, uint32 y, TCOLOR color)
0296 ; { /* 参数过滤 */
0296 .dbline 385
0296 ; if(x>=GUI_LCM_XMAX) return(0);
0296 4038 cpi R20,128
0298 E0E0 ldi R30,0
029A 5E07 cpc R21,R30
029C 10F0 brlo L59
029E .dbline 385
029E 0027 clr R16
02A0 4DC0 xjmp L58
02A2 L59:
02A2 .dbline 386
02A2 ; if(y>=GUI_LCM_YMAX) return(0);
02A2 6034 cpi R22,64
02A4 E0E0 ldi R30,0
02A6 7E07 cpc R23,R30
02A8 10F0 brlo L61
02AA .dbline 386
02AA 0027 clr R16
02AC 47C0 xjmp L58
02AE L61:
02AE .dbline 389
02AE ;
02AE ; /* 设置缓冲区相应的点 */
02AE ; if( (color&0x01) != 0 ) gui_disp_buf[y][x>>3] |= DCB_HEX_TAB[x&0x07];
02AE 0C80 ldd R0,y+4
02B0 00FE sbrs R0,0
02B2 20C0 rjmp L63
02B4 .dbline 389
02B4 00E1 ldi R16,16
02B6 10E0 ldi R17,0
02B8 9B01 movw R18,R22
02BA 0E940000 xcall empy16s
02BE 1801 movw R2,R16
02C0 80E0 ldi R24,<_gui_disp_buf
02C2 90E0 ldi R25,>_gui_disp_buf
02C4 280E add R2,R24
02C6 391E adc R3,R25
02C8 2A01 movw R4,R20
02CA 5694 lsr R5
02CC 4794 ror R4
02CE 5694 lsr R5
02D0 4794 ror R4
02D2 5694 lsr R5
02D4 4794 ror R4
02D6 420C add R4,R2
02D8 531C adc R5,R3
02DA 80E0 ldi R24,<_DCB_HEX_TAB
02DC 90E0 ldi R25,>_DCB_HEX_TAB
02DE FA01 movw R30,R20
02E0 E770 andi R30,7
02E2 F070 andi R31,0
02E4 E80F add R30,R24
02E6 F91F adc R31,R25
02E8 E491 lpm R30,Z
02EA D201 movw R26,R4
02EC 2C90 ld R2,x
02EE 2E2A or R2,R30
02F0 2C92 st x,R2
02F2 20C0 xjmp L64
02F4 L63:
02F4 .dbline 390
02F4 ; else gui_disp_buf[y][x>>3] &= (~DCB_HEX_TAB[x&0x07]);
02F4 00E1 ldi R16,16
02F6 10E0 ldi R17,0
02F8 9B01 movw R18,R22
02FA 0E940000 xcall empy16s
02FE 1801 movw R2,R16
0300 80E0 ldi R24,<_gui_disp_buf
0302 90E0 ldi R25,>_gui_disp_buf
0304 280E add R2,R24
0306 391E adc R3,R25
0308 2A01 movw R4,R20
030A 5694 lsr R5
030C 4794 ror R4
030E 5694 lsr R5
0310 4794 ror R4
0312 5694 lsr R5
0314 4794 ror R4
0316 420C add R4,R2
0318 531C adc R5,R3
031A 80E0 ldi R24,<_DCB_HEX_TAB
031C 90E0 ldi R25,>_DCB_HEX_TAB
031E FA01 movw R30,R20
0320 E770 andi R30,7
0322 F070 andi R31,0
0324 E80F add R30,R24
0326 F91F adc R31,R25
0328 E491 lpm R30,Z
032A E095 com R30
032C D201 movw R26,R4
032E 2C90 ld R2,x
0330 2E22 and R2,R30
0332 2C92 st x,R2
0334 L64:
0334 .dbline 393
0334 ;
0334 ; /* 刷新显示 */
0334 ; LCD_UpdatePoint(x, y);
0334 9B01 movw R18,R22
0336 8A01 movw R16,R20
0338 43DF xcall _LCD_UpdatePoint
033A .dbline 394
033A ; return(1);
033A 01E0 ldi R16,1
033C .dbline -2
033C L58:
033C 0E940000 xcall pop_gset2
0340 .dbline 0 ; func end
0340 0895 ret
0342 .dbsym l color 4 c
0342 .dbsym r y 22 i
0342 .dbsym r x 20 i
0342 .dbend
0342 .dbfunc e GUI_ReadPoint _GUI_ReadPoint fI
0342 ; bak -> R20
0342 ; ret -> y+4
0342 ; y -> R20,R21
0342 ; x -> R22,R23
.even
0342 _GUI_ReadPoint::
0342 0E940000 xcall push_gset2
0346 A901 movw R20,R18
0348 B801 movw R22,R16
034A .dbline -1
034A .dbline 408
034A ; }
034A ;
034A ; /****************************************************************************
034A ; * 名称:GUI_ReadPoint()
034A ; * 功能:读取指定点的颜色。
034A ; * 入口参数:x 指定点所在列的位置
034A ; * y 指定点所在行的位置
034A ; * ret 保存颜色值的指针
034A ; * 出口参数:返回0时表示指定地址超出有效范围。
034A ; * 说明:对于单色,设置ret的d0位为1或0,4级灰度则为d0、d1有效,8位RGB则d0--d7有效,
034A ; * RGB结构则R、G、B变量有效。
034A ; ****************************************************************************/
034A ; int GUI_ReadPoint(uint32 x, uint32 y, TCOLOR *ret)
034A ; { TCOLOR bak;
034A .dbline 411
034A ;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -