?? gui.s
字號:
.module gui.c
.area text(rom, con, rel)
.dbfile C:\DOCUME~1\Administrator\桌面\12864-ICC\gui.c
.dbfunc e GUI_HLine _GUI_HLine fV
; bak -> R14
; color -> R20
; x1 -> R22,R23
; y0 -> R10
; x0 -> R12,R13
.even
_GUI_HLine::
xcall push_gset5
mov R10,R18
movw R12,R16
sbiw R28,1
ldd R22,y+11
ldd R23,y+12
ldd R20,y+13
.dbline -1
.dbline 23
; /****************************************************************************************
; * 文件名:GUI.C
; * 功能:GUI基本繪圖函數(shù)。進(jìn)行基本繪圖運(yùn)算,并調(diào)用相應(yīng)的刷新程序更新LCD顯示。
; * 作者:黃紹斌
; * 修改:馮建輝
; * 日期:2006.09.13
; * 備注:圖形操作層,進(jìn)行各種圖形運(yùn)算操作。
; ****************************************************************************************/
; #include "gui.h"
; #include <math.h>
;
; /****************************************************************************
; * 名稱:GUI_HLine()
; * 功能:畫水平線。
; * 入口參數(shù):x0 水平線起點(diǎn)所在列的位置
; * y0 水平線起點(diǎn)所在行的位置
; * x1 水平線終點(diǎn)所在列的位置
; * color 顯示顏色(對于黑白色LCM,為0時滅,為1時顯示)
; * 出口參數(shù):無
; * 說明:操作失敗原因是指定地址超出緩沖區(qū)范圍。
; ****************************************************************************/
; void GUI_HLine(unsigned int x0, unsigned char y0, unsigned int x1, TCOLOR color)
; {
.dbline 25
; unsigned char bak;
; if(x0>x1) // 對x0、x1大小進(jìn)行排列,以便畫圖
cp R22,R12
cpc R23,R13
brsh L3
.dbline 26
; {
.dbline 27
; bak = x1;
mov R14,R22
.dbline 28
; x1 = x0;
movw R22,R12
.dbline 29
; x0 = bak;
mov R12,R14
clr R13
.dbline 30
; }
L3:
L5:
.dbline 32
; do
; {
.dbline 33
; GUI_Point(x0, y0, color); // 逐點(diǎn)顯示,描出垂直線
std y+0,R20
mov R18,R10
mov R16,R12
xcall _GUI_Point
.dbline 34
; x0++;
movw R24,R12
adiw R24,1
movw R12,R24
.dbline 35
; }
L6:
.dbline 36
; while(x1>=x0);
cp R22,R12
cpc R23,R13
brsh L5
.dbline -2
L2:
adiw R28,1
xcall pop_gset5
.dbline 0 ; func end
ret
.dbsym r bak 14 c
.dbsym r color 20 c
.dbsym r x1 22 i
.dbsym r y0 10 c
.dbsym r x0 12 i
.dbend
.dbfunc e GUI_RLine _GUI_RLine fV
; bak -> R14
; color -> R20
; y1 -> R22
; y0 -> R10
; x0 -> R12,R13
.even
_GUI_RLine::
xcall push_gset5
mov R10,R18
movw R12,R16
sbiw R28,1
ldd R22,y+11
ldd R20,y+13
.dbline -1
.dbline 50
; }
;
; /***********************************************************************
; * 名稱:GUI_RLine()
; * 功能:畫豎直線。根據(jù)硬件特點(diǎn),實(shí)現(xiàn)加速。
; * 入口參數(shù):x0 垂直線起點(diǎn)所在列的位置
; * y0 垂直線起點(diǎn)所在行的位置
; * y1 垂直線終點(diǎn)所在行的位置
; * color 顯示顏色(對于黑白色LCM,為0時滅,為1時顯示)
; * 出口參數(shù): 無
; * 說明:操作失敗原因是指定地址超出緩沖區(qū)范圍。
; ***********************************************************************/
; void GUI_RLine(unsigned int x0, unsigned char y0, unsigned char y1, TCOLOR color)
; {
.dbline 52
; unsigned char bak;
; if(y0>y1) // 對y0、y1大小進(jìn)行排列,以便畫圖
cp R22,R10
brsh L9
.dbline 53
; {
.dbline 54
; bak = y1;
mov R14,R22
.dbline 55
; y1 = y0;
mov R22,R10
.dbline 56
; y0 = bak;
mov R10,R14
.dbline 57
; }
L9:
L11:
.dbline 59
; do
; {
.dbline 60
; GUI_Point(x0, y0, color); // 逐點(diǎn)顯示,描出垂直線
std y+0,R20
mov R18,R10
mov R16,R12
xcall _GUI_Point
.dbline 61
; y0++;
inc R10
.dbline 62
; }
L12:
.dbline 63
; while(y1>=y0);
cp R22,R10
brsh L11
.dbline -2
L8:
adiw R28,1
xcall pop_gset5
.dbline 0 ; func end
ret
.dbsym r bak 14 c
.dbsym r color 20 c
.dbsym r y1 22 c
.dbsym r y0 10 c
.dbsym r x0 12 i
.dbend
.dbfunc e GUI_Rectangle _GUI_Rectangle fV
; color -> R22
; y1 -> y+11
; x1 -> y+9
; y0 -> R20
; x0 -> R10,R11
.even
_GUI_Rectangle::
xcall push_gset3
mov R20,R18
movw R10,R16
sbiw R28,3
ldd R22,y+13
.dbline -1
.dbline 78
; }
;
; /****************************************************************************
; * 名稱:GUI_Rectangle()
; * 功能:畫矩形。
; * 入口參數(shù):x0 矩形左上角的x坐標(biāo)值
; * y0 矩形左上角的y坐標(biāo)值
; * x1 矩形右下角的x坐標(biāo)值
; * y1 矩形右下角的y坐標(biāo)值
; * color 顯示顏色
; * 出口參數(shù):無
; * 說明:操作失敗原因是指定地址超出有效范圍。
; ****************************************************************************/
; void GUI_Rectangle(uint16 x0, uint8 y0, uint16 x1, uint8 y1, TCOLOR color)
; {
.dbline 79
; GUI_HLine(x0, y0, x1, color);
std y+2,R22
ldd R0,y+9
ldd R1,y+10
std y+1,R1
std y+0,R0
mov R18,R20
movw R16,R10
xcall _GUI_HLine
.dbline 80
; GUI_HLine(x0, y1, x1, color);
std y+2,R22
ldd R0,y+9
ldd R1,y+10
std y+1,R1
std y+0,R0
ldd R18,y+11
movw R16,R10
xcall _GUI_HLine
.dbline 81
; GUI_RLine(x0, y0, y1, color);
std y+2,R22
ldd R0,y+11
std y+0,R0
mov R18,R20
movw R16,R10
xcall _GUI_RLine
.dbline 82
; GUI_RLine(x1, y0, y1, color);
std y+2,R22
ldd R0,y+11
std y+0,R0
mov R18,R20
ldd R16,y+9
ldd R17,y+10
xcall _GUI_RLine
.dbline -2
L14:
adiw R28,3
xcall pop_gset3
.dbline 0 ; func end
ret
.dbsym r color 22 c
.dbsym l y1 11 c
.dbsym l x1 9 i
.dbsym r y0 20 c
.dbsym r x0 10 i
.dbend
.dbfunc e GUI_RectangleFill _GUI_RectangleFill fV
; i -> y+3
; color -> R20
; y1 -> R22
; x1 -> R10,R11
; y0 -> R12
; x0 -> R14,R15
.even
_GUI_RectangleFill::
xcall push_gset5
mov R12,R18
movw R14,R16
sbiw R28,7
ldd R10,y+17
ldd R11,y+18
ldd R22,y+19
ldd R20,y+21
.dbline -1
.dbline 97
; }
;
; /****************************************************************************
; * 名稱:GUI_RectangleFill()
; * 功能:填充矩形。畫一個填充的矩形,填充色與邊框色一樣。
; * 入口參數(shù):x0 矩形左上角的x坐標(biāo)值
; * y0 矩形左上角的y坐標(biāo)值
; * x1 矩形右下角的x坐標(biāo)值
; * y1 矩形右下角的y坐標(biāo)值
; * color 填充顏色
; * 出口參數(shù):無
; * 說明:操作失敗原因是指定地址超出有效范圍。
; ****************************************************************************/
; void GUI_RectangleFill(uint16 x0, uint8 y0, uint16 x1, uint8 y1, TCOLOR color)
; {
.dbline 101
; uint32 i;
;
; /* 先找出矩形左上角與右下角的兩個點(diǎn),保存在(x0,y0),(x1,y1) */
; if(x0>x1) // 若x0>x1,則x0與x1交換
cp R10,R14
cpc R11,R15
brsh L16
.dbline 102
; {
.dbline 103
; i = x0;
movw R2,R14
clr R4
clr R5
movw R30,R28
std z+3,R2
std z+4,R3
std z+5,R4
std z+6,R5
.dbline 104
; x0 = x1;
movw R14,R10
.dbline 105
; x1 = i;
movw R30,R28
ldd R10,z+3
ldd R11,z+4
.dbline 106
; }
L16:
.dbline 107
; if(y0>y1) // 若y0>y1,則y0與y1交換
cp R22,R12
brsh L18
.dbline 108
; {
.dbline 109
; i = y0;
mov R2,R12
clr R3
clr R4
clr R5
movw R30,R28
std z+3,R2
std z+4,R3
std z+5,R4
std z+6,R5
.dbline 110
; y0 = y1;
mov R12,R22
.dbline 111
; y1 = i;
movw R30,R28
ldd R2,z+3
ldd R3,z+4
ldd R4,z+5
ldd R5,z+6
mov R22,R2
.dbline 112
; }
L18:
.dbline 115
;
; /* 判斷是否只是直線 */
; if(y0==y1)
cp R12,R22
brne L20
.dbline 116
; {
.dbline 117
; GUI_HLine(x0, y0, x1, color);
std y+2,R20
std y+1,R11
std y+0,R10
mov R18,R12
movw R16,R14
xcall _GUI_HLine
.dbline 118
; return;
xjmp L15
L20:
.dbline 120
; }
; if(x0==x1)
cp R14,R10
cpc R15,R11
brne L25
.dbline 121
; {
.dbline 122
; GUI_RLine(x0, y0, y1, color);
std y+2,R20
std y+0,R22
mov R18,R12
movw R16,R14
xcall _GUI_RLine
.dbline 123
; return;
xjmp L15
L24:
.dbline 127
.dbline 128
std y+2,R20
std y+1,R11
std y+0,R10
mov R18,R12
movw R16,R14
xcall _GUI_HLine
.dbline 129
inc R12
.dbline 130
L25:
.dbline 126
; }
;
; while(y0<=y1)
cp R22,R12
brsh L24
.dbline -2
L15:
adiw R28,7
xcall pop_gset5
.dbline 0 ; func end
ret
.dbsym l i 3 l
.dbsym r color 20 c
.dbsym r y1 22 c
.dbsym r x1 10 i
.dbsym r y0 12 c
.dbsym r x0 14 i
.dbend
.dbfunc e GUI_Square _GUI_Square fV
; color -> y+21
; with -> y+17
; y0 -> y+13
; x0 -> y+9
.even
_GUI_Square::
xcall push_arg4
xcall push_gset2
sbiw R28,5
.dbline -1
.dbline 144
; {
; GUI_HLine(x0, y0, x1, color); // 當(dāng)前畫水平線
; y0++; // 下一行
; }
; }
;
; /****************************************************************************
; * 名稱:GUI_Square()
; * 功能:畫正方形。
; * 入口參數(shù):x0 正方形左上角的x坐標(biāo)值
; * y0 正方形左上角的y坐標(biāo)值
; * with 正方形的邊長
; * color 顯示顏色
; * 出口參數(shù):無
; * 說明:操作失敗原因是指定地址超出有效范圍。
; ****************************************************************************/
; void GUI_Square(uint32 x0, uint32 y0, uint32 with, TCOLOR color)
; {
.dbline 145
; if(with==0)
ldi R20,0
ldi R21,0
ldi R22,0
ldi R23,0
movw R30,R28
ldd R2,z+17
ldd R3,z+18
ldd R4,z+19
ldd R5,z+20
cp R2,R20
cpc R3,R21
cpc R4,R22
cpc R5,R23
brne L28
.dbline 146
; return;
xjmp L27
L28:
.dbline 147
; if( (x0+with) > GUI_LCM_XMAX )
movw R30,R28
ldd R2,z+17
ldd R3,z+18
ldd R4,z+19
ldd R5,z+20
movw R30,R28
ldd R6,z+9
ldd R7,z+10
ldd R8,z+11
ldd R9,z+12
add R6,R2
adc R7,R3
adc R8,R4
adc R9,R5
ldi R20,128
ldi R21,0
ldi R22,0
ldi R23,0
cp R20,R6
cpc R21,R7
cpc R22,R8
cpc R23,R9
brsh L30
.dbline 148
; return;
xjmp L27
L30:
.dbline 149
; if( (y0+with) > GUI_LCM_YMAX )
movw R30,R28
ldd R2,z+17
ldd R3,z+18
ldd R4,z+19
ldd R5,z+20
movw R30,R28
ldd R6,z+13
ldd R7,z+14
ldd R8,z+15
ldd R9,z+16
add R6,R2
adc R7,R3
adc R8,R4
adc R9,R5
ldi R20,64
ldi R21,0
ldi R22,0
ldi R23,0
cp R20,R6
cpc R21,R7
cpc R22,R8
cpc R23,R9
brsh L32
.dbline 150
; return;
xjmp L27
L32:
.dbline 151
; GUI_Rectangle(x0, y0, x0+with, y0+with, color);
ldd R0,y+21
std y+4,R0
movw R30,R28
ldd R2,z+17
ldd R3,z+18
ldd R4,z+19
ldd R5,z+20
movw R30,R28
ldd R6,z+13
ldd R7,z+14
ldd R8,z+15
ldd R9,z+16
add R6,R2
adc R7,R3
adc R8,R4
adc R9,R5
std y+2,R6
movw R30,R28
ldd R2,z+17
ldd R3,z+18
movw R30,R28
ldd R4,z+9
ldd R5,z+10
add R4,R2
adc R5,R3
std y+1,R5
std y+0,R4
movw R30,R28
ldd R2,z+13
ldd R3,z+14
ldd R4,z+15
ldd R5,z+16
mov R18,R2
movw R30,R28
ldd R16,z+9
ldd R17,z+10
xcall _GUI_Rectangle
.dbline -2
L27:
adiw R28,5
xcall pop_gset2
adiw R28,4
.dbline 0 ; func end
ret
.dbsym l color 21 c
.dbsym l with 17 l
.dbsym l y0 13 l
.dbsym l x0 9 l
.dbend
.dbfunc e GUI_Line _GUI_Line fV
; dy -> y+19
; dx -> y+15
; dy_x2 -> y+11
; dx_x2 -> y+7
; dy_sym -> R10
; dx_sym -> R12
; di -> y+3
; color -> R14
; y1 -> y+45
; x1 -> y+41
; y0 -> y+37
; x0 -> y+33
.even
_GUI_Line::
xcall push_arg4
xcall push_gset5
sbiw R28,23
ldd R14,y+49
.dbline -1
.dbline 168
; }
;
;
;
; /****************************************************************************
; * 名稱:GUI_Line()
; * 功能:畫任意兩點(diǎn)之間的直線。
; * 入口參數(shù):x0 直線起點(diǎn)的x坐標(biāo)值
; * y0 直線起點(diǎn)的y坐標(biāo)值
; * x1 直線終點(diǎn)的x坐標(biāo)值
; * y1 直線終點(diǎn)的y坐標(biāo)值
; * color 顯示顏色(對于黑白色LCM,為0時滅,為1時顯示)
; * 出口參數(shù):無
; * 說明:操作失敗原因是指定地址超出有效范圍。
; ****************************************************************************/
; void GUI_Line(uint32 x0, uint32 y0, uint32 x1, uint32 y1, TCOLOR color)
; {
.dbline 177
; int32 dx; // 直線x軸差值變量
; int32 dy; // 直線y軸差值變量
; int8 dx_sym; // x軸增長方向,為-1時減值方向,為1時增值方向
; int8 dy_sym; // y軸增長方向,為-1時減值方向,為1時增值方向
; int32 dx_x2; // dx*2值變量,用于加快運(yùn)算速度
; int32 dy_x2; // dy*2值變量,用于加快運(yùn)算速度
; int32 di; // 決策變量
;
; dx = x1-x0; // 求取兩點(diǎn)之間的差值
movw R30,R28
ldd R2,z+33
ldd R3,z+34
ldd R4,z+35
ldd R5,z+36
movw R30,R28
ldd R6,z+41
ldd R7,z+42
ldd R8,z+43
ldd R9,z+44
sub R6,R2
sbc R7,R3
sbc R8,R4
sbc R9,R5
movw R30,R28
std z+15,R6
std z+16,R7
std z+17,R8
std z+18,R9
.dbline 178
; dy = y1-y0;
movw R30,R28
ldd R2,z+37
ldd R3,z+38
ldd R4,z+39
ldd R5,z+40
movw R30,R28
ldd R6,z+45
ldd R7,z+46
ldd R8,z+47
ldd R9,z+48
sub R6,R2
sbc R7,R3
sbc R8,R4
sbc R9,R5
movw R30,R28
std z+19,R6
std z+20,R7
std z+21,R8
std z+22,R9
.dbline 181
;
; /* 判斷增長方向,或是否為水平線、垂直線、點(diǎn) */
; if(dx>0) // 判斷x軸方向
ldi R20,0
ldi R21,0
ldi R22,0
ldi R23,0
movw R30,R28
ldd R2,z+15
ldd R3,z+16
ldd R4,z+17
ldd R5,z+18
cp R20,R2
cpc R21,R3
cpc R22,R4
cpc R23,R5
brge L35
.dbline 182
; {
.dbline 183
; dx_sym = 1; // dx>0,設(shè)置dx_sym=1
clr R12
inc R12
.dbline 184
; }
xjmp L36
L35:
.dbline 186
; else
; {
.dbline 187
; if(dx<0)
ldi R20,0
ldi R21,0
ldi R22,0
ldi R23,0
movw R30,R28
ldd R2,z+15
ldd R3,z+16
ldd R4,z+17
ldd R5,z+18
cp R2,R20
cpc R3,R21
cpc R4,R22
cpc R5,R23
brge L37
.dbline 188
; {
.dbline 189
; dx_sym = -1; // dx<0,設(shè)置dx_sym=-1
ldi R24,255
mov R12,R24
.dbline 190
; }
xjmp L38
L37:
.dbline 192
; else
; { // dx==0,畫垂直線,或一點(diǎn)
.dbline 193
; GUI_RLine(x0, y0, y1, color);
std y+2,R14
movw R30,R28
ldd R2,z+45
ldd R3,z+46
ldd R4,z+47
ldd R5,z+48
std y+0,R2
movw R30,R28
ldd R2,z+37
ldd R3,z+38
ldd R4,z+39
ldd R5,z+40
mov R18,R2
movw R30,R28
ldd R16,z+33
ldd R17,z+34
xcall _GUI_RLine
.dbline 194
; return;
xjmp L34
L38:
.dbline 196
; }
; }
L36:
.dbline 198
;
; if(dy>0) // 判斷y軸方向
ldi R20,0
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -