📄 128_lcd.lst
字号:
0948 C003 RJMP 0x094C
(0221) LCD_WriteCommand(command); // 发送命令字
0949 2F04 MOV R16,R20
094A DF84 RCALL _LCD_WriteCommand
(0222)
(0223) return(1);
094B E001 LDI R16,1
094C 940E3B95 CALL pop_gset2
094E 9508 RET
_LCD_WriteTCommand2:
dat1 --> R22
command --> R20
094F 940E3BA7 CALL push_gset2
0951 2F62 MOV R22,R18
0952 2F40 MOV R20,R16
(0224) }
(0225)
(0226)
(0227) /***********************************************************************
(0228) * 名称:LCD_WriteTCommand2()
(0229) * 功能:写单参数命令子程序。会先判断LCM状态字。
(0230) * 入口参数:command 要写入LCM的命令字
(0231) * dat1 参数1
(0232) * 出口参数:操作出错返回0,否则返回1
(0233) * 说明:先发送参数据数据,再发送命令字
(0234) ***********************************************************************/
(0235) uint8 LCD_WriteTCommand2(uint8 command, uint8 dat1)
(0236) { if( LCD_TestStaBit01()==0 ) return(0);
0953 DFB2 RCALL _LCD_TestStaBit01
0954 2300 TST R16
0955 F411 BNE 0x0958
0956 2700 CLR R16
0957 C00A RJMP 0x0962
(0237) LCD_WriteData(dat1); // 发送数据1
0958 2F06 MOV R16,R22
0959 DF83 RCALL _LCD_WriteData
(0238)
(0239) if( LCD_TestStaBit01()==0 ) return(0);
095A DFAB RCALL _LCD_TestStaBit01
095B 2300 TST R16
095C F411 BNE 0x095F
095D 2700 CLR R16
095E C003 RJMP 0x0962
(0240) LCD_WriteCommand(command); // 发送命令字
095F 2F04 MOV R16,R20
0960 DF6E RCALL _LCD_WriteCommand
(0241)
(0242) return(1);
0961 E001 LDI R16,1
0962 940E3B95 CALL pop_gset2
0964 9508 RET
_LCD_WriteTData1:
dat --> R20
0965 940E3BA9 CALL push_gset1
0967 2F40 MOV R20,R16
(0243) }
(0244)
(0245)
(0246) /***********************************************************************
(0247) * 名称:LCD_WriteTData1()
(0248) * 功能:写1字节数据子程序。会先判断状态字。
(0249) * 入口参数:dat 要写入LCM的数据
(0250) * 出口参数:操作出错返回0,否则返回1
(0251) ***********************************************************************/
(0252) uint8 LCD_WriteTData1(uint8 dat)
(0253) { if( LCD_TestStaBit3()==0 ) return(0);
0968 DFA6 RCALL _LCD_TestStaBit3
0969 2300 TST R16
096A F411 BNE 0x096D
096B 2700 CLR R16
096C C003 RJMP 0x0970
(0254) LCD_WriteData(dat); // 发送命令字
096D 2F04 MOV R16,R20
096E DF6E RCALL _LCD_WriteData
(0255)
(0256) return(1);
096F E001 LDI R16,1
0970 940E3BAC CALL pop_gset1
0972 9508 RET
_LCD_Initialize:
0973 9721 SBIW R28,1
(0257) }
(0258)
(0259)
(0260) /* 以下为LCM的用户接口层,主要负责解释用户命令,并发送到LCM,为用户编程提供接口 */
(0261)
(0262)
(0263) /***********************************************************************
(0264) * 名称:LCD_Initialize()
(0265) * 功能:LCM初始化,将LCM初始化为纯图形模式,显示起始地址为0x0000,。
(0266) * 入口参数:无
(0267) * 出口参数:无
(0268) * 说明:函数会设置LCM数据总线为输出方式
(0269) ***********************************************************************/
(0270) void LCD_Initialize(void)
(0271) { LCD_WriteTCommand3(LCD_TXT_STP, 0x00, 0x00); // 设置文本方式RAM起始地址
0974 2422 CLR R2
0975 8228 STD Y+0,R2
0976 2722 CLR R18
0977 E400 LDI R16,0x40
0978 DFB9 RCALL _LCD_WriteTCommand3
(0272) LCD_WriteTCommand3(LCD_TXT_WID, 16, 0x00); // 设置文本模式的宽度,宽度为N/6或N/8,N为宽度点数,如240
0979 2422 CLR R2
097A 8228 STD Y+0,R2
097B E120 LDI R18,0x10
097C E401 LDI R16,0x41
097D DFB4 RCALL _LCD_WriteTCommand3
(0273) LCD_WriteTCommand3(LCD_GRH_STP, 0x00, 0x00); // 设置图形方式RAM起始地址
097E 2422 CLR R2
097F 8228 STD Y+0,R2
0980 2722 CLR R18
0981 E402 LDI R16,0x42
0982 DFAF RCALL _LCD_WriteTCommand3
(0274) LCD_WriteTCommand3(LCD_GRH_WID, 16, 0x00); // 设置图形模式的宽度,宽度为N/6或N/8,N为宽度点数,如240
0983 2422 CLR R2
0984 8228 STD Y+0,R2
0985 E120 LDI R18,0x10
0986 E403 LDI R16,0x43
0987 DFAA RCALL _LCD_WriteTCommand3
(0275) LCD_WriteTCommand1(LCD_MOD_OR); // 设置显示方式为"或"
0988 E800 LDI R16,0x80
0989 DF9A RCALL _LCD_WriteTCommand1
(0276) LCD_WriteTCommand1(LCD_DIS_SW|0x08); // 设置纯图形显示模式
098A E908 LDI R16,0x98
098B DF98 RCALL _LCD_WriteTCommand1
098C 9621 ADIW R28,1
098D 9508 RET
_LCD_FillAll:
i --> R20
dat --> R22
098E 940E3BA7 CALL push_gset2
0990 2F60 MOV R22,R16
0991 9721 SBIW R28,1
(0277) }
(0278)
(0279)
(0280) /***********************************************************************
(0281) * 名称:LCD_FillAll()
(0282) * 功能:LCD填充。以图形方式进行填充,起始地址为0x0000。
(0283) * 入口参数:dat 要填充的数据
(0284) * 出口参数:无
(0285) ***********************************************************************/
(0286) void LCD_FillAll(uint8 dat)
(0287) { uint32 i;
(0288)
(0289) LCD_WriteTCommand3(LCD_ADR_POS, 0x00, 0x00); // 置地址指针
0992 2422 CLR R2
0993 8228 STD Y+0,R2
0994 2722 CLR R18
0995 E204 LDI R16,0x24
0996 DF9B RCALL _LCD_WriteTCommand3
(0290) LCD_WriteTCommand1(LCD_AUT_WR); // 自动写
0997 EB00 LDI R16,0xB0
0998 DF8B RCALL _LCD_WriteTCommand1
(0291) for(i=0;i<128*30;i++)
0999 2744 CLR R20
099A 2755 CLR R21
099B C004 RJMP 0x09A0
(0292) { LCD_WriteTData1(dat); // 写数据
099C 2F06 MOV R16,R22
099D DFC7 RCALL _LCD_WriteTData1
099E 5F4F SUBI R20,0xFF
099F 4F5F SBCI R21,0xFF
09A0 3040 CPI R20,0
09A1 E0EF LDI R30,0xF
09A2 075E CPC R21,R30
09A3 F3C0 BCS 0x099C
(0293) }
(0294) LCD_WriteTCommand1(LCD_AUT_OVR); // 自动写结束
09A4 EB02 LDI R16,0xB2
09A5 DF7E RCALL _LCD_WriteTCommand1
(0295) LCD_WriteTCommand3(LCD_ADR_POS,0x00,0x00); // 重置地址指针
09A6 2422 CLR R2
09A7 8228 STD Y+0,R2
09A8 2722 CLR R18
09A9 E204 LDI R16,0x24
09AA DF87 RCALL _LCD_WriteTCommand3
09AB 9621 ADIW R28,1
09AC 940E3B95 CALL pop_gset2
09AE 9508 RET
_LCD_UpdatePoint:
addr --> R10
y --> R22
x --> R20
09AF 940E3BA5 CALL push_gset3
09B1 01B9 MOVW R22,R18
09B2 01A8 MOVW R20,R16
09B3 9721 SBIW R28,1
(0296) }
(0297)
(0298)
(0299) /****************************************************************************
(0300) * 名称:LCD_UpdatePoint()
(0301) * 功能:在指定位置上画点,刷新某一点。
(0302) * 入口参数: x 指定点所在列的位置
(0303) * y 指定点所在行的位置
(0304) * 出口参数:返回值为1时表示操作成功,为0时表示操作失败。
(0305) * 说明:操作失败原因是指定地址超出缓冲区范围。
(0306) ****************************************************************************/
(0307) void LCD_UpdatePoint(uint32 x, uint32 y)
(0308) { uint32 addr;
(0309)
(0310) /* 找出目标地址 */
(0311) addr = y*(GUI_LCM_XMAX>>3) + (x>>3);
09B4 E100 LDI R16,0x10
09B5 E010 LDI R17,0
09B6 019B MOVW R18,R22
09B7 940E3B85 CALL empy16s
09B9 0158 MOVW R10,R16
09BA 011A MOVW R2,R20
09BB 9436 LSR R3
09BC 9427 ROR R2
09BD 9436 LSR R3
09BE 9427 ROR R2
09BF 9436 LSR R3
09C0 9427 ROR R2
09C1 0CA2 ADD R10,R2
09C2 1CB3 ADC R11,R3
(0312) LCD_WriteTCommand3(LCD_ADR_POS, addr&0xFF, addr>>8); // 置地址指针
09C3 0115 MOVW R2,R10
09C4 2C23 MOV R2,R3
09C5 2433 CLR R3
09C6 8228 STD Y+0,R2
09C7 2D2A MOV R18,R10
09C8 7030 ANDI R19,0
09C9 E204 LDI R16,0x24
09CA DF67 RCALL _LCD_WriteTCommand3
(0313)
(0314) /* 输出数据 */
(0315) LCD_WriteTCommand2(LCD_INC_WR, gui_disp_buf[y][x>>3]);
09CB E100 LDI R16,0x10
09CC E010 LDI R17,0
09CD 019B MOVW R18,R22
09CE 940E3B85 CALL empy16s
09D0 0118 MOVW R2,R16
09D1 E48E LDI R24,0x4E
09D2 E091 LDI R25,1
09D3 0E28 ADD R2,R24
09D4 1E39 ADC R3,R25
09D5 01FA MOVW R30,R20
09D6 95F6 LSR R31
09D7 95E7 ROR R30
09D8 95F6 LSR R31
09D9 95E7 ROR R30
09DA 95F6 LSR R31
09DB 95E7 ROR R30
09DC 0DE2 ADD R30,R2
09DD 1DF3 ADC R31,R3
09DE 8120 LDD R18,Z+0
09DF EC00 LDI R16,0xC0
09E0 DF6E RCALL _LCD_WriteTCommand2
09E1 9621 ADIW R28,1
09E2 940E3B98 CALL pop_gset3
09E4 9508 RET
_GUI_FillSCR:
i --> R20
j --> R10
dat --> R22
09E5 940E3BA5 CALL push_gset3
09E7 2F60 MOV R22,R16
(0316) }
(0317)
(0318)
(0319)
(0320) /****************************************************************************
(0321) * 与LCM相关的GUI接口函数
(0322) ****************************************************************************/
(0323)
(0324)
(0325) /****************************************************************************
(0326) * 名称:GUI_FillSCR()
(0327) * 功能:全屏填充。直接使用数据填充显示缓冲区。
(0328) * 入口参数:dat 填充的数据(对于黑白色LCM,为0的点灭,为1的点显示)
(0329) * 出口参数:无
(0330) ****************************************************************************/
(0331) void GUI_FillSCR(uint8 dat)
(0332) { uint32 i, j;
(0333)
(0334) for(i=0; i<GUI_LCM_YMAX; i++) // 历遍所有行
09E8 2744 CLR R20
09E9 2755 CLR R21
09EA C01B RJMP 0x0A06
(0335) { for(j=0; j<GUI_LCM_XMAX/8; j++) // 历遍所有行
09EB 24AA CLR R10
09EC 24BB CLR R11
09ED C011 RJMP 0x09FF
(0336) { gui_disp_buf[i][j] = dat; // 填充数据
09EE E100 LDI R16,0x10
09EF E010 LDI R17,0
09F0 019A MOVW R18,R20
09F1 940E3B85 CALL empy16s
09F3 0118 MOVW R2,R16
09F4 E48E LDI R24,0x4E
09F5 E091 LDI R25,1
09F6 0E28 ADD R2,R24
09F7 1E39 ADC R3,R25
09F8 01F5 MOVW R30,R10
09F9 0DE2 ADD R30,R2
09FA 1DF3 ADC R31,R3
09FB 8360 STD Z+0,R22
09FC 01C5 MOVW R24,R10
09FD 9601 ADIW R24,1
09FE 015C MOVW R10,R24
09FF 01C5 MOVW R24,R10
0A00 3180 CPI R24,0x10
0A01 E0E0 LDI R30,0
0A02 079E CPC R25,R30
0A03 F350 BCS 0x09EE
0A04 5F4F SUBI R20,0xFF
0A05 4F5F SBCI R21,0xFF
0A06 3440 CPI R20,0x40
0A07 E0E0 LDI R30,0
0A08 075E CPC R21,R30
0A09 F308 BCS 0x09EB
(0337) }
(0338) }
(0339)
(0340) /* 填充LCM */
(0341) LCD_FillAll(dat);
0A0A 2F06 MOV R16,R22
0A0B DF82 RCALL _LCD_FillAll
0A0C 940E3B98 CALL pop_gset3
0A0E 9508 RET
(0342) }
(0343)
(0344)
(0345) /****************************************************************************
(0346) * 名称:GUI_Initialize()
(0347) * 功能:初始化GUI,包括初始化显示缓冲区,初始化LCM并清屏。
(0348) * 入口参数:无
(0349) * 出口参数:无
(0350) ****************************************************************************/
(0351) void GUI_Initialize(void)
(0352) { LCD_Initialize(); // 初始化LCM模块工作模式,纯图形模式
_GUI_Initialize:
0A0F DF63 RCALL _LCD_Initialize
(0353) GUI_FillSCR(0x00); // 初始化缓冲区为0x00,并输出屏幕(清屏)
0A10 2700 CLR R16
0A11 DFD3 RCALL _GUI_FillSCR
0A12 9508 RET
(0354) }
(0355)
(0356)
(0357) /****************************************************************************
(0358) * 名称:GUI_ClearSCR()
(0359) * 功能:清屏。
(0360) * 入口参数:无
(0361) * 出口参数:无
(0362) * 说明:用户根据LCM的实际情况编写此函数。
(0363) ****************************************************************************/
(0364) void GUI_ClearSCR(void)
(0365) { GUI_FillSCR(0x00);
_GUI_ClearSCR:
0A13 2700 CLR R16
0A14 DFD0 RCALL _GUI_FillSCR
0A15 9508 RET
_GUI_Point:
color --> Y+4
y --> R22
x --> R20
0A16 940E3BA7 CALL push_gset2
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -