📄 lcddrive.lis
字号:
0132 ; ***********************************************************************/
0132 ; uint8 LCD_WriteTData1(uint8 dat)
0132 ; { if( LCD_TestStaBit3()==0 ) return(0);
0132 .dbline 253
0132 A6DF xcall _LCD_TestStaBit3
0134 0023 tst R16
0136 11F4 brne L38
0138 .dbline 253
0138 0027 clr R16
013A 03C0 xjmp L37
013C L38:
013C .dbline 254
013C ; LCD_WriteData(dat); // 发送命令字
013C 042F mov R16,R20
013E 6EDF xcall _LCD_WriteData
0140 .dbline 256
0140 ;
0140 ; return(1);
0140 01E0 ldi R16,1
0142 .dbline -2
0142 L37:
0142 0E940000 xcall pop_gset1
0146 .dbline 0 ; func end
0146 0895 ret
0148 .dbsym r dat 20 c
0148 .dbend
0148 .dbfunc e LCD_Initialize _LCD_Initialize fV
.even
0148 _LCD_Initialize::
0148 2197 sbiw R28,1
014A .dbline -1
014A .dbline 271
014A ; }
014A ;
014A ;
014A ; /* 以下为LCM的用户接口层,主要负责解释用户命令,并发送到LCM,为用户编程提供接口 */
014A ;
014A ;
014A ; /***********************************************************************
014A ; * 名称:LCD_Initialize()
014A ; * 功能:LCM初始化,将LCM初始化为纯图形模式,显示起始地址为0x0000,。
014A ; * 入口参数:无
014A ; * 出口参数:无
014A ; * 说明:函数会设置LCM数据总线为输出方式
014A ; ***********************************************************************/
014A ; void LCD_Initialize(void)
014A ; { LCD_WriteTCommand3(LCD_TXT_STP, 0x00, 0x00); // 设置文本方式RAM起始地址
014A .dbline 271
014A 2224 clr R2
014C 2882 std y+0,R2
014E 2227 clr R18
0150 00E4 ldi R16,64
0152 B9DF xcall _LCD_WriteTCommand3
0154 .dbline 272
0154 ; LCD_WriteTCommand3(LCD_TXT_WID, 16, 0x00); // 设置文本模式的宽度,宽度为N/6或N/8,N为宽度点数,如240
0154 2224 clr R2
0156 2882 std y+0,R2
0158 20E1 ldi R18,16
015A 01E4 ldi R16,65
015C B4DF xcall _LCD_WriteTCommand3
015E .dbline 273
015E ; LCD_WriteTCommand3(LCD_GRH_STP, 0x00, 0x00); // 设置图形方式RAM起始地址
015E 2224 clr R2
0160 2882 std y+0,R2
0162 2227 clr R18
0164 02E4 ldi R16,66
0166 AFDF xcall _LCD_WriteTCommand3
0168 .dbline 274
0168 ; LCD_WriteTCommand3(LCD_GRH_WID, 16, 0x00); // 设置图形模式的宽度,宽度为N/6或N/8,N为宽度点数,如240
0168 2224 clr R2
016A 2882 std y+0,R2
016C 20E1 ldi R18,16
016E 03E4 ldi R16,67
0170 AADF xcall _LCD_WriteTCommand3
0172 .dbline 275
0172 ; LCD_WriteTCommand1(LCD_MOD_OR); // 设置显示方式为"或"
0172 00E8 ldi R16,128
0174 9ADF xcall _LCD_WriteTCommand1
0176 .dbline 276
0176 ; LCD_WriteTCommand1(LCD_DIS_SW|0x08); // 设置纯图形显示模式
0176 08E9 ldi R16,152
0178 98DF xcall _LCD_WriteTCommand1
017A .dbline -2
017A L40:
017A 2196 adiw R28,1
017C .dbline 0 ; func end
017C 0895 ret
017E .dbend
017E .dbfunc e LCD_FillAll _LCD_FillAll fV
017E ; i -> R20,R21
017E ; dat -> R22
.even
017E _LCD_FillAll::
017E 0E940000 xcall push_gset2
0182 602F mov R22,R16
0184 2197 sbiw R28,1
0186 .dbline -1
0186 .dbline 287
0186 ; }
0186 ;
0186 ;
0186 ; /***********************************************************************
0186 ; * 名称:LCD_FillAll()
0186 ; * 功能:LCD填充。以图形方式进行填充,起始地址为0x0000。
0186 ; * 入口参数:dat 要填充的数据
0186 ; * 出口参数:无
0186 ; ***********************************************************************/
0186 ; void LCD_FillAll(uint8 dat)
0186 ; { uint32 i;
0186 .dbline 289
0186 ;
0186 ; LCD_WriteTCommand3(LCD_ADR_POS, 0x00, 0x00); // 置地址指针
0186 2224 clr R2
0188 2882 std y+0,R2
018A 2227 clr R18
018C 04E2 ldi R16,36
018E 9BDF xcall _LCD_WriteTCommand3
0190 .dbline 290
0190 ; LCD_WriteTCommand1(LCD_AUT_WR); // 自动写
0190 00EB ldi R16,176
0192 8BDF xcall _LCD_WriteTCommand1
0194 .dbline 291
0194 ; for(i=0;i<128*30;i++)
0194 4427 clr R20
0196 5527 clr R21
0198 04C0 xjmp L45
019A L42:
019A .dbline 292
019A .dbline 292
019A 062F mov R16,R22
019C C7DF xcall _LCD_WriteTData1
019E .dbline 293
019E L43:
019E .dbline 291
019E 4F5F subi R20,255 ; offset = 1
01A0 5F4F sbci R21,255
01A2 L45:
01A2 .dbline 291
01A2 4030 cpi R20,0
01A4 EFE0 ldi R30,15
01A6 5E07 cpc R21,R30
01A8 C0F3 brlo L42
01AA .dbline 294
01AA ; { LCD_WriteTData1(dat); // 写数据
01AA ; }
01AA ; LCD_WriteTCommand1(LCD_AUT_OVR); // 自动写结束
01AA 02EB ldi R16,178
01AC 7EDF xcall _LCD_WriteTCommand1
01AE .dbline 295
01AE ; LCD_WriteTCommand3(LCD_ADR_POS,0x00,0x00); // 重置地址指针
01AE 2224 clr R2
01B0 2882 std y+0,R2
01B2 2227 clr R18
01B4 04E2 ldi R16,36
01B6 87DF xcall _LCD_WriteTCommand3
01B8 .dbline -2
01B8 L41:
01B8 2196 adiw R28,1
01BA 0E940000 xcall pop_gset2
01BE .dbline 0 ; func end
01BE 0895 ret
01C0 .dbsym r i 20 i
01C0 .dbsym r dat 22 c
01C0 .dbend
01C0 .dbfunc e LCD_UpdatePoint _LCD_UpdatePoint fV
01C0 ; addr -> R10,R11
01C0 ; y -> R22,R23
01C0 ; x -> R20,R21
.even
01C0 _LCD_UpdatePoint::
01C0 0E940000 xcall push_gset3
01C4 B901 movw R22,R18
01C6 A801 movw R20,R16
01C8 2197 sbiw R28,1
01CA .dbline -1
01CA .dbline 308
01CA ; }
01CA ;
01CA ;
01CA ; /****************************************************************************
01CA ; * 名称:LCD_UpdatePoint()
01CA ; * 功能:在指定位置上画点,刷新某一点。
01CA ; * 入口参数: x 指定点所在列的位置
01CA ; * y 指定点所在行的位置
01CA ; * 出口参数:返回值为1时表示操作成功,为0时表示操作失败。
01CA ; * 说明:操作失败原因是指定地址超出缓冲区范围。
01CA ; ****************************************************************************/
01CA ; void LCD_UpdatePoint(uint32 x, uint32 y)
01CA ; { uint32 addr;
01CA .dbline 311
01CA ;
01CA ; /* 找出目标地址 */
01CA ; addr = y*(GUI_LCM_XMAX>>3) + (x>>3);
01CA 00E1 ldi R16,16
01CC 10E0 ldi R17,0
01CE 9B01 movw R18,R22
01D0 0E940000 xcall empy16s
01D4 5801 movw R10,R16
01D6 1A01 movw R2,R20
01D8 3694 lsr R3
01DA 2794 ror R2
01DC 3694 lsr R3
01DE 2794 ror R2
01E0 3694 lsr R3
01E2 2794 ror R2
01E4 A20C add R10,R2
01E6 B31C adc R11,R3
01E8 .dbline 312
01E8 ; LCD_WriteTCommand3(LCD_ADR_POS, addr&0xFF, addr>>8); // 置地址指针
01E8 1501 movw R2,R10
01EA 232C mov R2,R3
01EC 3324 clr R3
01EE 2882 std y+0,R2
01F0 2A2D mov R18,R10
01F2 3070 andi R19,0
01F4 04E2 ldi R16,36
01F6 67DF xcall _LCD_WriteTCommand3
01F8 .dbline 315
01F8 ;
01F8 ; /* 输出数据 */
01F8 ; LCD_WriteTCommand2(LCD_INC_WR, gui_disp_buf[y][x>>3]);
01F8 00E1 ldi R16,16
01FA 10E0 ldi R17,0
01FC 9B01 movw R18,R22
01FE 0E940000 xcall empy16s
0202 1801 movw R2,R16
0204 80E0 ldi R24,<_gui_disp_buf
0206 90E0 ldi R25,>_gui_disp_buf
0208 280E add R2,R24
020A 391E adc R3,R25
020C FA01 movw R30,R20
020E F695 lsr R31
0210 E795 ror R30
0212 F695 lsr R31
0214 E795 ror R30
0216 F695 lsr R31
0218 E795 ror R30
021A E20D add R30,R2
021C F31D adc R31,R3
021E 2081 ldd R18,z+0
0220 00EC ldi R16,192
0222 6EDF xcall _LCD_WriteTCommand2
0224 .dbline -2
0224 L46:
0224 2196 adiw R28,1
0226 0E940000 xcall pop_gset3
022A .dbline 0 ; func end
022A 0895 ret
022C .dbsym r addr 10 i
022C .dbsym r y 22 i
022C .dbsym r x 20 i
022C .dbend
022C .dbfunc e GUI_FillSCR _GUI_FillSCR fV
022C ; i -> R20,R21
022C ; j -> R10,R11
022C ; dat -> R22
.even
022C _GUI_FillSCR::
022C 0E940000 xcall push_gset3
0230 602F mov R22,R16
0232 .dbline -1
0232 .dbline 332
0232 ; }
0232 ;
0232 ;
0232 ;
0232 ; /****************************************************************************
0232 ; * 与LCM相关的GUI接口函数
0232 ; ****************************************************************************/
0232 ;
0232 ;
0232 ; /****************************************************************************
0232 ; * 名称:GUI_FillSCR()
0232 ; * 功能:全屏填充。直接使用数据填充显示缓冲区。
0232 ; * 入口参数:dat 填充的数据(对于黑白色LCM,为0的点灭,为1的点显示)
0232 ; * 出口参数:无
0232 ; ****************************************************************************/
0232 ; void GUI_FillSCR(uint8 dat)
0232 ; { uint32 i, j;
0232 .dbline 334
0232 ;
0232 ; for(i=0; i<GUI_LCM_YMAX; i++) // 历遍所有行
0232 4427 clr R20
0234 5527 clr R21
0236 1BC0 xjmp L51
0238 L48:
0238 .dbline 335
0238 ; { for(j=0; j<GUI_LCM_XMAX/8; j++) // 历遍所有行
0238 .dbline 335
0238 AA24 clr R10
023A BB24 clr R11
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -