📄 128_lcd.lst
字号:
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 + -