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

📄 lcddrive.s

📁 ssd1325控制器液晶的驱动程序
💻 S
📖 第 1 页 / 共 3 页
字号:
	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
	com R30
	movw R26,R4
	ld R2,x
	and R2,R30
	st x,R2
L64:
	.dbline 393
; 
;    /* 刷新显示 */
;    LCD_UpdatePoint(x, y);
	movw R18,R22
	movw R16,R20
	xcall _LCD_UpdatePoint
	.dbline 394
;    return(1);
	ldi R16,1
	.dbline -2
L58:
	xcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym l color 4 c
	.dbsym r y 22 i
	.dbsym r x 20 i
	.dbend
	.dbfunc e GUI_ReadPoint _GUI_ReadPoint fI
;            bak -> R20
;            ret -> y+4
;              y -> R20,R21
;              x -> R22,R23
	.even
_GUI_ReadPoint::
	xcall push_gset2
	movw R20,R18
	movw R22,R16
	.dbline -1
	.dbline 408
; }
; 
; /****************************************************************************
; * 名称:GUI_ReadPoint()
; * 功能:读取指定点的颜色。
; * 入口参数:x			指定点所在列的位置
; *          y		指定点所在行的位置
; *          ret		保存颜色值的指针
; * 出口参数:返回0时表示指定地址超出有效范围。
; * 说明:对于单色,设置ret的d0位为1或0,4级灰度则为d0、d1有效,8位RGB则d0--d7有效,
; *      RGB结构则R、G、B变量有效。
; ****************************************************************************/
; int  GUI_ReadPoint(uint32 x, uint32 y, TCOLOR *ret)
; {  TCOLOR  bak;
	.dbline 411
; 
;    /* 参数过滤 */
;    if(x>=GUI_LCM_XMAX) return(0);
	cpi R22,128
	ldi R30,0
	cpc R23,R30
	brlo L66
	.dbline 411
	clr R16
	clr R17
	xjmp L65
L66:
	.dbline 412
;    if(y>=GUI_LCM_YMAX) return(0);
	cpi R20,64
	ldi R30,0
	cpc R21,R30
	brlo L68
	.dbline 412
	clr R16
	clr R17
	xjmp L65
L68:
	.dbline 415
;   
;    /* 取得该点颜色(用户自行更改) */ 
;    bak = gui_disp_buf[y][x>>3];
	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,R22
	lsr R31
	ror R30
	lsr R31
	ror R30
	lsr R31
	ror R30
	add R30,R2
	adc R31,R3
	ldd R20,z+0
	.dbline 416
;    if( (bak&DCB_HEX_TAB[x&0x07])!=0 ) *ret = 1;
	ldi R24,<_DCB_HEX_TAB
	ldi R25,>_DCB_HEX_TAB
	movw R30,R22
	andi R30,7
	andi R31,0
	add R30,R24
	adc R31,R25
	lpm R30,Z
	mov R2,R20
	and R2,R30
	breq L70
	.dbline 416
	ldi R24,1
	ldd R30,y+4
	ldd R31,y+5
	std z+0,R24
	xjmp L71
L70:
	.dbline 417
;       else  *ret = 0;
	clr R2
	ldd R30,y+4
	ldd R31,y+5
	std z+0,R2
L71:
	.dbline 419
;    
;    return(1);
	ldi R16,1
	ldi R17,0
	.dbline -2
L65:
	xcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r bak 20 c
	.dbsym l ret 4 pc
	.dbsym r y 20 i
	.dbsym r x 22 i
	.dbend
	.dbfunc e GUI_HLine _GUI_HLine fV
;            bak -> R14,R15
;          color -> R12
;             x1 -> R10,R11
;             y0 -> R22,R23
;             x0 -> R20,R21
	.even
_GUI_HLine::
	xcall push_gset5
	movw R22,R18
	movw R20,R16
	sbiw R28,1
	ldd R10,y+11
	ldd R11,y+12
	ldd R12,y+13
	.dbline -1
	.dbline 434
; }
; 
; 
; /****************************************************************************
; * 名称:GUI_HLine()
; * 功能:画水平线。
; * 入口参数: x0		水平线起点所在列的位置
; *           y0		水平线起点所在行的位置
; *           x1      水平线终点所在列的位置
; *           color	显示颜色(对于黑白色LCM,为0时灭,为1时显示)
; * 出口参数:无
; * 说明:操作失败原因是指定地址超出缓冲区范围。
; ****************************************************************************/
; void  GUI_HLine(uint32 x0, uint32 y0, uint32 x1, uint8 color) 
; {  uint32  bak;
	.dbline 436
; 
;    if(x0>x1) 						// 对x0、x1大小进行排列,以便画图
	cp R10,R20
	cpc R11,R21
	brsh L73
	.dbline 437
;    {  bak = x1;
	.dbline 437
	movw R14,R10
	.dbline 438
;       x1 = x0;
	movw R10,R20
	.dbline 439
;       x0 = bak;
	movw R20,R14
	.dbline 440
;    }
L73:
	.dbline 441
;    if(x0==x1)
	cp R20,R10
	cpc R21,R11
	brne L75
	.dbline 442
;    {  GUI_Point(x0, y0, color);
	.dbline 442
	std y+0,R12
	movw R18,R22
	movw R16,R20
	xcall _GUI_Point
	.dbline 443
;       return;
	xjmp L72
L75:
L77:
	.dbline 447
;    }
;    
;    do
;    {  /* 设置相应的点为1 */
	.dbline 448
;       if(0!=color) gui_disp_buf[y0][x0>>3] |= DCB_HEX_TAB[x0&0x07];
	tst R12
	breq L80
	.dbline 448
	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 L81
L80:
	.dbline 449
;          else  gui_disp_buf[y0][x0>>3] &= (~DCB_HEX_TAB[x0&0x07]);
	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
	com R30
	movw R26,R4
	ld R2,x
	and R2,R30
	st x,R2
L81:
	.dbline 451
;       /* 刷新显示(一次刷新一字节) */
;       if( (x0&0x07)==0x07 ) LCD_UpdatePoint(x0, y0);
	movw R24,R20
	andi R24,7
	andi R25,0
	cpi R24,7
	ldi R30,0
	cpc R25,R30
	brne L82
	.dbline 451
	movw R18,R22
	movw R16,R20
	xcall _LCD_UpdatePoint
L82:
	.dbline 453
;       
;       x0++;
	subi R20,255  ; offset = 1
	sbci R21,255
	.dbline 454
L78:
	.dbline 454
;    }while(x1>x0);
	cp R20,R10
	cpc R21,R11
	brsh X0
	xjmp L77
X0:
	.dbline 457
;    
;    /* 对最后一点显示操作 */
;    if(0!=color) gui_disp_buf[y0][x0>>3] |= DCB_HEX_TAB[x0&0x07];
	tst R12
	breq L84
	.dbline 457
	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 L85
L84:
	.dbline 458
;       else  gui_disp_buf[y0][x0>>3] &= (~DCB_HEX_TAB[x0&0x07]);
	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
	com R30
	movw R26,R4
	ld R2,x
	and R2,R30
	st x,R2
L85:
	.dbline 459
;    LCD_UpdatePoint(x0, y0);
	movw R18,R22
	movw R16,R20
	xcall _LCD_UpdatePoint
	.dbline -2
L72:
	adiw R28,1
	xcall pop_gset5
	.dbline 0 ; func end
	ret
	.dbsym r bak 14 i
	.dbsym r color 12 c
	.dbsym r x1 10 i
	.dbsym r y0 22 i
	.dbsym r x0 20 i
	.dbend
	.dbfunc e GUI_RLine _GUI_RLine fV
;            bak -> R14,R15
;          color -> R20
;             y1 -> R22,R23
;             y0 -> R10,R11
;             x0 -> R12,R13
	.even
_GUI_RLine::
	xcall push_gset5
	movw R10,R18
	movw R12,R16
	sbiw R28,1
	ldd R22,y+11
	ldd R23,y+12
	ldd R20,y+13
	.dbline -1
	.dbline 474
; }
; 
; 
; /****************************************************************************
; * 名称:GUI_RLine()
; * 功能:画垂直线。
; * 入口参数: x0		垂直线起点所在列的位置
; *           y0		垂直线起点所在行的位置
; *           y1      垂直线终点所在行的位置
; *           color	显示颜色(对于黑白色LCM,为0时灭,为1时显示)
; * 出口参数:无
; * 说明:操作失败原因是指定地址超出缓冲区范围。
; ****************************************************************************/
; void  GUI_RLine(uint32 x0, uint32 y0, uint32 y1, uint8 color) 
; {  uint32  bak;
	.dbline 476
; 
;    if(y0>y1) 						// 对y0、y1大小进行排列,以便画图
	cp R22,R10
	cpc R23,R11
	brsh L87
	.dbline 477
;    {  bak = y1;
	.dbline 477
	movw R14,R22
	.dbline 478
;       y1 = y0;
	movw R22,R10
	.dbline 479
;       y0 = bak;
	movw R10,R14
	.dbline 480
;    }
L87:
	.dbline 481
;    if(y0==y1)
	cp R10,R22
	cpc R11,R23
	brne L89
	.dbline 482
;    {  GUI_Point(x0, y0, color);
	.dbline 482
	std y+0,R20
	movw R18,R10
	movw R16,R12
	xcall _GUI_Point
	.dbline 483
;       return;
	xjmp L86
L89:
L91:
	.dbline 487
;    }
;    
;    do
;    {  GUI_Point(x0, y0, color);		// 逐点显示,描出垂直线
	.dbline 487
	std y+0,R20
	movw R18,R10
	movw R16,R12
	xcall _GUI_Point
	.dbline 488
;       y0++;
	movw R24,R10
	adiw R24,1
	movw R10,R24
	.dbline 489
L92:
	.dbline 489
;    }while(y1>y0);
	cp R10,R22
	cpc R11,R23
	brlo L91
	.dbline 490
;    GUI_Point(x0, y0, color);	
	std y+0,R20
	movw R18,R10
	movw R16,R12
	xcall _GUI_Point
	.dbline -2
L86:
	adiw R28,1
	xcall pop_gset5
	.dbline 0 ; func end
	ret
	.dbsym r bak 14 i
	.dbsym r color 20 c
	.dbsym r y1 22 i
	.dbsym r y0 10 i
	.dbsym r x0 12 i
	.dbend
	.area bss(ram, con, rel)
	.dbfile G:\IccPro\mega128_lcd\lcddrive.c
_gui_disp_buf::
	.blkb 1024
	.dbsym e gui_disp_buf _gui_disp_buf A[1024:64:16]c

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -