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

📄 128_lcd.lst

📁 ssd1325控制器液晶的驱动程序
💻 LST
📖 第 1 页 / 共 5 页
字号:
    0A18 01B9      MOVW	R22,R18
    0A19 01A8      MOVW	R20,R16
(0366) }
(0367) 
(0368) 
(0369) uint8 const  DCB_HEX_TAB[8] = {0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01};
(0370) 
(0371) /****************************************************************************
(0372) * 名称:GUI_Point()
(0373) * 功能:在指定位置上画点。
(0374) * 入口参数: x		指定点所在列的位置
(0375) *           y		指定点所在行的位置
(0376) *           color	显示颜色(对于黑白色LCM,为0时灭,为1时显示)
(0377) * 出口参数:返回值为1时表示操作成功,为0时表示操作失败。(操作失败原因是指定地址超出有
(0378) *          效范围)
(0379) * 说明:用户根据LCM的实际情况编写此函数。对于单色,只有一个位有效,则要使用左移的方法
(0380) *      实现point_dat = (point_dat&MASK_TAB [i]) | (color<<n),其它位数的一样
(0381) *      处理。
(0382) ****************************************************************************/
(0383) uint8  GUI_Point(uint32 x, uint32 y, TCOLOR color)
(0384) {  /* 参数过滤 */
(0385)    if(x>=GUI_LCM_XMAX) return(0);
    0A1A 3840      CPI	R20,0x80
    0A1B E0E0      LDI	R30,0
    0A1C 075E      CPC	R21,R30
    0A1D F010      BCS	0x0A20
    0A1E 2700      CLR	R16
    0A1F C04D      RJMP	0x0A6D
(0386)    if(y>=GUI_LCM_YMAX) return(0);
    0A20 3460      CPI	R22,0x40
    0A21 E0E0      LDI	R30,0
    0A22 077E      CPC	R23,R30
    0A23 F010      BCS	0x0A26
    0A24 2700      CLR	R16
    0A25 C047      RJMP	0x0A6D
(0387)    
(0388)    /* 设置缓冲区相应的点 */
(0389)    if( (color&0x01) != 0 ) gui_disp_buf[y][x>>3] |= DCB_HEX_TAB[x&0x07];
    0A26 800C      LDD	R0,Y+4
    0A27 FE00      SBRS	R0,0
    0A28 C020      RJMP	0x0A49
    0A29 E100      LDI	R16,0x10
    0A2A E010      LDI	R17,0
    0A2B 019B      MOVW	R18,R22
    0A2C 940E3B85  CALL	empy16s
    0A2E 0118      MOVW	R2,R16
    0A2F E48E      LDI	R24,0x4E
    0A30 E091      LDI	R25,1
    0A31 0E28      ADD	R2,R24
    0A32 1E39      ADC	R3,R25
    0A33 012A      MOVW	R4,R20
    0A34 9456      LSR	R5
    0A35 9447      ROR	R4
    0A36 9456      LSR	R5
    0A37 9447      ROR	R4
    0A38 9456      LSR	R5
    0A39 9447      ROR	R4
    0A3A 0C42      ADD	R4,R2
    0A3B 1C53      ADC	R5,R3
    0A3C E788      LDI	R24,0x78
    0A3D E091      LDI	R25,1
    0A3E 01FA      MOVW	R30,R20
    0A3F 70E7      ANDI	R30,7
    0A40 70F0      ANDI	R31,0
    0A41 0FE8      ADD	R30,R24
    0A42 1FF9      ADC	R31,R25
    0A43 91E4      LPM	R30,0(Z)
    0A44 01D2      MOVW	R26,R4
    0A45 902C      LD	R2,0(X)
    0A46 2A2E      OR	R2,R30
    0A47 922C      ST	R2,0(X)
    0A48 C020      RJMP	0x0A69
(0390)       else  gui_disp_buf[y][x>>3] &= (~DCB_HEX_TAB[x&0x07]);
    0A49 E100      LDI	R16,0x10
    0A4A E010      LDI	R17,0
    0A4B 019B      MOVW	R18,R22
    0A4C 940E3B85  CALL	empy16s
    0A4E 0118      MOVW	R2,R16
    0A4F E48E      LDI	R24,0x4E
    0A50 E091      LDI	R25,1
    0A51 0E28      ADD	R2,R24
    0A52 1E39      ADC	R3,R25
    0A53 012A      MOVW	R4,R20
    0A54 9456      LSR	R5
    0A55 9447      ROR	R4
    0A56 9456      LSR	R5
    0A57 9447      ROR	R4
    0A58 9456      LSR	R5
    0A59 9447      ROR	R4
    0A5A 0C42      ADD	R4,R2
    0A5B 1C53      ADC	R5,R3
    0A5C E788      LDI	R24,0x78
    0A5D E091      LDI	R25,1
    0A5E 01FA      MOVW	R30,R20
    0A5F 70E7      ANDI	R30,7
    0A60 70F0      ANDI	R31,0
    0A61 0FE8      ADD	R30,R24
    0A62 1FF9      ADC	R31,R25
    0A63 91E4      LPM	R30,0(Z)
    0A64 95E0      COM	R30
    0A65 01D2      MOVW	R26,R4
    0A66 902C      LD	R2,0(X)
    0A67 222E      AND	R2,R30
    0A68 922C      ST	R2,0(X)
(0391) 
(0392)    /* 刷新显示 */
(0393)    LCD_UpdatePoint(x, y);
    0A69 019B      MOVW	R18,R22
    0A6A 018A      MOVW	R16,R20
    0A6B DF43      RCALL	_LCD_UpdatePoint
(0394)    return(1);
    0A6C E001      LDI	R16,1
    0A6D 940E3B95  CALL	pop_gset2
    0A6F 9508      RET
_GUI_ReadPoint:
  bak                  --> R20
  ret                  --> Y+4
  y                    --> R20
  x                    --> R22
    0A70 940E3BA7  CALL	push_gset2
    0A72 01A9      MOVW	R20,R18
    0A73 01B8      MOVW	R22,R16
(0395) }
(0396) 
(0397) /****************************************************************************
(0398) * 名称:GUI_ReadPoint()
(0399) * 功能:读取指定点的颜色。
(0400) * 入口参数:x			指定点所在列的位置
(0401) *          y		指定点所在行的位置
(0402) *          ret		保存颜色值的指针
(0403) * 出口参数:返回0时表示指定地址超出有效范围。
(0404) * 说明:对于单色,设置ret的d0位为1或0,4级灰度则为d0、d1有效,8位RGB则d0--d7有效,
(0405) *      RGB结构则R、G、B变量有效。
(0406) ****************************************************************************/
(0407) int  GUI_ReadPoint(uint32 x, uint32 y, TCOLOR *ret)
(0408) {  TCOLOR  bak;
(0409) 
(0410)    /* 参数过滤 */
(0411)    if(x>=GUI_LCM_XMAX) return(0);
    0A74 3860      CPI	R22,0x80
    0A75 E0E0      LDI	R30,0
    0A76 077E      CPC	R23,R30
    0A77 F018      BCS	0x0A7B
    0A78 2700      CLR	R16
    0A79 2711      CLR	R17
    0A7A C031      RJMP	0x0AAC
(0412)    if(y>=GUI_LCM_YMAX) return(0);
    0A7B 3440      CPI	R20,0x40
    0A7C E0E0      LDI	R30,0
    0A7D 075E      CPC	R21,R30
    0A7E F018      BCS	0x0A82
    0A7F 2700      CLR	R16
    0A80 2711      CLR	R17
    0A81 C02A      RJMP	0x0AAC
(0413)   
(0414)    /* 取得该点颜色(用户自行更改) */ 
(0415)    bak = gui_disp_buf[y][x>>3];
    0A82 E100      LDI	R16,0x10
    0A83 E010      LDI	R17,0
    0A84 019A      MOVW	R18,R20
    0A85 940E3B85  CALL	empy16s
    0A87 0118      MOVW	R2,R16
    0A88 E48E      LDI	R24,0x4E
    0A89 E091      LDI	R25,1
    0A8A 0E28      ADD	R2,R24
    0A8B 1E39      ADC	R3,R25
    0A8C 01FB      MOVW	R30,R22
    0A8D 95F6      LSR	R31
    0A8E 95E7      ROR	R30
    0A8F 95F6      LSR	R31
    0A90 95E7      ROR	R30
    0A91 95F6      LSR	R31
    0A92 95E7      ROR	R30
    0A93 0DE2      ADD	R30,R2
    0A94 1DF3      ADC	R31,R3
    0A95 8140      LDD	R20,Z+0
(0416)    if( (bak&DCB_HEX_TAB[x&0x07])!=0 ) *ret = 1;
    0A96 E788      LDI	R24,0x78
    0A97 E091      LDI	R25,1
    0A98 01FB      MOVW	R30,R22
    0A99 70E7      ANDI	R30,7
    0A9A 70F0      ANDI	R31,0
    0A9B 0FE8      ADD	R30,R24
    0A9C 1FF9      ADC	R31,R25
    0A9D 91E4      LPM	R30,0(Z)
    0A9E 2E24      MOV	R2,R20
    0A9F 222E      AND	R2,R30
    0AA0 F029      BEQ	0x0AA6
    0AA1 E081      LDI	R24,1
    0AA2 81EC      LDD	R30,Y+4
    0AA3 81FD      LDD	R31,Y+5
    0AA4 8380      STD	Z+0,R24
    0AA5 C004      RJMP	0x0AAA
(0417)       else  *ret = 0;
    0AA6 2422      CLR	R2
    0AA7 81EC      LDD	R30,Y+4
    0AA8 81FD      LDD	R31,Y+5
    0AA9 8220      STD	Z+0,R2
(0418)    
(0419)    return(1);
    0AAA E001      LDI	R16,1
    0AAB E010      LDI	R17,0
    0AAC 940E3B95  CALL	pop_gset2
    0AAE 9508      RET
_GUI_HLine:
  bak                  --> R14
  color                --> R12
  x1                   --> R10
  y0                   --> R22
  x0                   --> R20
    0AAF 940E3BA1  CALL	push_gset5
    0AB1 01B9      MOVW	R22,R18
    0AB2 01A8      MOVW	R20,R16
    0AB3 9721      SBIW	R28,1
    0AB4 84AB      LDD	R10,Y+11
    0AB5 84BC      LDD	R11,Y+12
    0AB6 84CD      LDD	R12,Y+13
(0420) }
(0421) 
(0422) 
(0423) /****************************************************************************
(0424) * 名称:GUI_HLine()
(0425) * 功能:画水平线。
(0426) * 入口参数: x0		水平线起点所在列的位置
(0427) *           y0		水平线起点所在行的位置
(0428) *           x1      水平线终点所在列的位置
(0429) *           color	显示颜色(对于黑白色LCM,为0时灭,为1时显示)
(0430) * 出口参数:无
(0431) * 说明:操作失败原因是指定地址超出缓冲区范围。
(0432) ****************************************************************************/
(0433) void  GUI_HLine(uint32 x0, uint32 y0, uint32 x1, uint8 color) 
(0434) {  uint32  bak;
(0435) 
(0436)    if(x0>x1) 						// 对x0、x1大小进行排列,以便画图
    0AB7 16A4      CP	R10,R20
    0AB8 06B5      CPC	R11,R21
    0AB9 F418      BCC	0x0ABD
(0437)    {  bak = x1;
    0ABA 0175      MOVW	R14,R10
(0438)       x1 = x0;
    0ABB 015A      MOVW	R10,R20
(0439)       x0 = bak;
    0ABC 01A7      MOVW	R20,R14
(0440)    }
(0441)    if(x0==x1)
    0ABD 154A      CP	R20,R10
    0ABE 055B      CPC	R21,R11
    0ABF F429      BNE	0x0AC5
(0442)    {  GUI_Point(x0, y0, color);
    0AC0 82C8      STD	Y+0,R12
    0AC1 019B      MOVW	R18,R22
    0AC2 018A      MOVW	R16,R20
    0AC3 DF52      RCALL	_GUI_Point
(0443)       return;
    0AC4 C097      RJMP	0x0B5C
(0444)    }
(0445)    
(0446)    do
(0447)    {  /* 设置相应的点为1 */
(0448)       if(0!=color) gui_disp_buf[y0][x0>>3] |= DCB_HEX_TAB[x0&0x07];
    0AC5 20CC      TST	R12
    0AC6 F101      BEQ	0x0AE7
    0AC7 E100      LDI	R16,0x10
    0AC8 E010      LDI	R17,0
    0AC9 019B      MOVW	R18,R22
    0ACA 940E3B85  CALL	empy16s
    0ACC 0118      MOVW	R2,R16
    0ACD E48E      LDI	R24,0x4E
    0ACE E091      LDI	R25,1
    0ACF 0E28      ADD	R2,R24
    0AD0 1E39      ADC	R3,R25
    0AD1 012A      MOVW	R4,R20
    0AD2 9456      LSR	R5
    0AD3 9447      ROR	R4
    0AD4 9456      LSR	R5
    0AD5 9447      ROR	R4
    0AD6 9456      LSR	R5
    0AD7 9447      ROR	R4
    0AD8 0C42      ADD	R4,R2
    0AD9 1C53      ADC	R5,R3
    0ADA E788      LDI	R24,0x78
    0ADB E091      LDI	R25,1
    0ADC 01FA      MOVW	R30,R20
    0ADD 70E7      ANDI	R30,7
    0ADE 70F0      ANDI	R31,0
    0ADF 0FE8      ADD	R30,R24
    0AE0 1FF9      ADC	R31,R25
    0AE1 91E4      LPM	R30,0(Z)
    0AE2 01D2      MOVW	R26,R4
    0AE3 902C      LD	R2,0(X)
    0AE4 2A2E      OR	R2,R30
    0AE5 922C      ST	R2,0(X)
    0AE6 C020      RJMP	0x0B07
(0449)          else  gui_disp_buf[y0][x0>>3] &= (~DCB_HEX_TAB[x0&0x07]);
    0AE7 E100      LDI	R16,0x10
    0AE8 E010      LDI	R17,0
    0AE9 019B      MOVW	R18,R22
    0AEA 940E3B85  CALL	empy16s
    0AEC 0118      MOVW	R2,R16
    0AED E48E      LDI	R24,0x4E
    0AEE E091      LDI	R25,1
    0AEF 0E28      ADD	R2,R24
    0AF0 1E39      ADC	R3,R25
    0AF1 012A      MOVW	R4,R20
    0AF2 9456      LSR	R5
    0AF3 9447      ROR	R4
    0AF4 9456      LSR	R5
    0AF5 9447      ROR	R4
    0AF6 9456      LSR	R5
    0AF7 9447      ROR	R4
    0AF8 0C42      ADD	R4,R2
    0AF9 1C53      ADC	R5,R3
    0AFA E788      LDI	R24,0x78
    0AFB E091      LDI	R25,1
    0AFC 01FA      MOVW	R30,R20
    0AFD 70E7      ANDI	R30,7
    0AFE 70F0      ANDI	R31,0
    0AFF 0FE8      ADD	R30,R24
    0B00 1FF9      ADC	R31,R25
    0B01 91E4      LPM	R30,0(Z)
    0B02 95E0      COM	R30
    0B03 01D2      MOVW	R26,R4
    0B04 902C      LD	R2,0(X)
    0B05 222E      AND	R2,R30
    0B06 922C      ST	R2,0(X)
(0450)       /* 刷新显示(一次刷新一字节) */
(0451)       if( (x0&0x07)==0x07 ) LCD_UpdatePoint(x0, y0);
    0B07 01CA      MOVW	R24,R20
    0B08 7087      ANDI	R24,7
    0B09 7090      ANDI	R25,0
    0B0A 3087      CPI	R24,7
    0B0B E0E0      LDI	R30,0
    0B0C 079E      CPC	R25,R30
    0B0D F419      BNE	0x0B11
    0B0E 019B      MOVW	R18,R22
    0B0F 018A      MOVW	R16,R20
    0B10 DE9E      RCALL	_LCD_UpdatePoint
(0452)       
(0453)       x0++;
    0B11 5F4F      SUBI	R20,0xFF
    0B12 4F5F      SBCI	R21,0xFF
(0454)    }while(x1>x0);
    0B13 154A      CP	R20,R10
    0B14 055B      CPC	R21,R11
    0B15 F408      BCC	0x0B17
    0B16 CFAE      RJMP	0x0AC5
(0455)    
(0456)    /* 对最后一点显示操作 */
(0457)    if(0!=color) gui_disp_buf[y0][x0>>3] |= DCB_HEX_TAB[x0&0x07];
    0B17 20CC      TST	R12
    0B18 F101      BEQ	0x0B39
    0B19 E100      LDI	R16,0x10
    0B1A E010      LDI	R17,0
    0B1B 019B      MOVW	R18,R22
    0B1C 940E3B85  CALL	empy16s
    0B1E 0118      MOVW	R2,R16
    0B1F E48E      LDI	R24,0x4E
    0B20 E091      LDI	R25,1
    0B21 0E28      ADD	R2,R24
    0B22 1E39      ADC	R3,R25
    0B23 012A      MOVW	R4,R20

⌨️ 快捷键说明

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