📄 gui_basic.lis
字号:
.module GUI_BASIC.C
.area text(rom, con, rel)
0000 .dbfile G:\IccPro\mega128_lcd\ZLG_GUI\GUI_BASIC.C
0000 .dbfunc e GUI_Rectangle _GUI_Rectangle fV
0000 ; color -> R22
0000 ; y1 -> y+11
0000 ; x1 -> y+9
0000 ; y0 -> R20,R21
0000 ; x0 -> R10,R11
.even
0000 _GUI_Rectangle::
0000 0E940000 xcall push_gset3
0004 A901 movw R20,R18
0006 5801 movw R10,R16
0008 2397 sbiw R28,3
000A 6D85 ldd R22,y+13
000C .dbline -1
000C .dbline 24
000C ; /****************************************************************************************
000C ; * 文件名:GUI_BASIC.C
000C ; * 功能:GUI基本绘图函数。进行基本绘图运算,并调用相应的刷新程序更新LCD显示。
000C ; * 作者:黄绍斌
000C ; * 日期:2004.02.26
000C ; * 备注:图形操作层,进行各种图形运算操作。
000C ; ****************************************************************************************/
000C ; #include "config.h"
000C ; #include <math.h>
000C ;
000C ;
000C ; /****************************************************************************
000C ; * 名称:GUI_Rectangle()
000C ; * 功能:画矩形。
000C ; * 入口参数: x0 矩形左上角的x坐标值
000C ; * y0 矩形左上角的y坐标值
000C ; * x1 矩形右下角的x坐标值
000C ; * y1 矩形右下角的y坐标值
000C ; * color 显示颜色
000C ; * 出口参数:无
000C ; * 说明:操作失败原因是指定地址超出有效范围。
000C ; ****************************************************************************/
000C ; void GUI_Rectangle(uint32 x0, uint32 y0, uint32 x1, uint32 y1, TCOLOR color)
000C ; { GUI_HLine(x0, y0, x1, color);
000C .dbline 24
000C 6A83 std y+2,R22
000E 0984 ldd R0,y+9
0010 1A84 ldd R1,y+10
0012 1982 std y+1,R1
0014 0882 std y+0,R0
0016 9A01 movw R18,R20
0018 8501 movw R16,R10
001A 0E940000 xcall _GUI_HLine
001E .dbline 25
001E ; GUI_HLine(x0, y1, x1, color);
001E 6A83 std y+2,R22
0020 0984 ldd R0,y+9
0022 1A84 ldd R1,y+10
0024 1982 std y+1,R1
0026 0882 std y+0,R0
0028 2B85 ldd R18,y+11
002A 3C85 ldd R19,y+12
002C 8501 movw R16,R10
002E 0E940000 xcall _GUI_HLine
0032 .dbline 26
0032 ; GUI_RLine(x0, y0, y1, color);
0032 6A83 std y+2,R22
0034 0B84 ldd R0,y+11
0036 1C84 ldd R1,y+12
0038 1982 std y+1,R1
003A 0882 std y+0,R0
003C 9A01 movw R18,R20
003E 8501 movw R16,R10
0040 0E940000 xcall _GUI_RLine
0044 .dbline 27
0044 ; GUI_RLine(x1, y0, y1, color);
0044 6A83 std y+2,R22
0046 0B84 ldd R0,y+11
0048 1C84 ldd R1,y+12
004A 1982 std y+1,R1
004C 0882 std y+0,R0
004E 9A01 movw R18,R20
0050 0985 ldd R16,y+9
0052 1A85 ldd R17,y+10
0054 0E940000 xcall _GUI_RLine
0058 .dbline -2
0058 L7:
0058 2396 adiw R28,3
005A 0E940000 xcall pop_gset3
005E .dbline 0 ; func end
005E 0895 ret
0060 .dbsym r color 22 c
0060 .dbsym l y1 11 i
0060 .dbsym l x1 9 i
0060 .dbsym r y0 20 i
0060 .dbsym r x0 10 i
0060 .dbend
0060 .dbfunc e GUI_RectangleFill _GUI_RectangleFill fV
0060 ; i -> R14,R15
0060 ; color -> R20
0060 ; y1 -> R22,R23
0060 ; x1 -> R10,R11
0060 ; y0 -> R12,R13
0060 ; x0 -> y+13
.even
0060 _GUI_RectangleFill::
0060 0E940000 xcall push_arg4
0064 0E940000 xcall push_gset5
0068 6901 movw R12,R18
006A 2397 sbiw R28,3
006C A988 ldd R10,y+17
006E BA88 ldd R11,y+18
0070 6B89 ldd R22,y+19
0072 7C89 ldd R23,y+20
0074 4D89 ldd R20,y+21
0076 .dbline -1
0076 .dbline 43
0076 ; }
0076 ;
0076 ;
0076 ; /****************************************************************************
0076 ; * 名称:GUI_RectangleFill()
0076 ; * 功能:填充矩形。画一个填充的矩形,填充色与边框色一样。
0076 ; * 入口参数: x0 矩形左上角的x坐标值
0076 ; * y0 矩形左上角的y坐标值
0076 ; * x1 矩形右下角的x坐标值
0076 ; * y1 矩形右下角的y坐标值
0076 ; * color 填充颜色
0076 ; * 出口参数:无
0076 ; * 说明:操作失败原因是指定地址超出有效范围。
0076 ; ****************************************************************************/
0076 ; void GUI_RectangleFill(uint32 x0, uint32 y0, uint32 x1, uint32 y1, TCOLOR color)
0076 ; { uint32 i;
0076 .dbline 46
0076 ;
0076 ; /* 先找出矩形左上角与右下角的两个点,保存在(x0,y0),(x1,y1) */
0076 ; if(x0>x1) // 若x0>x1,则x0与x1交换
0076 0D84 ldd R0,y+13
0078 1E84 ldd R1,y+14
007A A014 cp R10,R0
007C B104 cpc R11,R1
007E 20F4 brsh L9
0080 .dbline 47
0080 ; { i = x0;
0080 .dbline 47
0080 7001 movw R14,R0
0082 .dbline 48
0082 ; x0 = x1;
0082 BE86 std y+14,R11
0084 AD86 std y+13,R10
0086 .dbline 49
0086 ; x1 = i;
0086 5701 movw R10,R14
0088 .dbline 50
0088 ; }
0088 L9:
0088 .dbline 51
0088 ; if(y0>y1) // 若y0>y1,则y0与y1交换
0088 6C15 cp R22,R12
008A 7D05 cpc R23,R13
008C 18F4 brsh L11
008E .dbline 52
008E ; { i = y0;
008E .dbline 52
008E 7601 movw R14,R12
0090 .dbline 53
0090 ; y0 = y1;
0090 6B01 movw R12,R22
0092 .dbline 54
0092 ; y1 = i;
0092 B701 movw R22,R14
0094 .dbline 55
0094 ; }
0094 L11:
0094 .dbline 58
0094 ;
0094 ; /* 判断是否只是直线 */
0094 ; if(y0==y1)
0094 C616 cp R12,R22
0096 D706 cpc R13,R23
0098 49F4 brne L13
009A .dbline 59
009A ; { GUI_HLine(x0, y0, x1, color);
009A .dbline 59
009A 4A83 std y+2,R20
009C B982 std y+1,R11
009E A882 std y+0,R10
00A0 9601 movw R18,R12
00A2 0D85 ldd R16,y+13
00A4 1E85 ldd R17,y+14
00A6 0E940000 xcall _GUI_HLine
00AA .dbline 60
00AA ; return;
00AA 1BC0 xjmp L8
00AC L13:
00AC .dbline 62
00AC ; }
00AC ; if(x0==x1)
00AC 0D84 ldd R0,y+13
00AE 1E84 ldd R1,y+14
00B0 0A14 cp R0,R10
00B2 1B04 cpc R1,R11
00B4 99F4 brne L18
00B6 .dbline 63
00B6 ; { GUI_RLine(x0, y0, y1, color);
00B6 .dbline 63
00B6 4A83 std y+2,R20
00B8 7983 std y+1,R23
00BA 6883 std y+0,R22
00BC 9601 movw R18,R12
00BE 8001 movw R16,R0
00C0 0E940000 xcall _GUI_RLine
00C4 .dbline 64
00C4 ; return;
00C4 0EC0 xjmp L8
00C6 L17:
00C6 .dbline 68
00C6 .dbline 68
00C6 4A83 std y+2,R20
00C8 B982 std y+1,R11
00CA A882 std y+0,R10
00CC 9601 movw R18,R12
00CE 0D85 ldd R16,y+13
00D0 1E85 ldd R17,y+14
00D2 0E940000 xcall _GUI_HLine
00D6 .dbline 69
00D6 C601 movw R24,R12
00D8 0196 adiw R24,1
00DA 6C01 movw R12,R24
00DC .dbline 70
00DC L18:
00DC .dbline 67
00DC ; }
00DC ;
00DC ; while(y0<=y1)
00DC 6C15 cp R22,R12
00DE 7D05 cpc R23,R13
00E0 90F7 brsh L17
00E2 .dbline -2
00E2 L8:
00E2 2396 adiw R28,3
00E4 0E940000 xcall pop_gset5
00E8 2496 adiw R28,4
00EA .dbline 0 ; func end
00EA 0895 ret
00EC .dbsym r i 14 i
00EC .dbsym r color 20 c
00EC .dbsym r y1 22 i
00EC .dbsym r x1 10 i
00EC .dbsym r y0 12 i
00EC .dbsym l x0 13 i
00EC .dbend
00EC .dbfunc e GUI_Square _GUI_Square fV
00EC ; color -> y+13
00EC ; with -> R10,R11
00EC ; y0 -> R22,R23
00EC ; x0 -> R20,R21
.even
00EC _GUI_Square::
00EC 0E940000 xcall push_gset3
00F0 B901 movw R22,R18
00F2 A801 movw R20,R16
00F4 2597 sbiw R28,5
00F6 AB84 ldd R10,y+11
00F8 BC84 ldd R11,y+12
00FA .dbline -1
00FA .dbline 85
00FA ; { GUI_HLine(x0, y0, x1, color); // 当前画水平线
00FA ; y0++; // 下一行
00FA ; }
00FA ; }
00FA ;
00FA ;
00FA ; /****************************************************************************
00FA ; * 名称:GUI_Square()
00FA ; * 功能:画正方形。
00FA ; * 入口参数: x0 正方形左上角的x坐标值
00FA ; * y0 正方形左上角的y坐标值
00FA ; * with 正方形的边长
00FA ; * color 显示颜色
00FA ; * 出口参数:无
00FA ; * 说明:操作失败原因是指定地址超出有效范围。
00FA ; ****************************************************************************/
00FA ; void GUI_Square(uint32 x0, uint32 y0, uint32 with, TCOLOR color)
00FA ; { if(with==0) return;
00FA .dbline 85
00FA AA20 tst R10
00FC 19F4 brne L21
00FE BB20 tst R11
0100 09F4 brne L21
0102 X0:
0102 .dbline 85
0102 21C0 xjmp L20
0104 L21:
0104 .dbline 86
0104 ; if( (x0+with) > GUI_LCM_XMAX ) return;
0104 1A01 movw R2,R20
0106 2A0C add R2,R10
0108 3B1C adc R3,R11
010A 80EF ldi R24,240
010C 90E0 ldi R25,0
010E 8215 cp R24,R2
0110 9305 cpc R25,R3
0112 08F4 brsh L23
0114 .dbline 86
0114 18C0 xjmp L20
0116 L23:
0116 .dbline 87
0116 ; if( (y0+with) > GUI_LCM_YMAX ) return;
0116 1B01 movw R2,R22
0118 2A0C add R2,R10
011A 3B1C adc R3,R11
011C 80E8 ldi R24,128
011E 90E0 ldi R25,0
0120 8215 cp R24,R2
0122 9305 cpc R25,R3
0124 08F4 brsh L25
0126 .dbline 87
0126 0FC0 xjmp L20
0128 L25:
0128 .dbline 88
0128 ; GUI_Rectangle(x0, y0, x0+with, y0+with, color);
0128 0D84 ldd R0,y+13
012A 0C82 std y+4,R0
012C 1B01 movw R2,R22
012E 2A0C add R2,R10
0130 3B1C adc R3,R11
0132 3B82 std y+3,R3
0134 2A82 std y+2,R2
0136 1A01 movw R2,R20
0138 2A0C add R2,R10
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -