📄 gui12864.s
字号:
.byte 192,0
.byte 254,0
.byte 0,254
.byte 0,0
.byte 0,0
.byte 0,254
.byte 248,251
.byte 248,248
.byte 251,248
.byte 248,251
.byte 248,248
.byte 251,250
.byte 250,250
.byte 250,250
.byte 248,248
.byte 251,248
.byte 248,248
.byte 248,249
.byte 251,248
.byte 248,248
.byte 249,250
.byte 250,250
.byte 249,248
.dbsym e menuicon1 _menuicon1 A[68:2:34]kc
_temperature::
.byte 0,0
.byte 64,32
.byte 16,8
.byte 6,6
.byte 0,0
.byte 255,255
.byte 1,60
.byte 'B,'B
.byte 'B,0
.dbsym e temperature _temperature A[18:18]kc
.area text(rom, con, rel)
.dbfile F:\CODE\LCD1286418\gui12864.h
.dbfile F:\CODE\LCD1286418\gui12864.c
.dbfunc e GuiDrawLine _GuiDrawLine fV
; signy -> R14
; signx -> R12
; dy -> R22,R23
; dx -> y+4
; temp -> R20
; y -> y+3
; x -> y+2
; p -> R10,R11
; color -> y+24
; y2 -> y+22
; x2 -> y+20
; y1 -> R10
; x1 -> y+16
.even
_GuiDrawLine::
xcall push_arg4
xcall push_xgsetF0FC
mov R10,R18
sbiw R28,6
.dbline -1
.dbline 46
; /***********************************************************************************************
; * FILE NAME: gui12864.c
; * PURPOSE: lcd1286418 GUI Firmware
; * DESCRIPTION: ONLY FOR 128*64 PIXEL LCD
; * DEVELOPMENT HISTORY:
; * Date Author Release Description Of Change
; * -------- ------------ --------- ------------------------------------------------
; * 08-04-11 XuGuohong 1.0 Testing Edition
; /**********************************************************************************************/
;
; /* Include Global Parameters */
; #include <iom128v.h>
; #include "avr.h"
; #include "gui12864.h"
;
; /* Include Global Parameters */
;
;
; /* Declare Prototypes */
; void GuiDrawLine(unsigned char,unsigned char,unsigned char,unsigned char,unsigned char);
; void GuiDrawCircle(unsigned char,unsigned char,unsigned char,unsigned char);
; void GuiDrawSquare(unsigned char,unsigned char,unsigned char,unsigned char,unsigned char);
; void GuiDisCharF3(unsigned char,unsigned char,unsigned char,unsigned char);
; void GuiDisStringF3(unsigned char,unsigned char,unsigned char *,unsigned char);
; //void GuiDisCharF2(unsigned char,unsigned char,unsigned char,unsigned char);
; //void GuiDisCharF1(unsigned char,unsigned char,unsigned char,unsigned char);
; void GuiDisLogo(unsigned char);
; void GuiDisRoolStringF3(unsigned char,unsigned char,unsigned char,unsigned char *,unsigned char);
; void GuiDisBattery(unsigned char,unsigned char,unsigned char);
; void GuiDisUsb(unsigned char,unsigned char);
; void GuiDisAcin(unsigned char,unsigned char);
; void GuiDisTemp(unsigned char,unsigned char,signed char);
; void GuiDisShortIcon(unsigned char,unsigned char,unsigned char);
; void GuiDisMainMenu(void);
; void GuiDisMenuIcon(unsigned char,unsigned char,unsigned char);
;
; /*****************************************
; * FUNCTION NAME: GuiDrawLine
; * DESCRIPTION: Draw A Line From Between
; * Any 2-Point
; * (x1,y1) as start point
; * (x2,y2) as end point
; * Based On "Breshenham Line"
; /*****************************************/
; void GuiDrawLine(unsigned char x1, unsigned char y1, unsigned char x2, unsigned char y2, unsigned char color)
; {
.dbline 55
; unsigned char temp;
; int p; /* p-取值判断因子 */
; unsigned char x; /* x-坐标 */
; unsigned char y; /* y-坐标 */
; int dx; /* x方向差值 */
; int dy; /* y方向差值 */
; char signx; /* x方向标识 */
; char signy; /* Y方向标识 */
; if(x1>123 | y1>63 | x2>123 | y2>63)
ldi R24,123
ldd R0,y+16
cp R24,R0
brsh L4
X0:
ldi R24,1
ldi R25,0
movw R14,R24
xjmp L5
L4:
clr R14
clr R15
L5:
ldi R24,63
cp R24,R10
brsh L6
X1:
ldi R24,1
ldi R25,0
movw R12,R24
xjmp L7
L6:
clr R12
clr R13
L7:
ldi R24,123
ldd R0,y+20
cp R24,R0
brsh L8
X2:
ldi R22,1
ldi R23,0
xjmp L9
L8:
clr R22
clr R23
L9:
ldi R24,63
ldd R0,y+22
cp R24,R0
brsh L10
X3:
ldi R20,1
ldi R21,0
xjmp L11
L10:
clr R20
clr R21
L11:
movw R2,R14
or R2,R12
or R3,R13
or R2,R22
or R3,R23
or R2,R20
or R3,R21
tst R2
brne X4
tst R3
breq L2
X4:
.dbline 56
; return;
xjmp L1
L2:
.dbline 57
; x = x1;
ldd R0,y+16
std y+2,R0
.dbline 58
; y = y1;
std y+3,R10
.dbline 60
; /* 1.计算X方向的参数 */
; if(x2 > x1)
ldd R2,y+16
clr R3
ldd R4,y+20
clr R5
cp R2,R4
cpc R3,R5
brge L12
X5:
.dbline 61
; {
.dbline 62
; dx = x2 - x1;
clr R3
clr R5
sub R4,R2
sbc R5,R3
std y+5,R5
std y+4,R4
.dbline 63
; signx = 1;
clr R12
inc R12
.dbline 64
; }
xjmp L13
L12:
.dbline 65
; else if(x2 < x1)
ldd R0,y+20
ldd R16,y+16
cp R0,R16
brsh L14
X6:
.dbline 66
; {
.dbline 67
; dx = x1 - x2;
mov R2,R0
clr R3
mov R4,R16
clr R5
sub R4,R2
sbc R5,R3
std y+5,R5
std y+4,R4
.dbline 68
; signx = -1;
ldi R24,255
mov R12,R24
.dbline 69
; }
xjmp L15
L14:
.dbline 71
; else
; {
.dbline 72
; dx = 0;
clr R0
clr R1
std y+5,R1
std y+4,R0
.dbline 73
; signx = 0;
clr R12
.dbline 74
; }
L15:
L13:
.dbline 76
; /* 2.计算Y方向的参数 */
; if(y2 > y1)
mov R2,R10
clr R3
ldd R4,y+22
clr R5
cp R2,R4
cpc R3,R5
brge L16
X7:
.dbline 77
; {
.dbline 78
; dy = y2 - y1;
clr R3
mov R22,R4
clr R23
sub R22,R2
sbc R23,R3
.dbline 79
; signy = 1;
clr R14
inc R14
.dbline 80
; }
xjmp L17
L16:
.dbline 81
; else if(y2 < y1)
ldd R0,y+22
cp R0,R10
brsh L18
X8:
.dbline 82
; {
.dbline 83
; dy = y1 - y2;
mov R2,R0
clr R3
mov R22,R10
clr R23
sub R22,R2
sbc R23,R3
.dbline 84
; signy = -1;
ldi R24,255
mov R14,R24
.dbline 85
; }
xjmp L19
L18:
.dbline 87
; else
; {
.dbline 88
; dy = 0;
clr R22
clr R23
.dbline 89
; signy = 0;
clr R14
.dbline 90
; }
L19:
L17:
.dbline 92
; /* 3.计算首个判断因子 */
; p = 2*dy -dx;
movw R10,R22
lsl R10
rol R11
ldd R0,y+4
ldd R1,y+5
sub R10,R0
sbc R11,R1
.dbline 94
; /* 4a.以X方向增长画图 */
; if(dx >= dy)
cp R0,R22
cpc R1,R23
brlt L20
X9:
.dbline 95
; {
.dbline 96
; for(temp=0; temp<dx; temp++)
clr R20
xjmp L25
L22:
.dbline 97
; {
.dbline 98
; LcdDisplayDot(x,y,color); /* 画点 */
ldd R2,y+24
clr R3
std y+1,R3
std y+0,R2
ldd R18,y+3
clr R19
ldd R16,y+2
clr R17
xcall _LcdDisplayDot
.dbline 99
; if(p >= 0) /* 根据P来判断画哪一点 */
movw R24,R10
cpi R24,0
ldi R30,0
cpc R25,R30
brlt L26
X10:
.dbline 100
; {
.dbline 101
; x = x + signx;
ldd R0,y+2
add R0,R12
std y+2,R0
.dbline 102
; y = y + signy;
ldd R0,y+3
add R0,R14
std y+3,R0
.dbline 103
; p = p + 2*(dy - dx); /* dy,dx需要定义定义成有符号的,才能得到正确的值 */
movw R2,R22
ldd R0,y+4
ldd R1,y+5
sub R2,R0
sbc R3,R1
lsl R2
rol R3
add R10,R2
adc R11,R3
.dbline 104
; }
xjmp L27
L26:
.dbline 106
; else
; {
.dbline 107
; x = x + signx;
ldd R0,y+2
add R0,R12
std y+2,R0
.dbline 108
; y = y;
.dbline 109
; p = p + 2*dy;
movw R2,R22
lsl R2
rol R3
add R10,R2
adc R11,R3
.dbline 110
; }
L27:
.dbline 111
; }
L23:
.dbline 96
inc R20
L25:
.dbline 96
mov R2,R20
clr R3
ldd R0,y+4
ldd R1,y+5
cp R2,R0
cpc R3,R1
brlt L22
X11:
.dbline 112
; }
xjmp L21
L20:
.dbline 114
; else
; {
.dbline 115
; for(temp=0; temp<dy; temp++)
clr R20
xjmp L31
L28:
.dbline 116
; {
.dbline 117
; LcdDisplayDot(x,y,color); /* 画点 */
ldd R2,y+24
clr R3
std y+1,R3
std y+0,R2
ldd R18,y+3
clr R19
ldd R16,y+2
clr R17
xcall _LcdDisplayDot
.dbline 118
; if(p >= 0) /* 根据P来判断画哪一点 */
movw R24,R10
cpi R24,0
ldi R30,0
cpc R25,R30
brlt L32
X12:
.dbline 119
; {
.dbline 120
; y = y + signy;
ldd R0,y+3
add R0,R14
std y+3,R0
.dbline 121
; x = x + signx;
ldd R0,y+2
add R0,R12
std y+2,R0
.dbline 122
; p = p + 2*(dx - dy);
ldd R2,y+4
ldd R3,y+5
sub R2,R22
sbc R3,R23
lsl R2
rol R3
add R10,R2
adc R11,R3
.dbline 123
; }
xjmp L33
L32:
.dbline 125
; else
; {
.dbline 126
; y = y + signy;
ldd R0,y+3
add R0,R14
std y+3,R0
.dbline 127
; x = x;
.dbline 128
; p = p + 2*dx;
ldd R2,y+4
ldd R3,y+5
lsl R2
rol R3
add R10,R2
adc R11,R3
.dbline 129
; }
L33:
.dbline 130
; }
L29:
.dbline 115
inc R20
L31:
.dbline 115
mov R2,R20
clr R3
cp R2,R22
cpc R3,R23
brlt L28
X13:
.dbline 131
; }
L21:
.dbline 132
; LcdDisplayDot(x2,y2,color); /* 画最后一个点 */
ldd R2,y+24
clr R3
std y+1,R3
std y+0,R2
ldd R18,y+22
clr R19
ldd R16,y+20
clr R17
xcall _LcdDisplayDot
.dbline -2
L1:
.dbline 0 ; func end
adiw R28,6
xcall pop_xgsetF0FC
adiw R28,4
ret
.dbsym r signy 14 c
.dbsym r signx 12 c
.dbsym r dy 22 I
.dbsym l dx 4 I
.dbsym r temp 20 c
.dbsym l y 3 c
.dbsym l x 2 c
.dbsym r p 10 I
.dbsym l color 24 c
.dbsym l y2 22 c
.dbsym l x2 20 c
.dbsym r y1 10 c
.dbsym l x1 16 c
.dbend
.dbfunc e GuiDrawCircle _GuiDrawCircle fV
; draw_x7 -> y+28
; draw_x6 -> y+26
; draw_y3 -> y+24
; draw_y1 -> y+22
; draw_x5 -> y+20
; draw_x4 -> y+18
; draw_y2 -> y+16
; draw_y0 -> y+14
; di -> R14,R15
; yy -> R22,R23
; draw_y7 -> R12,R13
; draw_y6 -> y+12
; draw_x3 -> y+10
; draw_x1 -> y+8
; draw_y5 -> R10,R11
; draw_y4 -> y+6
; draw_x2 -> y+4
; draw_x0 -> y+2
; xx -> R20,R21
; color -> y+42
; r -> R22
; y0 -> R10
; x0 -> R12
.even
_GuiDrawCircle::
xcall push_xgsetF0FC
mov R10,R18
mov R12,R16
sbiw R28,30
ldd R22,y+40
.dbline -1
.dbline 141
; }
;
; /*****************************************
; * FUNCTION NAME: GuiDrawCircle
; * DESCRIPTION: Draw Circle
; * Based On "Breshenham Circle"
; /*****************************************/
; void GuiDrawCircle(unsigned char x0, unsigned char y0, unsigned char r, unsigned char color)
; {
.dbline 153
; int draw_x0, draw_y0; /* 绘制图点坐标变量 */
; int draw_x1, draw_y1;
; int draw_x2, draw_y2;
; int draw_x3, draw_y3;
; int draw_x4, draw_y4;
; int draw_x5, draw_y5;
; int draw_x6, draw_y6;
; int draw_x7, draw_y7;
; int xx, yy; /* 画圆控制变量 */
; int di; /* 决策变量 */
; /* 参数过滤 */
; if(r==0)
tst R22
brne L35
X14:
.dbline 154
; return;
xjmp L34
L35:
.dbline 156
; /* 计算出8个特殊点(0、45、90、135、180、225、270度),进行显示 */
; draw_x0 = draw_x1 = x0;
mov R2,R12
clr R3
std y+9,R3
std y+8,R2
clr R3
std y+3,R3
std y+2,R2
.dbline 157
; draw_y0 = draw_y1 = y0 + r;
mov R2,R22
clr R3
mov R4,R10
clr R5
add R4,R2
adc R5,R3
std y+23,R5
std y+22,R4
std y+15,R5
std y+14,R4
.dbline 158
; LcdDisplayDot(draw_x0, draw_y0, color); // 90度
ldd R2,y+42
clr R3
std y+1,R3
std y+0,R2
movw R18,R4
ldd R16,y+2
ldd R17,y+3
xcall _LcdDisplayDot
.dbline 159
; draw_x2 = draw_x3 = x0;
mov R2,R12
clr R3
std y+11,R3
std y+10,R2
clr R3
std y+5,R3
std y+4,R2
.dbline 160
; draw_y2 = draw_y3 = y0 - r;
mov R2,R22
clr R3
mov R4,R10
clr R5
sub R4,R2
sbc R5,R3
std y+25,R5
std y+24,R4
std y+17,R5
std y+16,R4
.dbline 161
; LcdDisplayDot(draw_x2, draw_y2, color); // 270度
ldd R2,y+42
clr R3
std y+1,R3
std y+0,R2
movw R18,R4
ldd R16,y+4
ldd R17,y+5
xcall _LcdDisplayDot
.dbline 162
; draw_x4 = draw_x6 = x0 + r;
mov R2,R22
clr R3
mov R14,R12
clr R15
add R14,R2
adc R15,R3
std y+27,R15
std y+26,R14
std y+19,R15
std y+18,R14
.dbline 163
; draw_y4 = draw_y6 = y0;
mov R2,R10
clr R3
std y+13,R3
std y+12,R2
clr R3
std y+7,R3
std y+6,R2
.dbline 164
; LcdDisplayDot(draw_x4, draw_y4, color); // 0度
ldd R2,y+42
clr R3
std y+1,R3
std y+0,R2
ldd R18,y+6
ldd R19,y+7
ldd R16,y+18
ldd R17,y+19
xcall _LcdDisplayDot
.dbline 165
; draw_x5 = draw_x7 = x0 - r;
mov R2,R22
clr R3
mov R4,R12
clr R5
sub R4,R2
sbc R5,R3
movw R12,R4
std y+29,R13
std y+28,R12
std y+21,R13
std y+20,R12
.dbline 166
; draw_y5 = draw_y7 = y0;
mov R12,R10
clr R13
clr R11
.dbline 167
; LcdDisplayDot(draw_x5, draw_y5, color); // 180度
ldd R2,y+42
clr R3
std y+1,R3
std y+0,R2
movw R18,R10
movw R16,R4
xcall _LcdDisplayDot
.dbline 168
; if(r==1)
cpi R22,1
brne L37
X15:
.dbline 169
; return; // 若半径为1,则已圆画完
xjmp L34
L37:
.dbline 172
;
; /* 使用Bresenham法进行画圆 */
; di = 3 - 2*r; // 初始化决策变量
mov R2,R22
clr R3
lsl R2
rol R3
ldi R24,3
ldi R25,0
movw R14,R24
sub R14,R2
sbc R15,R3
.dbline 173
; xx = 0;
clr R20
clr R21
.dbline 174
; yy = r;
clr R23
xjmp L40
L39:
.dbline 176
; while(xx<yy)
; {
.dbline 177
; if(di<0)
movw R24,R14
cpi R24,0
ldi R30,0
cpc R25,R30
brge L42
X16:
.dbline 178
; {
.dbline 179
; di += 4*xx + 6;
movw R24,R20
lsl R24
rol R25
lsl R24
rol R25
adiw R24,6
add R14,R24
adc R15,R25
.dbline 180
; }
xjmp L43
L42:
.dbline 182
; else
; {
.dbline 183
; di += 4*(xx - yy) + 10;
movw R24,R20
sub R24,R22
sbc R25,R23
lsl R24
rol R25
lsl R24
rol R25
adiw R24,10
add R14,R24
adc R15,R25
.dbline 185
;
; yy--;
subi R22,1
sbci R23,0
.dbline 186
; draw_y0--;
ldd R24,y+14
ldd R25,y+15
sbiw R24,1
std y+15,R25
std y+14,R24
.dbline 187
; draw_y1--;
ldd R24,y+22
ldd R25,y+23
sbiw R24,1
std y+23,R25
std y+22,R24
.dbline 188
; draw_y2++;
ldd R24,y+16
ldd R25,y+17
adiw R24,1
std y+17,R25
std y+16,R24
.dbline 189
; draw_y3++;
ldd R24,y+24
ldd R25,y+25
adiw R24,1
std y+25,R25
std y+24,R24
.dbline 190
; draw_x4--;
ldd R24,y+18
ldd R25,y+19
sbiw R24,1
std y+19,R25
std y+18,R24
.dbline 191
; draw_x5++;
ldd R24,y+20
ldd R25,y+21
adiw R24,1
std y+21,R25
std y+20,R24
.dbline 192
; draw_x6--;
ldd R24,y+26
ldd R25,y+27
sbiw R24,1
std y+27,R25
std y+26,R24
.dbline 193
; draw_x7++;
ldd R24,y+28
ldd R25,y+29
adiw R24,1
std y+29,R25
std y+28,R24
.dbline 194
; }
L43:
.dbline 196
;
; xx++;
subi R20,255 ; offset = 1
sbci R21,255
.dbline 197
; draw_x0++;
ldd R24,y+2
ldd R25,y+3
adiw R24,1
std y+3,R25
std y+2,R24
.dbline 198
; draw_x1--;
ldd R24,y+8
ldd R25,y+9
sbiw R24,1
std y+9,R25
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -