⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gui.s

📁 Atmega64单片机程序(完整工程)
💻 S
📖 第 1 页 / 共 5 页
字号:
;             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 + -