📄 gui.s
字号:
; HZ_X = x0;
ldd R22,y+11
; for(i=Chinese_XSIZE; i<2*Chinese_XSIZE; i++)
mov R10,R2
xjmp L134
L131:
ldi R16,26
ldi R17,0
movw R18,R12
xcall empy16s
movw R2,R16
ldi R24,<_GB_12+2
ldi R25,>_GB_12+2
add R2,R24
adc R3,R25
mov R30,R10
clr R31
add R30,R2
adc R31,R3
lpm R20,Z
ori R20,32
mov R24,R14
subi R24,248 ; addi 8
std y+0,R24
mov R18,R22
mov R16,R20
xcall _LCD_Display_Locate
inc R22
L132:
inc R10
L134:
lds R2,_Chinese_XSIZE
ldi R24,2
mul R24,R2
cp R10,R0
brlo L131
; {
; ImgData = GB_12[CodeID].Msk[i]|0x20;
; LCD_Display_Locate(ImgData, HZ_X, y0 + 8);
; HZ_X++;
; }
; break;
; //-------------------------------------------------------------------------
; default : break;
L101:
L86:
adiw R28,1
xcall pop_gset5
adiw R28,2
.dbline 0 ; func end
ret
; i -> R20
.even
_GUI_DispCEOL::
xcall push_gset1
sbiw R28,1
; }
; }
;
;
; void GUI_DispCEOL(void)
; {
; INT8U i;
; for(i = PosX; i <= LCD_XSIZE-8; i += 8)
lds R20,_PosX
xjmp L140
L137:
lds R2,_PosY
std y+0,R2
mov R18,R20
ldi R16,32
xcall _GUI_DispCharAt
L138:
subi R20,248 ; addi 8
L140:
ldi R24,89
cp R24,R20
brsh L137
L136:
adiw R28,1
xcall pop_gset1
.dbline 0 ; func end
ret
; temp -> R22,R23
; i -> R10
; y0 -> R12
; x0 -> R14
; s -> y+11
.even
_GUI_DispStringAt::
xcall push_arg4
xcall push_gset5
mov R14,R18
sbiw R28,1
ldd R12,y+15
; {
; GUI_DispCharAt(' ', i, PosY);
; }
; }
;
; /*
; *****************************************************************************
; * GUI_DispStringAt - 指定位置显示一个字符串
; * 支持中英混合 当中英混合时英文字体强制为8x16 如果单单英文 按照设定字体
; * @Param x0:X轴坐标
; * @Param y0:Y轴坐标
; * @Param s:字符串
; *****************************************************************************
; */
; //void GUI_DispStringAt(INT8U _CONST_ *s,INT8U x0,INT8U y0)
; void GUI_DispStringAt(INT8U *s,INT8U x0,INT8U y0)
; {
; INT8U i;
; INT16U temp;
; if (NoXY == FALSE)//没有提供坐标,则使用系统坐标
lds R2,_NoXY
tst R2
brne L142
; {
; x0 = PosX;
lds R14,_PosX
; y0 = PosY;
lds R12,_PosY
; }
L142:
; if(x0>LCD_XSIZE)
ldi R24,97
cp R24,R14
brsh L144
; x0=x0%LCD_XSIZE;
ldi R17,97
mov R16,R14
xcall mod8u
mov R14,R16
L144:
; if(y0>LCD_YSIZE)
ldi R24,68
cp R24,R12
brsh L146
; y0=y0%LCD_YSIZE;
ldi R17,68
mov R16,R12
xcall mod8u
mov R12,R16
L146:
;
; i = 0;
clr R10
xjmp L149
L148:
; while(s[i]!='\0')
; {
; if (s[i] < 0x80)
mov R30,R10
clr R31
ldd R0,y+11
ldd R1,y+12
add R30,R0
adc R31,R1
ldd R24,z+0
cpi R24,128
brlo X10
xjmp L151
X10:
; {//是ASCII
; if(s[i] == '\n')
mov R30,R10
clr R31
add R30,R0
adc R31,R1
ldd R24,z+0
cpi R24,10
brne L153
; {
; x0 = 0;
clr R14
; y0 += Char_YSIZE+2;
lds R24,_Char_YSIZE
subi R24,254 ; addi 2
add R12,R24
; }
xjmp L152
L153:
; else
; {
; if ( x0 > LCD_XSIZE-Char_XSIZE )
lds R2,_Char_XSIZE
ldi R24,97
sub R24,R2
cp R24,R14
brsh L155
; {//换行
; x0 = 0;
clr R14
; y0 += Char_YSIZE+2;
lds R24,_Char_YSIZE
subi R24,254 ; addi 2
add R12,R24
; }
L155:
; switch (GUITextMode)
lds R20,_GUITextMode
clr R21
cpi R20,0
cpc R20,R21
breq L160
X8:
cpi R20,1
ldi R30,0
cpc R21,R30
breq L161
cpi R20,2
ldi R30,0
cpc R21,R30
breq L162
xjmp L158
X9:
; {
L160:
; case GUI_TEXTMODE_NORMAL :
; GUI_Display_ASCII(s[i], x0, y0);
std y+0,R12
mov R18,R14
mov R30,R10
clr R31
ldd R0,y+11
ldd R1,y+12
add R30,R0
adc R31,R1
ldd R16,z+0
xcall _GUI_Display_ASCII
; break;
xjmp L158
L161:
; case GUI_TEXTMODE_REVERSE :
; GUI_Display_InvASCII(s[i], x0, y0);
std y+0,R12
mov R18,R14
mov R30,R10
clr R31
ldd R0,y+11
ldd R1,y+12
add R30,R0
adc R31,R1
ldd R16,z+0
xcall _GUI_Display_InvASCII
; break;
xjmp L158
L162:
; case GUI_TEXTMODE_UNDERLINE :
; GUI_Display_ASCII_UnderLine(s[i], x0, y0);
std y+0,R12
mov R18,R14
mov R30,R10
clr R31
ldd R0,y+11
ldd R1,y+12
add R30,R0
adc R31,R1
ldd R16,z+0
xcall _GUI_Display_ASCII_UnderLine
; break;
; default :
; break;
L158:
; }
; x0 += Char_XSIZE;
lds R2,_Char_XSIZE
add R14,R2
; }
; }
xjmp L152
L151:
; else
; {//是中文
; Char_YSIZE=En_6x12_YSIZE;//如果有中文,英文强制转换 6*12
ldi R24,12
sts _Char_YSIZE,R24
; if (x0 > LCD_XSIZE-Chinese_XSIZE)
lds R2,_Chinese_XSIZE
ldi R24,97
sub R24,R2
cp R24,R14
brsh L163
; {
; x0 = 0;
clr R14
; y0 += Chinese_YSIZE+2;
lds R24,_Chinese_YSIZE
subi R24,254 ; addi 2
add R12,R24
; }
L163:
; temp=(INT16U)(s[i])*256+s[i+1];
mov R2,R10
clr R3
ldd R0,y+11
ldd R1,y+12
add R2,R0
adc R3,R1
movw R30,R2
ldd R18,z+0
clr R19
ldi R16,256
ldi R17,1
xcall empy16s
movw R22,R16
movw R30,R2
ldd R2,z+1
clr R3
add R22,R2
adc R23,R3
; GUI_Display_Chinese(temp,x0,y0);//中文
std y+0,R12
mov R18,R14
movw R16,R22
xcall _GUI_Display_Chinese
; i++;
inc R10
; x0 += Chinese_XSIZE;
lds R2,_Chinese_XSIZE
add R14,R2
; }
L152:
inc R10
L149:
mov R30,R10
clr R31
ldd R0,y+11
ldd R1,y+12
add R30,R0
adc R31,R1
ldd R2,z+0
tst R2
breq X11
xjmp L148
X11:
; i++;
; }
; if(NoXY == FALSE)
lds R2,_NoXY
tst R2
brne L165
; {
; PosX = x0;
sts _PosX,R14
; PosY = y0;
sts _PosY,R12
; }
L165:
L141:
adiw R28,1
xcall pop_gset5
adiw R28,4
.dbline 0 ; func end
ret
; s -> R20,R21
.even
_GUI_DispString::
xcall push_gset1
movw R20,R16
sbiw R28,1
; }
;
; /*
; *****************************************************************************
; * GUI_DispString - 在当前系统坐标下显示字符串
; * 除了坐标不能指定外 功能跟GUI_DispStringAt一致
; * @Param s:字符串
; *****************************************************************************
; */
; void GUI_DispString(INT8U *s)
; {
; NoXY = FALSE;
clr R2
sts _NoXY,R2
; GUI_DispStringAt(s,PosX,PosY);
lds R2,_PosY
std y+0,R2
lds R18,_PosX
movw R16,R20
xcall _GUI_DispStringAt
; NoXY = TRUE;
ldi R24,1
sts _NoXY,R24
L167:
adiw R28,1
xcall pop_gset1
.dbline 0 ; func end
ret
; y -> R22
; x -> R20
.even
_GUI_CursorOn::
xcall push_gset2
mov R22,R18
mov R20,R16
sbiw R28,1
; }
;
;
; #if GUI_DispStringLen_EN
; void GUI_DispStringLen(INT8U *s, INT16U Len)
; {
; INT8U i;
; INT16U temp;
;
; i = 0;
; while(s[i]!='\0')
; {
; if (i >= Len )
; {
; return;
; }
; if (s[i] < 0x80)
; {//是ASCII
; if(s[i] == '\n')
; {
; PosX = 0;
; PosY +=Char_YSIZE+2;
; }
; else
; {
; if( PosX >= LCD_XSIZE )
; {//换行
; PosX = 0;
; PosY +=Char_YSIZE+2;
; }
; switch (GUITextMode)
; {
; case GUI_TEXTMODE_NORMAL :
; GUI_Display_ASCII(s[i], PosX, PosY);
; break;
; case GUI_TEXTMODE_REVERSE :
; GUI_Display_InvASCII(s[i], PosX, PosY);
; break;
; case GUI_TEXTMODE_UNDERLINE :
; GUI_Display_ASCII_UnderLine(s[i], PosX, PosY);
; break;
; default :
; break;
; }
; PosX +=Char_XSIZE;
; }
; }
; else
; {//是中文
; Char_YSIZE=En_6x12_YSIZE;//如果有中文,英文强制转换 8*16
; if (PosX > LCD_XSIZE-16)
; {
; PosX = 0;
; PosY +=Chinese_YSIZE+2;
; //return;
; }
; temp=(INT16U)(s[i])*256+s[i+1];
; GUI_Display_Chinese(temp,PosX,PosY);//中文
; i++;
; PosX +=Chinese_XSIZE;
; }
; i++;
; }
; }
; #endif
;
;
; void GUI_CursorOn(INT8U x, INT8U y)
; {
; LCD_Display_Locate(0xFF,x,y);
std y+0,R22
mov R18,R20
ldi R16,255
xcall _LCD_Display_Locate
; LCD_Display_Locate(0xFF,x,y+1);
mov R24,R22
subi R24,255 ; addi 1
std y+0,R24
mov R18,R20
ldi R16,255
xcall _LCD_Display_Locate
L168:
adiw R28,1
xcall pop_gset2
.dbline 0 ; func end
ret
; y -> R22
; x -> R20
.even
_GUI_CursorOFF::
xcall push_gset2
mov R22,R18
mov R20,R16
sbiw R28,1
; }
;
; void GUI_CursorOFF(INT8U x, INT8U y)
; {
; LCD_Display_Locate(0x00,x,y);
std y+0,R22
mov R18,R20
clr R16
xcall _LCD_Display_Locate
; LCD_Display_Locate(0x00,x,y+1);
mov R24,R22
subi R24,255 ; addi 1
std y+0,R24
mov R18,R20
clr R16
xcall _LCD_Display_Locate
L169:
adiw R28,1
xcall pop_gset2
.dbline 0 ; func end
ret
; XLen -> R12
; CNCount -> y+5
; ENCount -> R14
; Y -> R14
; X -> R12
; i -> R22
; Mode -> y+24
; x1 -> R20
; y0 -> R10
; x0 -> y+18
; s -> y+16
.even
_GUI_DispStringAtBar::
xcall push_arg4
xcall push_gset5
sbiw R28,6
ldd R10,y+20
ldd R20,y+22
; }
;
; #if GUI_MATH_EN
; /*
; *****************************************************************************
; * GUI_DispDecAt - 显示十进制数值
; * DESCRIPTION: -
; * 处理长度最多5个数字(因为U16--->65536)
; * @Param v:显示的数据
; * @Param x:X轴坐标
; * @Param y:Y轴坐标 XY 均是起点位置坐标 也就是数值最高位的坐标
; * @Param Len:指定的显示长度1--5内
; * @Return :
; *
; *****************************************************************************
; */
; void GUI_DispDecAt(INT16U v, INT16U x, INT16U y, INT8U Len)
; {
; INT8U i;
; INT8U CharBuf[5];
; INT8U HighByte;
;
; HighByte = 0;
; for(i = 0; i < 5; i++)
; {
; CharBuf[i] = (INT8U)(v%10);
; v = v/10;
; if(CharBuf[i])
; {
; HighByte = i;
; }
; }
; //第0位无论如何也显示
; i = 0;
; GUI_DispCharAt(CharBuf[i]+'0',x+((Len-1)-i)*Char_XSIZE,y);
; for(i = 1; i < Len; i++)
; {
; if(CharBuf[i])
; {
; GUI_DispCharAt(CharBuf[i]+'0',x+((Len-1)-i)*Char_XSIZE,y);
; }
; else if(i > HighByte)
; {
; GUI_DispCharAt(' ',x+((Len-1)-i)*Char_XSIZE,y);
; }
; }
;
; }
;
; /*
; *****************************************************************************
; * GUI_DispHexAt - 显示一个数据的十六进制值
; * DESCRIPTION: -
; * 最大长度4个
; * @Param v:数据
; * @Param x:X轴坐标
; * @Param y:Y轴坐标 XY均是起点坐标 也就是数据最高字节坐标
; * @Param Len:长度1--4
; * @Return :
; *
; *****************************************************************************
; */
; void GUI_DispHexAt(INT32U v, INT8U x, INT8U y, INT8U Len)
; {
; INT8U i;
; INT8U HexData;
; if(Len > 8)
; {//限制范围
; Len = 8;
; }
; for(i = 0; i < Len; i++)
; {
; HexData = v&0x0F;
; v = v >>4;
; if(HexData < 0x0A)
; {
; GUI_DispCharAt(HexData+'0',x+Char_XSIZE*(Len-1-i),y);
; }
; else
; {
; GUI_DispCharAt(HexData-0x0A+'A',x+Char_XSIZE*(Len-1-i),y);
; }
; }
; }
;
; // ---- 显示不带符号的整数 (数字 起始位置XY,显示长度) -----------------------------
; void GUI_Display_Number(INT16U Number, INT8U X, INT8U Y, INT8U Lenth)
; {
; INT8U DispNum;
;
; X = ( X + Lenth *En_6x12_XSIZE - En_6x12_XSIZE );
; for(; Lenth>0; Lenth--)
; {
; DispNum =(INT8U)(Number%10) + '0';
; GUI_Display_ASCII(DispNum, X, Y);
; X -= En_6x12_XSIZE;
; Number = Number / 10;
; }
; }
;
; // ---- 显示带符号的整数 (数字 起始位置XY,显示长度) ---------------------------------
; void GUI_Display_SignedNumber(int Number,INT8U X,INT16U Y,INT8U Lenth)
; {
; if(Number < 0)
; {
; GUI_Display_ASCII('-', X, Y);
; GUI_Display_Number(-Number, X+En_6x12_XSIZE, Y, Lenth);
; }
; else
; {
; GUI_Display_ASCII(' ', X, Y);
; GUI_Display_Number(Number, X+En_6x12_XSIZE, Y, Lenth);
; }
; }
;
; // ---- 显示不带符号的小数 (数字 起始位置XY,整数位数,小数位数) ------------------------------
; void GUI_Display_Decimal(INT32U Number, char X, INT16U Y, INT8U INT, INT8U DEC)
; {
; INT8U DispNum, Lenth;
; //Y = Y +(( X + INT * 8 + DEC * 8 ) / 84) * 2;
; X = ( X + ( INT + DEC ) *En_6x12_XSIZE);
; // 显示小数部分
; for(Lenth=DEC; Lenth>0; Lenth--)
; {
; DispNum = Number%10 + 0x30;
; GUI_Display_ASCII(DispNum, X, Y);
; //if (X < 8) {Y -= 2; X += 84;}
; X -= En_6x12_XSIZE;
; Number = Number / 10;
; }
; // 显示小数点
; GUI_Display_ASCII('.', X, Y);
; //if (X < 8) {Y -= 2; X += 84;}
; X -= En_6x12_XSIZE;
; // 显示整数部分
; for(Lenth=INT; Lenth>0; Lenth--)
; {
; DispNum = Number%10 + 0x30;
; GUI_Display_ASCII(DispNum, X, Y);
; //if (X < 8) {Y -= 2; X += 84;}
; X -= En_6x12_XSIZE;
; Number = Number / 10;
; }
; }
;
; // ---- 显示带符号的小数 (数字 起始位置XY,整数位数,小数位数) ------------------------------
; void GUI_Display_SignedDecimal(long int Number, char X, INT16U Y, INT8U INT, INT8U DEC)
; {
; if(Number < 0)
; {
; GUI_Display_ASCII('-', X, Y);
; GUI_Display_Decimal(-Number, X+En_6x12_XSIZE, Y, INT, DEC);
; }
; else
; {
; GUI_Display_ASCII(' ',X,Y);
; GUI_Display_Decimal(Number, X+En_6x12_XSIZE, Y, INT, DEC);
; }
; }
;
; #endif
;
; /*
; *****************************************************************************
; * GUI_DispStringAtBar - 显示一个字符串在一个BAR中
; * 可以设定对齐方式
; * @Param s:字符串
; * @Param x0:BAR起始X轴坐标
; * @Param x1:BAR结束点的X轴坐标
; * @Param y0:BAR的Y轴坐标
; * @Param Mode:对齐方式 居中于BAR 左对齐BAR 右对齐BAR
; *****************************************************************************
; */
; #if GUI_DispStringAtBar_EN
; //void GUI_DispStringAtBar(const INT8U *s,INT8U x0, INT8U y0, INT8U x1,INT8U Mode)
; void GUI_DispStringAtBar(INT8U *s,INT8U x0, INT8U y0, INT8U x1,INT8U Mode)
; {
; INT8U ENCount;//英文统计
; INT8U CNCount;//中文统计
; INT8U XLen;
; INT8U X;
; INT8U Y;
; INT8U i;
;
; CNCount = 0;
clr R0
std y+5,R0
; ENCount = 0;
clr R14
; XLen = 0;
clr R12
; i = 0;
clr R22
xjmp L172
L171:
;
; while(s[i]!='\0')
; {//统计中英文个数
; if (s[i] > 0x80) //是中文
mov R30,R22
clr R31
ldd R0,y+16
ldd R1,y+17
add R30,R0
adc R31,R1
ldd R2,z+0
ldi R24,128
cp R24,R2
brsh L174
; {
; CNCount ++;
ldd R0,y+5
inc R0
std y+5,R0
; i++;
inc R22
; }
xjmp L175
L174:
; else
; {
; ENCount++;
inc R14
; }
L175:
inc R22
L172:
mov R30,R22
clr R31
ldd R0,y+16
ldd R1,y+17
add R30,R0
adc R31,R1
ldd R2,z+0
tst R2
brne L171
; i++;
; }
; GUI_SetEnFont(En_6x12);
clr R16
xcall _GUI_SetEnFont
;
; XLen = ENCount*6 + CNCou
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -