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

📄 windows.lst

📁 一个基于MEGA16的GUI
💻 LST
📖 第 1 页 / 共 2 页
字号:
   1               		.file	"windows.c"
   2               		.arch atmega16
   3               	__SREG__ = 0x3f
   4               	__SP_H__ = 0x3e
   5               	__SP_L__ = 0x3d
   6               	__tmp_reg__ = 0
   7               	__zero_reg__ = 1
   8               		.global __do_copy_data
   9               		.global __do_clear_bss
  11               		.text
  12               	.Ltext0:
 126               	.global	GUI_WindowsDraw
 128               	GUI_WindowsDraw:
   1:windows.c     **** /****************************************************************************************
   2:windows.c     **** * 文件名:WINDOW.C
   3:windows.c     **** * 功能:窗口管理。将进行各种窗口的给制及窗口内部控制。
   4:windows.c     **** * 备注:
   5:windows.c     **** ****************************************************************************************/
   6:windows.c     **** #include "config.h"
   7:windows.c     **** 
   8:windows.c     **** #if  GUI_WINDOW_EN==1
   9:windows.c     **** /****************************************************************************
  10:windows.c     **** * 名称:GUI_WindowsDraw()
  11:windows.c     **** * 功能:显示窗口。根据提供的窗口参数进行画窗口。
  12:windows.c     **** * 入口参数:win		窗口句柄
  13:windows.c     **** * 出口参数:返回0表示操作失败,返回1表示操作成功
  14:windows.c     **** ****************************************************************************/
  15:windows.c     **** uint8  GUI_WindowsDraw(WINDOWS *win)
  16:windows.c     **** {  uint8  *str;
 130               	.LM1:
 131               	/* prologue: frame size=0 */
 132 0000 DF92      		push r13
 133 0002 EF92      		push r14
 134 0004 FF92      		push r15
 135 0006 0F93      		push r16
 136 0008 1F93      		push r17
 137 000a CF93      		push r28
 138 000c DF93      		push r29
 139               	/* prologue end (size=7) */
 140 000e EC01      		movw r28,r24
  17:windows.c     ****    int8  bak, bak1, bak2;
  18:windows.c     ****    
  19:windows.c     ****    /* 参数过滤,若窗口起出范围,则返回0 */
  20:windows.c     ****    if( ( (win->with)<20 ) || ( (win->hight)<20 ) ) return(0);		// 宽度、高度检查,限制最小窗口
 142               	.LM2:
 143 0010 4A81      		ldd r20,Y+2
 144 0012 4431      		cpi r20,lo8(20)
 145 0014 08F4      		brsh .+2
 146 0016 92C0      		rjmp .L17
 148               	.LM3:
 149 0018 2B81      		ldd r18,Y+3
 150 001a 2431      		cpi r18,lo8(20)
 151 001c 08F4      		brsh .+2
 152 001e 8EC0      		rjmp .L17
  21:windows.c     ****    if( (win->x + win->with ) > GUI_LCM_XMAX ) return(0);			// 窗口宽度是否溢出
 154               	.LM4:
 155 0020 3881      		ld r19,Y
 156 0022 632F      		mov r22,r19
 157 0024 640F      		add r22,r20
 158 0026 712D      		mov r23,__zero_reg__
 159 0028 711D      		adc r23,__zero_reg__
 160 002a 6336      		cpi r22,99
 161 002c 7105      		cpc r23,__zero_reg__
 162 002e 0CF0      		brlt .+2
 163 0030 85C0      		rjmp .L17
  22:windows.c     ****    if( (win->y + win->hight ) > GUI_LCM_YMAX ) return(0);			// 窗口高度是否溢出
 165               	.LM5:
 166 0032 6981      		ldd r22,Y+1
 167 0034 E62F      		mov r30,r22
 168 0036 E20F      		add r30,r18
 169 0038 F12D      		mov r31,__zero_reg__
 170 003a F11D      		adc r31,__zero_reg__
 171 003c E434      		cpi r30,68
 172 003e F105      		cpc r31,__zero_reg__
 173 0040 0CF0      		brlt .+2
 174 0042 7CC0      		rjmp .L17
  23:windows.c     ****     
  24:windows.c     ****    /* 开始画窗口 */
  25:windows.c     ****    GUI_RectangleFill(win->x, win->y, win->x + win->with - 1, win->y + win->hight - 1, Back_G);
 176               	.LM6:
 177 0044 260F      		add r18,r22
 178 0046 2150      		subi r18,lo8(-(-1))
 179 0048 430F      		add r20,r19
 180 004a 4150      		subi r20,lo8(-(-1))
 181 004c 0091 0000 		lds r16,Back_G
 182 0050 832F      		mov r24,r19
 183 0052 0E94 0000 		call GUI_RectangleFill
  26:windows.c     ****    GUI_Rectangle(win->x, win->y, win->x + win->with - 1, win->y + win->hight - 1, Windows_C);	// 画
 185               	.LM7:
 186 0056 5981      		ldd r21,Y+1
 187 0058 9B81      		ldd r25,Y+3
 188 005a 950F      		add r25,r21
 189 005c 9150      		subi r25,lo8(-(-1))
 190 005e 3881      		ld r19,Y
 191 0060 8A81      		ldd r24,Y+2
 192 0062 830F      		add r24,r19
 193 0064 8150      		subi r24,lo8(-(-1))
 194 0066 0091 0000 		lds r16,Windows_C
 195 006a 292F      		mov r18,r25
 196 006c 482F      		mov r20,r24
 197 006e 652F      		mov r22,r21
 198 0070 832F      		mov r24,r19
 199 0072 0E94 0000 		call GUI_Rectangle
  27:windows.c     ****    GUI_HLine(win->x, win->y + 10, win->x + win->with - 1, Windows_C);							// 画标题目栏
 201               	.LM8:
 202 0076 3881      		ld r19,Y
 203 0078 8A81      		ldd r24,Y+2
 204 007a 830F      		add r24,r19
 205 007c 8150      		subi r24,lo8(-(-1))
 206 007e 9981      		ldd r25,Y+1
 207 0080 965F      		subi r25,lo8(-(10))
 208 0082 2091 0000 		lds r18,Windows_C
 209 0086 482F      		mov r20,r24
 210 0088 692F      		mov r22,r25
 211 008a 832F      		mov r24,r19
 212 008c 0E94 0000 		call GUI_HLine
  28:windows.c     ****    GUI_RLine(win->x + 10, win->y, win->y + 10, Windows_C);										// 画关闭窗号按钮
 214               	.LM9:
 215 0090 9981      		ldd r25,Y+1
 216 0092 892F      		mov r24,r25
 217 0094 865F      		subi r24,lo8(-(10))
 218 0096 3881      		ld r19,Y
 219 0098 2091 0000 		lds r18,Windows_C
 220 009c 482F      		mov r20,r24
 221 009e 692F      		mov r22,r25
 222 00a0 832F      		mov r24,r19
 223 00a2 865F      		subi r24,lo8(-(10))
 224 00a4 0E94 0000 		call GUI_RLine
  29:windows.c     ****    GUI_Line(win->x, win->y, win->x + 10, win->y + 10, Windows_C);
 226               	.LM10:
 227 00a8 5981      		ldd r21,Y+1
 228 00aa 952F      		mov r25,r21
 229 00ac 965F      		subi r25,lo8(-(10))
 230 00ae 3881      		ld r19,Y
 231 00b0 832F      		mov r24,r19
 232 00b2 865F      		subi r24,lo8(-(10))
 233 00b4 0091 0000 		lds r16,Windows_C
 234 00b8 292F      		mov r18,r25
 235 00ba 482F      		mov r20,r24
 236 00bc 652F      		mov r22,r21
 237 00be 832F      		mov r24,r19
 238 00c0 0E94 0000 		call GUI_Line
  30:windows.c     ****    GUI_Line(win->x + 10, win->y, win->x, win->y + 10, Windows_C);
 240               	.LM11:
 241 00c4 3981      		ldd r19,Y+1
 242 00c6 832F      		mov r24,r19
 243 00c8 865F      		subi r24,lo8(-(10))
 244 00ca 9881      		ld r25,Y
 245 00cc 0091 0000 		lds r16,Windows_C
 246 00d0 282F      		mov r18,r24
 247 00d2 492F      		mov r20,r25
 248 00d4 632F      		mov r22,r19
 249 00d6 892F      		mov r24,r25
 250 00d8 865F      		subi r24,lo8(-(10))
 251 00da 0E94 0000 		call GUI_Line
  31:windows.c     ****    
  32:windows.c     **** 
  33:windows.c     ****    /* 写标题 */
  34:windows.c     ****    if( win->title != NULL ) 
 253               	.LM12:
 254 00de 8C81      		ldd r24,Y+4
 255 00e0 9D81      		ldd r25,Y+5
 256 00e2 0097      		sbiw r24,0
 257 00e4 21F1      		breq .L6
  35:windows.c     ****    {  str = win->title;
 259               	.LM13:
 260 00e6 8C01      		movw r16,r24
  36:windows.c     ****       bak = win->x + 13;
 262               	.LM14:
 263 00e8 8881      		ld r24,Y
 264 00ea 9DE0      		ldi r25,lo8(13)
 265 00ec D92E      		mov r13,r25
 266 00ee D80E      		add r13,r24
  37:windows.c     ****       bak1 = win->y + 2;
 268               	.LM15:
 269 00f0 E980      		ldd r14,Y+1
 270 00f2 F2E0      		ldi r31,lo8(2)
 271 00f4 EF0E      		add r14,r31
  38:windows.c     ****       bak2 = win->x + win->with -1;
 273               	.LM16:
 274 00f6 FA80      		ldd r15,Y+2
 275 00f8 F80E      		add r15,r24
 276 00fa FA94      		dec r15
 277               	.L7:
  39:windows.c     ****      
  40:windows.c     ****       while(1)						
  41:windows.c     ****       {  if( (bak+8) > bak2 ) break;								// 判断标题是否溢出
 279               	.LM17:
 280 00fc 8D2D      		mov r24,r13
 281 00fe 9927      		clr r25
 282 0100 87FD      		sbrc r24,7
 283 0102 9095      		com r25
 284 0104 0896      		adiw r24,8
 285 0106 2F2D      		mov r18,r15
 286 0108 3327      		clr r19
 287 010a 27FD      		sbrc r18,7
 288 010c 3095      		com r19
 289 010e 2817      		cp r18,r24
 290 0110 3907      		cpc r19,r25
 291 0112 6CF0      		brlt .L6
  42:windows.c     ****          if(*str=='\0') break;										// 判断字符串是否结束
 293               	.LM18:
 294 0114 F801      		movw r30,r16
 295 0116 4081      		ld r20,Z
 296 0118 4423      		tst r20
 297 011a 49F0      		breq .L6
  43:windows.c     ****          
  44:windows.c     ****          GUI_PutChar(bak, bak1, *str++);							// 显示标题
 299               	.LM19:
 300 011c 0F5F      		subi r16,lo8(-(1))
 301 011e 1F4F      		sbci r17,hi8(-(1))
 302 0120 6E2D      		mov r22,r14
 303 0122 8D2D      		mov r24,r13
 304 0124 0E94 0000 		call GUI_PutChar
  45:windows.c     ****          bak += 6;
 306               	.LM20:
 307 0128 F6E0      		ldi r31,lo8(6)
 308 012a DF0E      		add r13,r31
 309 012c E7CF      		rjmp .L7
 310               	.L6:
  46:windows.c     ****       }
  47:windows.c     ****    }
  48:windows.c     **** 
  49:windows.c     **** 
  50:windows.c     ****    /* 写状态栏 */
  51:windows.c     ****    if( win->state != NULL )
 312               	.LM21:
 313 012e 8E81      		ldd r24,Y+6
 314 0130 9F81      		ldd r25,Y+7
 315 0132 892B      		or r24,r25
 316 0134 D9F1      		breq .L11
  52:windows.c     ****    {  if( win->hight < 60) return(0);								// 判断是否可以画状态栏
 318               	.LM22:
 319 0136 2B81      		ldd r18,Y+3
 320 0138 2C33      		cpi r18,lo8(60)
 321 013a 18F4      		brsh .L12
 322               	.L17:
 323 013c 80E0      		ldi r24,lo8(0)
 324 013e 90E0      		ldi r25,hi8(0)
 325 0140 37C0      		rjmp .L1
 326               	.L12:
  53:windows.c     ****       /* 画状态栏 */
  54:windows.c     ****       GUI_HLine(win->x, win->y + win->hight - 10, win->x + win->with - 1,Windows_C);
 328               	.LM23:
 329 0142 3881      		ld r19,Y
 330 0144 9A81      		ldd r25,Y+2
 331 0146 930F      		add r25,r19
 332 0148 9150      		subi r25,lo8(-(-1))
 333 014a 8981      		ldd r24,Y+1
 334 014c 820F      		add r24,r18
 335 014e 8A50      		subi r24,lo8(-(-10))
 336 0150 2091 0000 		lds r18,Windows_C
 337 0154 492F      		mov r20,r25
 338 0156 682F      		mov r22,r24
 339 0158 832F      		mov r24,r19
 340 015a 0E94 0000 		call GUI_HLine
  55:windows.c     ****       
  56:windows.c     ****       str = win->state;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -