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

📄 lcddrive.s

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