📄 lcd1286418.lst
字号:
5F8 DF10 RCALL _LcdWrCmd
(0319) LcdWrCmd('L',0XB8+temp1); /* SET PAGE */
5F9 2F26 MOV R18,R22
5FA 5428 SUBI R18,0x48
5FB E40C LDI R16,0x4C
5FC DF0C RCALL _LcdWrCmd
(0320) LcdWrCmd('L',0X40+x); /* SET X */
5FD 852A LDD R18,Y+10
5FE 5C20 SUBI R18,0xC0
5FF E40C LDI R16,0x4C
600 DF08 RCALL _LcdWrCmd
(0321) a = LcdRdDat('L'); /* READ NOW SEGMENT VALUE */
601 E40C LDI R16,0x4C
602 DF59 RCALL _LcdRdDat
(0322) a = LcdRdDat('L');
603 E40C LDI R16,0x4C
604 DF57 RCALL _LcdRdDat
605 2EA0 MOV R10,R16
(0323) if(data == 0) /* DOT ON/OFF */
606 20EE TST R14
607 F431 BNE 0x060E
608 940E 16A3 CALL 0x16A3
(0324) a&=~(1<<temp2);
60A 2E20 MOV R2,R16
60B 9420 COM R2
60C 20A2 AND R10,R2
60D C01F RJMP 0x062D
(0325) else
(0326) a|=(1<<temp2);
60E 940E 16A3 CALL 0x16A3
610 2AA0 OR R10,R16
(0327) }
611 C01B RJMP 0x062D
(0328) else
(0329) {
(0330) LcdWrCmd('R',0XC0); /* SET ROW */
612 EC20 LDI R18,0xC0
613 E502 LDI R16,0x52
614 DEF4 RCALL _LcdWrCmd
(0331) LcdWrCmd('R',0XB8+temp1); /* SET PAGE */
615 2F26 MOV R18,R22
616 5428 SUBI R18,0x48
617 E502 LDI R16,0x52
618 DEF0 RCALL _LcdWrCmd
619 940E 1776 CALL 0x1776
(0332) LcdWrCmd('R',0X40+x-64); /* SET X*/
61B DEED RCALL _LcdWrCmd
(0333) a = LcdRdDat('R'); /* READ NOW SEGMENT VALUE */
61C E502 LDI R16,0x52
61D DF3E RCALL _LcdRdDat
(0334) a = LcdRdDat('R');
61E E502 LDI R16,0x52
61F DF3C RCALL _LcdRdDat
620 2F40 MOV R20,R16
621 2EA4 MOV R10,R20
(0335) if(data == 0) /* DOT ON/OFF */
622 20EE TST R14
623 F431 BNE 0x062A
624 940E 16A3 CALL 0x16A3
(0336) a&=~(1<<temp2);
626 2E20 MOV R2,R16
627 9420 COM R2
628 20A2 AND R10,R2
629 C003 RJMP 0x062D
(0337) else
(0338) a|=(1<<temp2);
62A 940E 16A3 CALL 0x16A3
62C 2AA0 OR R10,R16
(0339) }
(0340)
(0341) if(x < 64) /* WRITE VALUE AS SEGMENT */
62D 858A LDD R24,Y+10
62E 3480 CPI R24,0x40
62F F478 BCC 0x063F
(0342) {
(0343) //LcdWrCmd('L',0X3F); /* LCD ON */
(0344) LcdWrCmd('L',0XC0); /* SET ROW */
630 EC20 LDI R18,0xC0
631 E40C LDI R16,0x4C
632 DED6 RCALL _LcdWrCmd
(0345) LcdWrCmd('L',0XB8+temp1); /* SET PAGE */
633 2F26 MOV R18,R22
634 5428 SUBI R18,0x48
635 E40C LDI R16,0x4C
636 DED2 RCALL _LcdWrCmd
(0346) LcdWrCmd('L',0X40+x); /* SET X */
637 852A LDD R18,Y+10
638 5C20 SUBI R18,0xC0
639 E40C LDI R16,0x4C
63A DECE RCALL _LcdWrCmd
(0347) LcdWrDat('L',a); /* WRITE SEGMENT */
63B 2D2A MOV R18,R10
63C E40C LDI R16,0x4C
63D DEEC RCALL _LcdWrDat
(0348) }
63E C00D RJMP 0x064C
(0349) else
(0350) {
(0351) //LcdWrCmd('R',0X3F); /* LCD ON */
(0352) LcdWrCmd('R',0XC0); /* SET ROW */
63F EC20 LDI R18,0xC0
640 E502 LDI R16,0x52
641 DEC7 RCALL _LcdWrCmd
(0353) LcdWrCmd('R',0XB8+temp1); /* SET PAGE */
642 2F26 MOV R18,R22
643 5428 SUBI R18,0x48
644 E502 LDI R16,0x52
645 DEC3 RCALL _LcdWrCmd
646 940E 1776 CALL 0x1776
(0354) LcdWrCmd('R',0X40+x-64); /* SET X*/
648 DEC0 RCALL _LcdWrCmd
(0355) LcdWrDat('R',a); /* WRITE SEGMENT */
649 2D2A MOV R18,R10
64A E502 LDI R16,0x52
64B DEDE RCALL _LcdWrDat
(0356) }
64C 940E 10B2 CALL pop_xgsetF0FC
64E 9624 ADIW R28,4
64F 9508 RET
_LcdDsiplayRefresh:
temp1 --> R20
temp2 --> R22
650 934A ST R20,-Y
651 936A ST R22,-Y
652 9721 SBIW R28,1
(0357) }
(0358)
(0359) /*******************************************************
(0360) * FUNCTION NAME: LcdDsiplayRefresh *
(0361) * DESCRIPTION: 显示内容写入单片机RAM中,再LCD上显示 *
(0362) * 为了提高3D图形显示速度。
(0363) /******************************************************/
(0364) void LcdDsiplayRefresh(void)
(0365) {
(0366) unsigned char temp1,temp2;
(0367) for(temp1=0; temp1<8; temp1++)
653 2744 CLR R20
654 C013 RJMP 0x0668
(0368) {
(0369) for(temp2=0; temp2<128; temp2++)
655 2766 CLR R22
656 C00E RJMP 0x0665
(0370) {
(0371) LcdDisplaySeg(temp1,temp2,displaybuffer[temp1][temp2]);
657 E880 LDI R24,0x80
658 9F84 MUL R24,R20
659 940E 1645 CALL 0x1645
65B 2FE6 MOV R30,R22
65C 27FF CLR R31
65D 0DE2 ADD R30,R2
65E 1DF3 ADC R31,R3
65F 8020 LDD R2,Z+0
660 8228 STD Y+0,R2
661 2F26 MOV R18,R22
662 2F04 MOV R16,R20
663 DF44 RCALL _LcdDisplaySeg
664 9563 INC R22
665 3860 CPI R22,0x80
666 F380 BCS 0x0657
667 9543 INC R20
668 3048 CPI R20,0x8
669 F358 BCS 0x0655
66A 9621 ADIW R28,1
66B 9169 LD R22,Y+
66C 9149 LD R20,Y+
66D 9508 RET
(0372) }
(0373) }
(0374) }
(0375)
(0376) /****************************************
(0377) * FUNCTION NAME: Delay1ms *
(0378) * DESCRIPTION: MCU CLOCK=11.0592Mhz *
(0379) /***************************************/
(0380) void Delay1ms(void)
(0381) {
(0382) unsigned int temp;
(0383) unsigned char i;
(0384) for(i=0;i<10;i++)
_Delay1ms:
i --> R16
temp --> R18
66E 2700 CLR R16
66F C004 RJMP 0x0674
(0385) {
(0386) for(temp=20; temp>0;temp--) /* Delay About 1ms */
670 E124 LDI R18,0x14
671 E030 LDI R19,0
672 940E 169A CALL 0x169A
674 300A CPI R16,0xA
675 F3D0 BCS 0x0670
676 9508 RET
_GuiDrawLine:
signy --> R14
signx --> R12
dy --> R22
dx --> Y,+4
temp --> R20
y --> Y,+3
x --> Y,+2
p --> R10
color --> Y,+24
y2 --> Y,+22
x2 --> Y,+20
y1 --> R10
x1 --> Y,+16
677 940E 16A8 CALL 0x16A8
679 2EA2 MOV R10,R18
67A 9726 SBIW R28,6
FILE: F:\CODE\LCD1286418\gui12864.c
(0001) /***********************************************************************************************
(0002) * FILE NAME: gui12864.c
(0003) * PURPOSE: lcd1286418 GUI Firmware
(0004) * DESCRIPTION: ONLY FOR 128*64 PIXEL LCD
(0005) * DEVELOPMENT HISTORY:
(0006) * Date Author Release Description Of Change
(0007) * -------- ------------ --------- ------------------------------------------------
(0008) * 08-04-11 XuGuohong 1.0 Testing Edition
(0009) /**********************************************************************************************/
(0010)
(0011) /* Include Global Parameters */
(0012) #include <iom128v.h>
(0013) #include "avr.h"
(0014) #include "gui12864.h"
(0015)
(0016) /* Include Global Parameters */
(0017)
(0018)
(0019) /* Declare Prototypes */
(0020) void GuiDrawLine(unsigned char,unsigned char,unsigned char,unsigned char,unsigned char);
(0021) void GuiDrawCircle(unsigned char,unsigned char,unsigned char,unsigned char);
(0022) void GuiDrawSquare(unsigned char,unsigned char,unsigned char,unsigned char,unsigned char);
(0023) void GuiDisCharF3(unsigned char,unsigned char,unsigned char,unsigned char);
(0024) void GuiDisStringF3(unsigned char,unsigned char,unsigned char *,unsigned char);
(0025) //void GuiDisCharF2(unsigned char,unsigned char,unsigned char,unsigned char);
(0026) //void GuiDisCharF1(unsigned char,unsigned char,unsigned char,unsigned char);
(0027) void GuiDisLogo(unsigned char);
(0028) void GuiDisRoolStringF3(unsigned char,unsigned char,unsigned char,unsigned char *,unsigned char);
(0029) void GuiDisBattery(unsigned char,unsigned char,unsigned char);
(0030) void GuiDisUsb(unsigned char,unsigned char);
(0031) void GuiDisAcin(unsigned char,unsigned char);
(0032) void GuiDisTemp(unsigned char,unsigned char,signed char);
(0033) void GuiDisShortIcon(unsigned char,unsigned char,unsigned char);
(0034) void GuiDisMainMenu(void);
(0035) void GuiDisMenuIcon(unsigned char,unsigned char,unsigned char);
(0036)
(0037) /*****************************************
(0038) * FUNCTION NAME: GuiDrawLine
(0039) * DESCRIPTION: Draw A Line From Between
(0040) * Any 2-Point
(0041) * (x1,y1) as start point
(0042) * (x2,y2) as end point
(0043) * Based On "Breshenham Line"
(0044) /*****************************************/
(0045) void GuiDrawLine(unsigned char x1, unsigned char y1, unsigned char x2, unsigned char y2, unsigned char color)
(0046) {
(0047) unsigned char temp;
(0048) int p; /* p-取值判断因子 */
(0049) unsigned char x; /* x-坐标 */
(0050) unsigned char y; /* y-坐标 */
(0051) int dx; /* x方向差值 */
(0052) int dy; /* y方向差值 */
(0053) char signx; /* x方向标识 */
(0054) char signy; /* Y方向标识 */
(0055) if(x1>123 | y1>63 | x2>123 | y2>63)
67B E78B LDI R24,0x7B
67C 8808 LDD R0,Y+16
67D 940E 1568 CALL 0x1568
67F 880C LDD R0,Y+20
680 1580 CP R24,R0
681 940E 15CF CALL 0x15CF
683 880E LDD R0,Y+22
684 1580 CP R24,R0
685 F418 BCC 0x0689
686 E041 LDI R20,1
687 E050 LDI R21,0
688 C002 RJMP 0x068B
689 2744 CLR R20
68A 2755 CLR R21
68B 0117 MOVW R2,R14
68C 282C OR R2,R12
68D 283D OR R3,R13
68E 2A26 OR R2,R22
68F 2A37 OR R3,R23
690 2A24 OR R2,R20
691 2A35 OR R3,R21
692 2022 TST R2
693 F411 BNE 0x0696
694 2033 TST R3
695 F009 BEQ 0x0697
(0056) return;
696 C097 RJMP 0x072E
(0057) x = x1;
697 8808 LDD R0,Y+16
698 820A STD Y+2,R0
(0058) y = y1;
699 82AB STD Y+3,R10
(0059) /* 1.计算X方向的参数 */
(0060) if(x2 > x1)
69A 8828 LDD R2,Y+16
69B 2433 CLR R3
69C 884C LDD R4,Y+20
69D 2455 CLR R5
69E 1424 CP R2,R4
69F 0435 CPC R3,R5
6A0 F44C BGE 0x06AA
(0061) {
(0062) dx = x2 - x1;
6A1 2433 CLR R3
6A2 2455 CLR R5
6A3 1842 SUB R4,R2
6A4 0853 SBC R5,R3
6A5 825D STD Y+5,R5
6A6 824C STD Y+4,R4
(0063) signx = 1;
6A7 24CC CLR R12
6A8 94C3 INC R12
(0064) }
6A9 C010 RJMP 0x06BA
(0065) else if(x2 < x1)
6AA 880C LDD R0,Y+20
6AB 8908 LDD R16,Y+16
6AC 1600 CP R0,R16
6AD F438 BCC 0x06B5
6AE 940E 16D9 CALL 0x16D9
(0066) {
(0067) dx = x1 - x2;
6B0 825D STD Y+5,R5
6B1 824C STD Y+4,R4
(0068) signx = -1;
6B2 EF8F LDI R24,0xFF
6B3 2EC8 MOV R12,R24
(0069) }
6B4 C005 RJMP 0x06BA
(0070) else
(0071) {
(0072) dx = 0;
6B5 2400 CLR R0
6B6 2411 CLR R1
6B7 821D STD Y+5,R1
6B8 820C STD Y+4,R0
(0073) signx = 0;
6B9 24CC CLR R12
(0074) }
(0075) /* 2.计算Y方向的参数 */
(0076) if(y2 > y1)
6BA 2C2A MOV R2,R10
6BB 2433 CLR R3
6BC 884E LDD R4,Y+22
6BD 2455 CLR R5
6BE 1424 CP R2,R4
6BF 0435 CPC R3,R5
6C0 F444 BGE 0x06C9
(0077) {
(0078) dy = y2 - y1;
6C1 2433 CLR R3
6C2 2D64 MOV R22,R4
6C3 2777 CLR R23
6C4 1962 SUB R22,R2
6C5 0973 SBC R23,R3
(0079) signy = 1;
6C6 24EE CLR R14
6C7 94E3 INC R14
(0080) }
6C8 C00F RJMP 0x06D8
(0081) else if(y2 < y1)
6C9 880E LDD R0,Y+22
6CA 140A CP R0,R10
6CB F448 BCC 0x06D5
(0082) {
(0083) dy = y1 - y2;
6CC 2C20 MOV R2,R0
6CD 2433 CLR R3
6CE 2D6A MOV R22,R10
6CF 2777 CLR R23
6D0 1962 SUB R22,R2
6D1 0973 SBC R23,R3
(0084) signy = -1;
6D2 EF8F LDI R24,0xFF
6D3 2EE8 MOV R14,R24
(0085) }
6D4 C003 RJMP 0x06D8
(0086) else
(0087) {
(0088) dy = 0;
6D5 2766 CLR R22
6D6 2777 CLR R23
(0089) signy = 0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -