📄 lcddrive.s
字号:
ldi R17,0
movw R18,R22
xcall empy16s
movw R2,R16
ldi R24,<_gui_disp_buf
ldi R25,>_gui_disp_buf
add R2,R24
adc R3,R25
movw R4,R20
lsr R5
ror R4
lsr R5
ror R4
lsr R5
ror R4
add R4,R2
adc R5,R3
ldi R24,<_DCB_HEX_TAB
ldi R25,>_DCB_HEX_TAB
movw R30,R20
andi R30,7
andi R31,0
add R30,R24
adc R31,R25
lpm R30,Z
com R30
movw R26,R4
ld R2,x
and R2,R30
st x,R2
L64:
.dbline 393
;
; /* 刷新显示 */
; LCD_UpdatePoint(x, y);
movw R18,R22
movw R16,R20
xcall _LCD_UpdatePoint
.dbline 394
; return(1);
ldi R16,1
.dbline -2
L58:
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym l color 4 c
.dbsym r y 22 i
.dbsym r x 20 i
.dbend
.dbfunc e GUI_ReadPoint _GUI_ReadPoint fI
; bak -> R20
; ret -> y+4
; y -> R20,R21
; x -> R22,R23
.even
_GUI_ReadPoint::
xcall push_gset2
movw R20,R18
movw R22,R16
.dbline -1
.dbline 408
; }
;
; /****************************************************************************
; * 名称:GUI_ReadPoint()
; * 功能:读取指定点的颜色。
; * 入口参数:x 指定点所在列的位置
; * y 指定点所在行的位置
; * ret 保存颜色值的指针
; * 出口参数:返回0时表示指定地址超出有效范围。
; * 说明:对于单色,设置ret的d0位为1或0,4级灰度则为d0、d1有效,8位RGB则d0--d7有效,
; * RGB结构则R、G、B变量有效。
; ****************************************************************************/
; int GUI_ReadPoint(uint32 x, uint32 y, TCOLOR *ret)
; { TCOLOR bak;
.dbline 411
;
; /* 参数过滤 */
; if(x>=GUI_LCM_XMAX) return(0);
cpi R22,128
ldi R30,0
cpc R23,R30
brlo L66
.dbline 411
clr R16
clr R17
xjmp L65
L66:
.dbline 412
; if(y>=GUI_LCM_YMAX) return(0);
cpi R20,64
ldi R30,0
cpc R21,R30
brlo L68
.dbline 412
clr R16
clr R17
xjmp L65
L68:
.dbline 415
;
; /* 取得该点颜色(用户自行更改) */
; bak = gui_disp_buf[y][x>>3];
ldi R16,16
ldi R17,0
movw R18,R20
xcall empy16s
movw R2,R16
ldi R24,<_gui_disp_buf
ldi R25,>_gui_disp_buf
add R2,R24
adc R3,R25
movw R30,R22
lsr R31
ror R30
lsr R31
ror R30
lsr R31
ror R30
add R30,R2
adc R31,R3
ldd R20,z+0
.dbline 416
; if( (bak&DCB_HEX_TAB[x&0x07])!=0 ) *ret = 1;
ldi R24,<_DCB_HEX_TAB
ldi R25,>_DCB_HEX_TAB
movw R30,R22
andi R30,7
andi R31,0
add R30,R24
adc R31,R25
lpm R30,Z
mov R2,R20
and R2,R30
breq L70
.dbline 416
ldi R24,1
ldd R30,y+4
ldd R31,y+5
std z+0,R24
xjmp L71
L70:
.dbline 417
; else *ret = 0;
clr R2
ldd R30,y+4
ldd R31,y+5
std z+0,R2
L71:
.dbline 419
;
; return(1);
ldi R16,1
ldi R17,0
.dbline -2
L65:
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r bak 20 c
.dbsym l ret 4 pc
.dbsym r y 20 i
.dbsym r x 22 i
.dbend
.dbfunc e GUI_HLine _GUI_HLine fV
; bak -> R14,R15
; color -> R12
; x1 -> R10,R11
; y0 -> R22,R23
; x0 -> R20,R21
.even
_GUI_HLine::
xcall push_gset5
movw R22,R18
movw R20,R16
sbiw R28,1
ldd R10,y+11
ldd R11,y+12
ldd R12,y+13
.dbline -1
.dbline 434
; }
;
;
; /****************************************************************************
; * 名称:GUI_HLine()
; * 功能:画水平线。
; * 入口参数: x0 水平线起点所在列的位置
; * y0 水平线起点所在行的位置
; * x1 水平线终点所在列的位置
; * color 显示颜色(对于黑白色LCM,为0时灭,为1时显示)
; * 出口参数:无
; * 说明:操作失败原因是指定地址超出缓冲区范围。
; ****************************************************************************/
; void GUI_HLine(uint32 x0, uint32 y0, uint32 x1, uint8 color)
; { uint32 bak;
.dbline 436
;
; if(x0>x1) // 对x0、x1大小进行排列,以便画图
cp R10,R20
cpc R11,R21
brsh L73
.dbline 437
; { bak = x1;
.dbline 437
movw R14,R10
.dbline 438
; x1 = x0;
movw R10,R20
.dbline 439
; x0 = bak;
movw R20,R14
.dbline 440
; }
L73:
.dbline 441
; if(x0==x1)
cp R20,R10
cpc R21,R11
brne L75
.dbline 442
; { GUI_Point(x0, y0, color);
.dbline 442
std y+0,R12
movw R18,R22
movw R16,R20
xcall _GUI_Point
.dbline 443
; return;
xjmp L72
L75:
L77:
.dbline 447
; }
;
; do
; { /* 设置相应的点为1 */
.dbline 448
; if(0!=color) gui_disp_buf[y0][x0>>3] |= DCB_HEX_TAB[x0&0x07];
tst R12
breq L80
.dbline 448
ldi R16,16
ldi R17,0
movw R18,R22
xcall empy16s
movw R2,R16
ldi R24,<_gui_disp_buf
ldi R25,>_gui_disp_buf
add R2,R24
adc R3,R25
movw R4,R20
lsr R5
ror R4
lsr R5
ror R4
lsr R5
ror R4
add R4,R2
adc R5,R3
ldi R24,<_DCB_HEX_TAB
ldi R25,>_DCB_HEX_TAB
movw R30,R20
andi R30,7
andi R31,0
add R30,R24
adc R31,R25
lpm R30,Z
movw R26,R4
ld R2,x
or R2,R30
st x,R2
xjmp L81
L80:
.dbline 449
; else gui_disp_buf[y0][x0>>3] &= (~DCB_HEX_TAB[x0&0x07]);
ldi R16,16
ldi R17,0
movw R18,R22
xcall empy16s
movw R2,R16
ldi R24,<_gui_disp_buf
ldi R25,>_gui_disp_buf
add R2,R24
adc R3,R25
movw R4,R20
lsr R5
ror R4
lsr R5
ror R4
lsr R5
ror R4
add R4,R2
adc R5,R3
ldi R24,<_DCB_HEX_TAB
ldi R25,>_DCB_HEX_TAB
movw R30,R20
andi R30,7
andi R31,0
add R30,R24
adc R31,R25
lpm R30,Z
com R30
movw R26,R4
ld R2,x
and R2,R30
st x,R2
L81:
.dbline 451
; /* 刷新显示(一次刷新一字节) */
; if( (x0&0x07)==0x07 ) LCD_UpdatePoint(x0, y0);
movw R24,R20
andi R24,7
andi R25,0
cpi R24,7
ldi R30,0
cpc R25,R30
brne L82
.dbline 451
movw R18,R22
movw R16,R20
xcall _LCD_UpdatePoint
L82:
.dbline 453
;
; x0++;
subi R20,255 ; offset = 1
sbci R21,255
.dbline 454
L78:
.dbline 454
; }while(x1>x0);
cp R20,R10
cpc R21,R11
brsh X0
xjmp L77
X0:
.dbline 457
;
; /* 对最后一点显示操作 */
; if(0!=color) gui_disp_buf[y0][x0>>3] |= DCB_HEX_TAB[x0&0x07];
tst R12
breq L84
.dbline 457
ldi R16,16
ldi R17,0
movw R18,R22
xcall empy16s
movw R2,R16
ldi R24,<_gui_disp_buf
ldi R25,>_gui_disp_buf
add R2,R24
adc R3,R25
movw R4,R20
lsr R5
ror R4
lsr R5
ror R4
lsr R5
ror R4
add R4,R2
adc R5,R3
ldi R24,<_DCB_HEX_TAB
ldi R25,>_DCB_HEX_TAB
movw R30,R20
andi R30,7
andi R31,0
add R30,R24
adc R31,R25
lpm R30,Z
movw R26,R4
ld R2,x
or R2,R30
st x,R2
xjmp L85
L84:
.dbline 458
; else gui_disp_buf[y0][x0>>3] &= (~DCB_HEX_TAB[x0&0x07]);
ldi R16,16
ldi R17,0
movw R18,R22
xcall empy16s
movw R2,R16
ldi R24,<_gui_disp_buf
ldi R25,>_gui_disp_buf
add R2,R24
adc R3,R25
movw R4,R20
lsr R5
ror R4
lsr R5
ror R4
lsr R5
ror R4
add R4,R2
adc R5,R3
ldi R24,<_DCB_HEX_TAB
ldi R25,>_DCB_HEX_TAB
movw R30,R20
andi R30,7
andi R31,0
add R30,R24
adc R31,R25
lpm R30,Z
com R30
movw R26,R4
ld R2,x
and R2,R30
st x,R2
L85:
.dbline 459
; LCD_UpdatePoint(x0, y0);
movw R18,R22
movw R16,R20
xcall _LCD_UpdatePoint
.dbline -2
L72:
adiw R28,1
xcall pop_gset5
.dbline 0 ; func end
ret
.dbsym r bak 14 i
.dbsym r color 12 c
.dbsym r x1 10 i
.dbsym r y0 22 i
.dbsym r x0 20 i
.dbend
.dbfunc e GUI_RLine _GUI_RLine fV
; bak -> R14,R15
; color -> R20
; y1 -> R22,R23
; y0 -> R10,R11
; x0 -> R12,R13
.even
_GUI_RLine::
xcall push_gset5
movw R10,R18
movw R12,R16
sbiw R28,1
ldd R22,y+11
ldd R23,y+12
ldd R20,y+13
.dbline -1
.dbline 474
; }
;
;
; /****************************************************************************
; * 名称:GUI_RLine()
; * 功能:画垂直线。
; * 入口参数: x0 垂直线起点所在列的位置
; * y0 垂直线起点所在行的位置
; * y1 垂直线终点所在行的位置
; * color 显示颜色(对于黑白色LCM,为0时灭,为1时显示)
; * 出口参数:无
; * 说明:操作失败原因是指定地址超出缓冲区范围。
; ****************************************************************************/
; void GUI_RLine(uint32 x0, uint32 y0, uint32 y1, uint8 color)
; { uint32 bak;
.dbline 476
;
; if(y0>y1) // 对y0、y1大小进行排列,以便画图
cp R22,R10
cpc R23,R11
brsh L87
.dbline 477
; { bak = y1;
.dbline 477
movw R14,R22
.dbline 478
; y1 = y0;
movw R22,R10
.dbline 479
; y0 = bak;
movw R10,R14
.dbline 480
; }
L87:
.dbline 481
; if(y0==y1)
cp R10,R22
cpc R11,R23
brne L89
.dbline 482
; { GUI_Point(x0, y0, color);
.dbline 482
std y+0,R20
movw R18,R10
movw R16,R12
xcall _GUI_Point
.dbline 483
; return;
xjmp L86
L89:
L91:
.dbline 487
; }
;
; do
; { GUI_Point(x0, y0, color); // 逐点显示,描出垂直线
.dbline 487
std y+0,R20
movw R18,R10
movw R16,R12
xcall _GUI_Point
.dbline 488
; y0++;
movw R24,R10
adiw R24,1
movw R10,R24
.dbline 489
L92:
.dbline 489
; }while(y1>y0);
cp R10,R22
cpc R11,R23
brlo L91
.dbline 490
; GUI_Point(x0, y0, color);
std y+0,R20
movw R18,R10
movw R16,R12
xcall _GUI_Point
.dbline -2
L86:
adiw R28,1
xcall pop_gset5
.dbline 0 ; func end
ret
.dbsym r bak 14 i
.dbsym r color 20 c
.dbsym r y1 22 i
.dbsym r y0 10 i
.dbsym r x0 12 i
.dbend
.area bss(ram, con, rel)
.dbfile G:\IccPro\mega128_lcd\lcddrive.c
_gui_disp_buf::
.blkb 1024
.dbsym e gui_disp_buf _gui_disp_buf A[1024:64:16]c
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -