⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 128_lcd.lst

📁 ssd1325控制器液晶的驱动程序
💻 LST
📖 第 1 页 / 共 5 页
字号:
    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 + -