📄 loadbit.s
字号:
.module loadbit.c
.area text(rom, con, rel)
.dbfile G:\IccPro\mega128_lcd\ZLG_GUI\loadbit.c
.dbfunc e GUI_LoadLine _GUI_LoadLine fc
; bit_dat -> R20
; bakc -> y+1
; i -> R22
; no -> R10,R11
; dat -> R12,R13
; y -> R14,R15
; x -> R4,R5
.even
_GUI_LoadLine::
xcall push_gset5
movw R14,R18
movw R4,R16
sbiw R28,2
ldd R12,y+12
ldd R13,y+13
ldd R10,y+14
ldd R11,y+15
.dbline -1
.dbline 22
; /****************************************************************************************
; * 文件名:LOADBIT.C
; * 功能:显示单色图形及汉字显示。先将图形转换为对应的点阵数组,然后即可调用此文件的函数输出驱动。
; * 作者:黄绍斌
; * 日期:2004.02.26
; * 备注:使用GUI_SetBackColor()函数设置显示颜色及背景色。
; ****************************************************************************************/
; #include "config.h"
;
; #if (GUI_LoadPic_EN==1)|(GUI_MenuIco_EN==1)|(GUI_PutHZ_EN==1)
; /****************************************************************************
; * 名称:GUI_LoadLine()
; * 功能:输出单色图形的一行数据。
; * 入口参数: x 指定显示位置,x坐标
; * y 指定显示位置,y坐标
; * dat 要输出显示的数据。
; * no 要显示此行的点个数
; * 出口参数:返回值为1时表示操作成功,为0时表示操作失败。
; * 说明:操作失败原因是指定地址超出有效范围。
; ****************************************************************************/
; uint8 GUI_LoadLine(uint32 x, uint32 y, uint8 *dat, uint32 no)
; { uint8 bit_dat;
.dbline 27
; uint8 i;
; TCOLOR bakc;
;
; /* 参数过滤 */
; if(x>=GUI_LCM_XMAX) return(0);
movw R24,R4
cpi R24,240
ldi R30,0
cpc R25,R30
brlo L8
.dbline 27
clr R16
xjmp L7
L8:
.dbline 28
; if(y>=GUI_LCM_YMAX) return(0);
movw R24,R14
cpi R24,128
ldi R30,0
cpc R25,R30
brlo L10
.dbline 28
clr R16
xjmp L7
L10:
.dbline 30
;
; for(i=0; i<no; i++)
clr R22
xjmp L15
L12:
.dbline 31
; { /* 判断是否要读取点阵数据 */
.dbline 32
; if( (i%8)==0 ) bit_dat = *dat++;
ldi R17,8
mov R16,R22
xcall mod8u
tst R16
brne L16
.dbline 32
movw R30,R12
ld R20,Z+
movw R12,R30
L16:
.dbline 35
;
; /* 设置相应的点为color或为back_color */
; if( (bit_dat&DCB2HEX_TAB[i&0x07])==0 ) GUI_CopyColor(&bakc, back_color);
ldi R24,<_DCB2HEX_TAB
ldi R25,>_DCB2HEX_TAB
mov R30,R22
clr R31
andi R30,7
andi R31,0
add R30,R24
adc R31,R25
lpm R30,Z
mov R2,R20
and R2,R30
brne L18
.dbline 35
lds R2,_back_color
std y+1,R2
xjmp L19
L18:
.dbline 36
; else GUI_CopyColor(&bakc, disp_color);
lds R2,_disp_color
std y+1,R2
L19:
.dbline 37
; GUI_Point(x, y, bakc);
ldd R2,y+1
std y+0,R2
movw R18,R14
movw R16,R4
push R16
push R17
xcall _GUI_Point
pop R5
pop R4
.dbline 39
;
; if( (++x)>=GUI_LCM_XMAX ) return(0);
movw R24,R4
adiw R24,1
movw R4,R24
cpi R24,240
ldi R30,0
cpc R25,R30
brlo L20
.dbline 39
clr R16
xjmp L7
L20:
.dbline 40
L13:
.dbline 30
inc R22
L15:
.dbline 30
mov R2,R22
clr R3
cp R2,R10
cpc R3,R11
brsh X0
xjmp L12
X0:
.dbline 42
; }
;
; return(1);
ldi R16,1
.dbline -2
L7:
adiw R28,2
xcall pop_gset5
.dbline 0 ; func end
ret
.dbsym r bit_dat 20 c
.dbsym l bakc 1 c
.dbsym r i 22 c
.dbsym r no 10 i
.dbsym r dat 12 pc
.dbsym r y 14 i
.dbsym r x 4 i
.dbend
.dbfunc e GUI_LoadPic _GUI_LoadPic fV
; i -> R20,R21
; lno -> R22,R23
; hno -> R10,R11
; dat -> R12,R13
; y -> R14,R15
; x -> y+14
.even
_GUI_LoadPic::
xcall push_arg4
xcall push_gset5
movw R14,R18
sbiw R28,4
ldd R12,y+18
ldd R13,y+19
ldd R10,y+20
ldd R11,y+21
ldd R22,y+22
ldd R23,y+23
.dbline -1
.dbline 60
; }
; #endif
;
;
; #if (GUI_LoadPic_EN==1)|(GUI_MenuIco_EN==1)
; /****************************************************************************
; * 名称:GUI_LoadPic()
; * 功能:输出单色图形数据。
; * 入口参数: x 指定显示位置,x坐标
; * y 指定显示位置,y坐标
; * dat 要输出显示的数据
; * hno 要显示此行的点个数
; * lno 要显示此列的点个数
; * 出口参数:无
; * 说明:操作失败原因是指定地址超出有效范围。
; ****************************************************************************/
; void GUI_LoadPic(uint32 x, uint32 y, uint8 *dat, uint32 hno, uint32 lno)
; { uint32 i;
.dbline 62
;
; for(i=0; i<lno; i++)
clr R20
clr R21
xjmp L26
L23:
.dbline 63
; { GUI_LoadLine(x, y, dat, hno); // 输出一行数据
.dbline 63
std y+3,R11
std y+2,R10
std y+1,R13
std y+0,R12
movw R18,R14
ldd R16,y+14
ldd R17,y+15
xcall _GUI_LoadLine
.dbline 64
; y++; // 显示下一行
movw R24,R14
adiw R24,1
movw R14,R24
.dbline 65
; dat += (hno>>3); // 计算下一行的数据
movw R2,R10
lsr R3
ror R2
lsr R3
ror R2
lsr R3
ror R2
add R12,R2
adc R13,R3
.dbline 66
; if( (hno&0x07)!=0 ) dat++;
movw R24,R10
andi R24,7
andi R25,0
cpi R24,0
cpc R24,R25
breq L27
X1:
.dbline 66
movw R24,R12
adiw R24,1
movw R12,R24
L27:
.dbline 67
L24:
.dbline 62
subi R20,255 ; offset = 1
sbci R21,255
L26:
.dbline 62
cp R20,R22
cpc R21,R23
brlo L23
.dbline -2
L22:
adiw R28,4
xcall pop_gset5
adiw R28,4
.dbline 0 ; func end
ret
.dbsym r i 20 i
.dbsym r lno 22 i
.dbsym r hno 10 i
.dbsym r dat 12 pc
.dbsym r y 14 i
.dbsym l x 14 i
.dbend
.dbfunc e GUI_LoadPic1 _GUI_LoadPic1 fV
; i -> R20,R21
; lno -> R22,R23
; hno -> R10,R11
; dat -> R12,R13
; y -> R14,R15
; x -> y+14
.even
_GUI_LoadPic1::
xcall push_arg4
xcall push_gset5
movw R14,R18
sbiw R28,4
ldd R12,y+18
ldd R13,y+19
ldd R10,y+20
ldd R11,y+21
ldd R22,y+22
ldd R23,y+23
.dbline -1
.dbline 85
; }
; }
;
;
;
;
; /****************************************************************************
; * 名称:GUI_LoadPic1()
; * 功能:输出单色图形数据,反相显示。
; * 入口参数: x 指定显示位置,x坐标
; * y 指定显示位置,y坐标
; * dat 要输出显示的数据。
; * hno 要显示此行的点个数
; * lno 要显示此列的点个数
; * 出口参数:无
; * 说明:操作失败原因是指定地址超出有效范围。
; ****************************************************************************/
; void GUI_LoadPic1(uint32 x, uint32 y, uint8 *dat, uint32 hno, uint32 lno)
; { uint32 i;
.dbline 87
;
; GUI_ExchangeColor(); // 显示色与背景色交换
xcall _GUI_ExchangeColor
.dbline 88
; for(i=0; i<lno; i++)
clr R20
clr R21
xjmp L33
L30:
.dbline 89
; { GUI_LoadLine(x, y, dat, hno); // 输出一行数据
.dbline 89
std y+3,R11
std y+2,R10
std y+1,R13
std y+0,R12
movw R18,R14
ldd R16,y+14
ldd R17,y+15
xcall _GUI_LoadLine
.dbline 90
; y++; // 显示下一行
movw R24,R14
adiw R24,1
movw R14,R24
.dbline 91
; dat += (hno>>3); // 计算下一行的数据
movw R2,R10
lsr R3
ror R2
lsr R3
ror R2
lsr R3
ror R2
add R12,R2
adc R13,R3
.dbline 92
; if( (hno&0x07)!=0 ) dat++;
movw R24,R10
andi R24,7
andi R25,0
cpi R24,0
cpc R24,R25
breq L34
X2:
.dbline 92
movw R24,R12
adiw R24,1
movw R12,R24
L34:
.dbline 93
L31:
.dbline 88
subi R20,255 ; offset = 1
sbci R21,255
L33:
.dbline 88
cp R20,R22
cpc R21,R23
brlo L30
.dbline 94
; }
; GUI_ExchangeColor();
xcall _GUI_ExchangeColor
.dbline -2
L29:
adiw R28,4
xcall pop_gset5
adiw R28,4
.dbline 0 ; func end
ret
.dbsym r i 20 i
.dbsym r lno 22 i
.dbsym r hno 10 i
.dbsym r dat 12 pc
.dbsym r y 14 i
.dbsym l x 14 i
.dbend
.dbfunc e GUI_PutHZ _GUI_PutHZ fV
; i -> R20
; lno -> R22
; hno -> R10
; dat -> R12,R13
; y -> R14,R15
; x -> y+14
.even
_GUI_PutHZ::
xcall push_arg4
xcall push_gset5
movw R14,R18
sbiw R28,4
ldd R12,y+18
ldd R13,y+19
ldd R10,y+20
ldd R22,y+22
.dbline -1
.dbline 113
;
; }
; #endif
;
;
; #if GUI_PutHZ_EN==1
; /****************************************************************************
; * 名称:GUI_PutHZ()
; * 功能:显示汉字。
; * 入口参数: x 指定显示位置,x坐标
; * y 指定显示位置,y坐标
; * dat 要输出显示的汉字点阵数据。
; * hno 要显示此行的点个数
; * lno 要显示此列的点个数
; * 出口参数:无
; * 说明:操作失败原因是指定地址超出有效范围。
; ****************************************************************************/
; void GUI_PutHZ(uint32 x, uint32 y, uint8 *dat, uint8 hno, uint8 lno)
; { uint8 i;
.dbline 115
;
; for(i=0; i<lno; i++)
clr R20
xjmp L40
L37:
.dbline 116
; { GUI_LoadLine(x, y, dat, hno); // 输出一行数据
.dbline 116
mov R2,R10
clr R3
std y+3,R3
std y+2,R2
std y+1,R13
std y+0,R12
movw R18,R14
ldd R16,y+14
ldd R17,y+15
xcall _GUI_LoadLine
.dbline 117
; y++; // 显示下一行
movw R24,R14
adiw R24,1
movw R14,R24
.dbline 118
; dat += (hno>>3); // 计算下一行的数据
mov R2,R10
clr R3
asr R3
ror R2
asr R3
ror R2
asr R3
ror R2
add R12,R2
adc R13,R3
.dbline 119
; if( (hno&0x07)!=0 ) dat++;
mov R24,R10
andi R24,7
breq L41
.dbline 119
movw R24,R12
adiw R24,1
movw R12,R24
L41:
.dbline 120
L38:
.dbline 115
inc R20
L40:
.dbline 115
cp R20,R22
brlo L37
.dbline -2
L36:
adiw R28,4
xcall pop_gset5
adiw R28,4
.dbline 0 ; func end
ret
.dbsym r i 20 c
.dbsym r lno 22 c
.dbsym r hno 10 c
.dbsym r dat 12 pc
.dbsym r y 14 i
.dbsym l x 14 i
.dbend
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -