📄 lcddrive.s
字号:
xcall _LCD_TestStaBit01
tst R16
brne L35
.dbline 239
clr R16
xjmp L32
L35:
.dbline 240
; LCD_WriteCommand(command); // 发送命令字
mov R16,R20
xcall _LCD_WriteCommand
.dbline 242
;
; return(1);
ldi R16,1
.dbline -2
L32:
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r dat1 22 c
.dbsym r command 20 c
.dbend
.dbfunc e LCD_WriteTData1 _LCD_WriteTData1 fc
; dat -> R20
.even
_LCD_WriteTData1::
xcall push_gset1
mov R20,R16
.dbline -1
.dbline 253
; }
;
;
; /***********************************************************************
; * 名称:LCD_WriteTData1()
; * 功能:写1字节数据子程序。会先判断状态字。
; * 入口参数:dat 要写入LCM的数据
; * 出口参数:操作出错返回0,否则返回1
; ***********************************************************************/
; uint8 LCD_WriteTData1(uint8 dat)
; { if( LCD_TestStaBit3()==0 ) return(0);
.dbline 253
xcall _LCD_TestStaBit3
tst R16
brne L38
.dbline 253
clr R16
xjmp L37
L38:
.dbline 254
; LCD_WriteData(dat); // 发送命令字
mov R16,R20
xcall _LCD_WriteData
.dbline 256
;
; return(1);
ldi R16,1
.dbline -2
L37:
xcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r dat 20 c
.dbend
.dbfunc e LCD_Initialize _LCD_Initialize fV
.even
_LCD_Initialize::
sbiw R28,1
.dbline -1
.dbline 271
; }
;
;
; /* 以下为LCM的用户接口层,主要负责解释用户命令,并发送到LCM,为用户编程提供接口 */
;
;
; /***********************************************************************
; * 名称:LCD_Initialize()
; * 功能:LCM初始化,将LCM初始化为纯图形模式,显示起始地址为0x0000,。
; * 入口参数:无
; * 出口参数:无
; * 说明:函数会设置LCM数据总线为输出方式
; ***********************************************************************/
; void LCD_Initialize(void)
; { LCD_WriteTCommand3(LCD_TXT_STP, 0x00, 0x00); // 设置文本方式RAM起始地址
.dbline 271
clr R2
std y+0,R2
clr R18
ldi R16,64
xcall _LCD_WriteTCommand3
.dbline 272
; LCD_WriteTCommand3(LCD_TXT_WID, 16, 0x00); // 设置文本模式的宽度,宽度为N/6或N/8,N为宽度点数,如240
clr R2
std y+0,R2
ldi R18,16
ldi R16,65
xcall _LCD_WriteTCommand3
.dbline 273
; LCD_WriteTCommand3(LCD_GRH_STP, 0x00, 0x00); // 设置图形方式RAM起始地址
clr R2
std y+0,R2
clr R18
ldi R16,66
xcall _LCD_WriteTCommand3
.dbline 274
; LCD_WriteTCommand3(LCD_GRH_WID, 16, 0x00); // 设置图形模式的宽度,宽度为N/6或N/8,N为宽度点数,如240
clr R2
std y+0,R2
ldi R18,16
ldi R16,67
xcall _LCD_WriteTCommand3
.dbline 275
; LCD_WriteTCommand1(LCD_MOD_OR); // 设置显示方式为"或"
ldi R16,128
xcall _LCD_WriteTCommand1
.dbline 276
; LCD_WriteTCommand1(LCD_DIS_SW|0x08); // 设置纯图形显示模式
ldi R16,152
xcall _LCD_WriteTCommand1
.dbline -2
L40:
adiw R28,1
.dbline 0 ; func end
ret
.dbend
.dbfunc e LCD_FillAll _LCD_FillAll fV
; i -> R20,R21
; dat -> R22
.even
_LCD_FillAll::
xcall push_gset2
mov R22,R16
sbiw R28,1
.dbline -1
.dbline 287
; }
;
;
; /***********************************************************************
; * 名称:LCD_FillAll()
; * 功能:LCD填充。以图形方式进行填充,起始地址为0x0000。
; * 入口参数:dat 要填充的数据
; * 出口参数:无
; ***********************************************************************/
; void LCD_FillAll(uint8 dat)
; { uint32 i;
.dbline 289
;
; LCD_WriteTCommand3(LCD_ADR_POS, 0x00, 0x00); // 置地址指针
clr R2
std y+0,R2
clr R18
ldi R16,36
xcall _LCD_WriteTCommand3
.dbline 290
; LCD_WriteTCommand1(LCD_AUT_WR); // 自动写
ldi R16,176
xcall _LCD_WriteTCommand1
.dbline 291
; for(i=0;i<128*30;i++)
clr R20
clr R21
xjmp L45
L42:
.dbline 292
.dbline 292
mov R16,R22
xcall _LCD_WriteTData1
.dbline 293
L43:
.dbline 291
subi R20,255 ; offset = 1
sbci R21,255
L45:
.dbline 291
cpi R20,0
ldi R30,15
cpc R21,R30
brlo L42
.dbline 294
; { LCD_WriteTData1(dat); // 写数据
; }
; LCD_WriteTCommand1(LCD_AUT_OVR); // 自动写结束
ldi R16,178
xcall _LCD_WriteTCommand1
.dbline 295
; LCD_WriteTCommand3(LCD_ADR_POS,0x00,0x00); // 重置地址指针
clr R2
std y+0,R2
clr R18
ldi R16,36
xcall _LCD_WriteTCommand3
.dbline -2
L41:
adiw R28,1
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r i 20 i
.dbsym r dat 22 c
.dbend
.dbfunc e LCD_UpdatePoint _LCD_UpdatePoint fV
; addr -> R10,R11
; y -> R22,R23
; x -> R20,R21
.even
_LCD_UpdatePoint::
xcall push_gset3
movw R22,R18
movw R20,R16
sbiw R28,1
.dbline -1
.dbline 308
; }
;
;
; /****************************************************************************
; * 名称:LCD_UpdatePoint()
; * 功能:在指定位置上画点,刷新某一点。
; * 入口参数: x 指定点所在列的位置
; * y 指定点所在行的位置
; * 出口参数:返回值为1时表示操作成功,为0时表示操作失败。
; * 说明:操作失败原因是指定地址超出缓冲区范围。
; ****************************************************************************/
; void LCD_UpdatePoint(uint32 x, uint32 y)
; { uint32 addr;
.dbline 311
;
; /* 找出目标地址 */
; addr = y*(GUI_LCM_XMAX>>3) + (x>>3);
ldi R16,16
ldi R17,0
movw R18,R22
xcall empy16s
movw R10,R16
movw R2,R20
lsr R3
ror R2
lsr R3
ror R2
lsr R3
ror R2
add R10,R2
adc R11,R3
.dbline 312
; LCD_WriteTCommand3(LCD_ADR_POS, addr&0xFF, addr>>8); // 置地址指针
movw R2,R10
mov R2,R3
clr R3
std y+0,R2
mov R18,R10
andi R19,0
ldi R16,36
xcall _LCD_WriteTCommand3
.dbline 315
;
; /* 输出数据 */
; LCD_WriteTCommand2(LCD_INC_WR, gui_disp_buf[y][x>>3]);
ldi R16,16
ldi R17,0
movw R18,R22
xcall empy16s
movw R2,R16
ldi R24,<_gui_disp_buf
ldi R25,>_gui_disp_buf
add R2,R24
adc R3,R25
movw R30,R20
lsr R31
ror R30
lsr R31
ror R30
lsr R31
ror R30
add R30,R2
adc R31,R3
ldd R18,z+0
ldi R16,192
xcall _LCD_WriteTCommand2
.dbline -2
L46:
adiw R28,1
xcall pop_gset3
.dbline 0 ; func end
ret
.dbsym r addr 10 i
.dbsym r y 22 i
.dbsym r x 20 i
.dbend
.dbfunc e GUI_FillSCR _GUI_FillSCR fV
; i -> R20,R21
; j -> R10,R11
; dat -> R22
.even
_GUI_FillSCR::
xcall push_gset3
mov R22,R16
.dbline -1
.dbline 332
; }
;
;
;
; /****************************************************************************
; * 与LCM相关的GUI接口函数
; ****************************************************************************/
;
;
; /****************************************************************************
; * 名称:GUI_FillSCR()
; * 功能:全屏填充。直接使用数据填充显示缓冲区。
; * 入口参数:dat 填充的数据(对于黑白色LCM,为0的点灭,为1的点显示)
; * 出口参数:无
; ****************************************************************************/
; void GUI_FillSCR(uint8 dat)
; { uint32 i, j;
.dbline 334
;
; for(i=0; i<GUI_LCM_YMAX; i++) // 历遍所有行
clr R20
clr R21
xjmp L51
L48:
.dbline 335
; { for(j=0; j<GUI_LCM_XMAX/8; j++) // 历遍所有行
.dbline 335
clr R10
clr R11
xjmp L55
L52:
.dbline 336
.dbline 336
ldi R16,16
ldi R17,0
movw R18,R20
xcall empy16s
movw R2,R16
ldi R24,<_gui_disp_buf
ldi R25,>_gui_disp_buf
add R2,R24
adc R3,R25
movw R30,R10
add R30,R2
adc R31,R3
std z+0,R22
.dbline 337
L53:
.dbline 335
movw R24,R10
adiw R24,1
movw R10,R24
L55:
.dbline 335
movw R24,R10
cpi R24,16
ldi R30,0
cpc R25,R30
brlo L52
.dbline 338
L49:
.dbline 334
subi R20,255 ; offset = 1
sbci R21,255
L51:
.dbline 334
cpi R20,64
ldi R30,0
cpc R21,R30
brlo L48
.dbline 341
; { gui_disp_buf[i][j] = dat; // 填充数据
; }
; }
;
; /* 填充LCM */
; LCD_FillAll(dat);
mov R16,R22
xcall _LCD_FillAll
.dbline -2
L47:
xcall pop_gset3
.dbline 0 ; func end
ret
.dbsym r i 20 i
.dbsym r j 10 i
.dbsym r dat 22 c
.dbend
.dbfunc e GUI_Initialize _GUI_Initialize fV
.even
_GUI_Initialize::
.dbline -1
.dbline 352
; }
;
;
; /****************************************************************************
; * 名称:GUI_Initialize()
; * 功能:初始化GUI,包括初始化显示缓冲区,初始化LCM并清屏。
; * 入口参数:无
; * 出口参数:无
; ****************************************************************************/
; void GUI_Initialize(void)
; { LCD_Initialize(); // 初始化LCM模块工作模式,纯图形模式
.dbline 352
xcall _LCD_Initialize
.dbline 353
; GUI_FillSCR(0x00); // 初始化缓冲区为0x00,并输出屏幕(清屏)
clr R16
xcall _GUI_FillSCR
.dbline -2
L56:
.dbline 0 ; func end
ret
.dbend
.dbfunc e GUI_ClearSCR _GUI_ClearSCR fV
.even
_GUI_ClearSCR::
.dbline -1
.dbline 365
; }
;
;
; /****************************************************************************
; * 名称:GUI_ClearSCR()
; * 功能:清屏。
; * 入口参数:无
; * 出口参数:无
; * 说明:用户根据LCM的实际情况编写此函数。
; ****************************************************************************/
; void GUI_ClearSCR(void)
; { GUI_FillSCR(0x00);
.dbline 365
clr R16
xcall _GUI_FillSCR
.dbline -2
L57:
.dbline 0 ; func end
ret
.dbend
.area lit(rom, con, rel)
_DCB_HEX_TAB::
.byte 128,64
.byte 32,16
.byte 8,4
.byte 2,1
.dbsym e DCB_HEX_TAB _DCB_HEX_TAB A[8:8]kc
.area text(rom, con, rel)
.dbfile G:\IccPro\mega128_lcd\lcddrive.c
.dbfunc e GUI_Point _GUI_Point fc
; color -> y+4
; y -> R22,R23
; x -> R20,R21
.even
_GUI_Point::
xcall push_gset2
movw R22,R18
movw R20,R16
.dbline -1
.dbline 384
; }
;
;
; uint8 const DCB_HEX_TAB[8] = {0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01};
;
; /****************************************************************************
; * 名称:GUI_Point()
; * 功能:在指定位置上画点。
; * 入口参数: x 指定点所在列的位置
; * y 指定点所在行的位置
; * color 显示颜色(对于黑白色LCM,为0时灭,为1时显示)
; * 出口参数:返回值为1时表示操作成功,为0时表示操作失败。(操作失败原因是指定地址超出有
; * 效范围)
; * 说明:用户根据LCM的实际情况编写此函数。对于单色,只有一个位有效,则要使用左移的方法
; * 实现point_dat = (point_dat&MASK_TAB [i]) | (color<<n),其它位数的一样
; * 处理。
; ****************************************************************************/
; uint8 GUI_Point(uint32 x, uint32 y, TCOLOR color)
; { /* 参数过滤 */
.dbline 385
; if(x>=GUI_LCM_XMAX) return(0);
cpi R20,128
ldi R30,0
cpc R21,R30
brlo L59
.dbline 385
clr R16
xjmp L58
L59:
.dbline 386
; if(y>=GUI_LCM_YMAX) return(0);
cpi R22,64
ldi R30,0
cpc R23,R30
brlo L61
.dbline 386
clr R16
xjmp L58
L61:
.dbline 389
;
; /* 设置缓冲区相应的点 */
; if( (color&0x01) != 0 ) gui_disp_buf[y][x>>3] |= DCB_HEX_TAB[x&0x07];
ldd R0,y+4
sbrs R0,0
rjmp L63
.dbline 389
ldi R16,16
ldi R17,0
movw R18,R22
xcall empy16s
movw R2,R16
ldi R24,<_gui_disp_buf
ldi R25,>_gui_disp_buf
add R2,R24
adc R3,R25
movw R4,R20
lsr R5
ror R4
lsr R5
ror R4
lsr R5
ror R4
add R4,R2
adc R5,R3
ldi R24,<_DCB_HEX_TAB
ldi R25,>_DCB_HEX_TAB
movw R30,R20
andi R30,7
andi R31,0
add R30,R24
adc R31,R25
lpm R30,Z
movw R26,R4
ld R2,x
or R2,R30
st x,R2
xjmp L64
L63:
.dbline 390
; else gui_disp_buf[y][x>>3] &= (~DCB_HEX_TAB[x&0x07]);
ldi R16,16
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -