📄 ks0108_12864lcd_m16.lst
字号:
585 9601 ADIW R24,1
586 018C MOVW R16,R24
587 3080 CPI R24,0
588 0789 CPC R24,R25
589 F791 BNE 0x057C
(0241) }
(0242) LCD_DATA_PORT_DIR = OUTPUT; // Set data PORT direction back to an output
58A EF8F LDI R24,0xFF
58B BB8A OUT 0x1A,R24
(0243) LCD_INSTR_PORT &= ~LCD_EN;
58C 9892 CBI 0x12,2
58D 9508 RET
KS0108_12864LCD.C:LCD_Send_Byte:
_LCD_Send_Byte:
IVERSE --> Y,+2
DATA_FLAG --> R12
DATA --> R10
58E 92AA ST R10,-Y
58F 92CA ST R12,-Y
590 2EC2 MOV R12,R18
591 2EA0 MOV R10,R16
(0244) }
(0245)
(0246) /*----------------------------------------------------------------------------*-
(0247)
(0248) LCD_Send_Byte()
(0249)
(0250) This function writes a byte to the LCD panel.
(0251)
(0252) Parameters:
(0253) ---------------------------------------------------------------------------
(0254) Data : The byte to be written to the LCD
(0255)
(0256) DATA_FLAG : If DATA_FLAG == 1, a data byte is sent
(0257) If DATA_FLAG == 0, a command byte is sent
(0258)
(0259) IVERSE : If IVERSE == 1, inverse video mode
(0260) If IVERSE == 0, normal video mode
(0261)
(0262) -*----------------------------------------------------------------------------*/
(0263) static void LCD_Send_Byte(uInt8 DATA, uInt8 DATA_FLAG, uInt8 IVERSE)
(0264) {
(0265) LCD_Read_Busy();
592 DFDC RCALL KS0108_12864LCD.C:LCD_Read_Busy
(0266)
(0267) LCD_INSTR_PORT |= LCD_EN;
593 9A92 SBI 0x12,2
(0268) asm("nop");
594 0000 NOP
(0269) asm("nop");
595 0000 NOP
(0270)
(0271) if (DATA_FLAG)
596 20CC TST R12
597 F011 BEQ 0x059A
(0272) LCD_INSTR_PORT |= LCD_DI; // Set data
598 9A90 SBI 0x12,0
599 C001 RJMP 0x059B
(0273) else
(0274) LCD_INSTR_PORT &= ~LCD_DI; // Set instruction
59A 9890 CBI 0x12,0
(0275)
(0276) LCD_INSTR_PORT &= ~LCD_RW; // Set write
59B 9891 CBI 0x12,1
(0277)
(0278) if (IVERSE && DATA_FLAG)
59C 800A LDD R0,Y+2
59D 2000 TST R0
59E F051 BEQ 0x05A9
59F 20CC TST R12
5A0 F041 BEQ 0x05A9
(0279) LCD_DATA_PORT = 255 - DATA; // Send inverse data
5A1 2C2A MOV R2,R10
5A2 2433 CLR R3
5A3 EF8F LDI R24,0xFF
5A4 E090 LDI R25,0
5A5 1982 SUB R24,R2
5A6 0993 SBC R25,R3
5A7 BB8B OUT 0x1B,R24
5A8 C001 RJMP 0x05AA
(0280) else
(0281) LCD_DATA_PORT = DATA; // Send data or instruction
5A9 BAAB OUT 0x1B,R10
(0282)
(0283) LCD_INSTR_PORT &= ~LCD_EN; // Toggle enable
5AA 9892 CBI 0x12,2
(0284) asm("nop");
5AB 0000 NOP
(0285) asm("nop");
5AC 0000 NOP
5AD 90C9 LD R12,Y+
5AE 90A9 LD R10,Y+
5AF 9508 RET
_LCD_Set_XY:
Y --> R20
X --> R22
KS0108_12864LCD.C:LCD_Set_XY:
5B0 934A ST R20,-Y
5B1 936A ST R22,-Y
5B2 2F42 MOV R20,R18
5B3 2F60 MOV R22,R16
5B4 9721 SBIW R28,1
(0286) }
(0287)
(0288) /*----------------------------------------------------------------------------*-
(0289)
(0290) LCD_Set_XY()
(0291)
(0292) Set the DDRAM to a particular address.
(0293)
(0294) Used to determine where we write to in the LCD RAM and - thus -
(0295) whether the text appears on Page 0, page 1, Column 0, Column 1, etc.
(0296)
(0297) Params (X, Y) : The DDRAM address we wish to write to.
(0298)
(0299) X range : (Page 0 ~ Page 7), Y range : (0 ~ 127)
(0300)
(0301) -*----------------------------------------------------------------------------*/
(0302) static void LCD_Set_XY(uInt8 X, uInt8 Y)
(0303) {
(0304) if (Y >= 64)
5B5 3440 CPI R20,0x40
5B6 F080 BCS 0x05C7
(0305) {
(0306) LCD_INSTR_PORT &= ~LCD_CS1; // Select right side
5B7 9894 CBI 0x12,4
(0307) LCD_INSTR_PORT |= LCD_CS2;
5B8 9A95 SBI 0x12,5
(0308) LCD_Send_Byte((DISPLAY_PAGE_SET + X), COMMAND, NORMAL); // Set page
5B9 2422 CLR R2
5BA 8228 STD Y+0,R2
5BB 2722 CLR R18
5BC 2F06 MOV R16,R22
5BD 5408 SUBI R16,0x48
5BE DFCF RCALL KS0108_12864LCD.C:LCD_Send_Byte
(0309) LCD_Send_Byte((DISPLAY_COLUMN_SET + Y - 64), COMMAND, NORMAL); // Set column
5BF 2422 CLR R2
5C0 8228 STD Y+0,R2
5C1 2722 CLR R18
5C2 2F04 MOV R16,R20
5C3 5C00 SUBI R16,0xC0
5C4 5400 SUBI R16,0x40
5C5 DFC8 RCALL KS0108_12864LCD.C:LCD_Send_Byte
(0310) }
5C6 C00E RJMP 0x05D5
(0311) else
(0312) {
(0313) LCD_INSTR_PORT |= LCD_CS1; // Select left side
5C7 9A94 SBI 0x12,4
(0314) LCD_INSTR_PORT &= ~LCD_CS2;
5C8 9895 CBI 0x12,5
(0315) LCD_Send_Byte((DISPLAY_PAGE_SET + X), COMMAND, NORMAL); // Set page
5C9 2422 CLR R2
5CA 8228 STD Y+0,R2
5CB 2722 CLR R18
5CC 2F06 MOV R16,R22
5CD 5408 SUBI R16,0x48
5CE DFBF RCALL KS0108_12864LCD.C:LCD_Send_Byte
(0316) LCD_Send_Byte((DISPLAY_COLUMN_SET + Y), COMMAND, NORMAL); // Set column
5CF 2422 CLR R2
5D0 8228 STD Y+0,R2
5D1 2722 CLR R18
5D2 2F04 MOV R16,R20
5D3 5C00 SUBI R16,0xC0
5D4 DFB9 RCALL KS0108_12864LCD.C:LCD_Send_Byte
(0317) }
5D5 9621 ADIW R28,1
5D6 9169 LD R22,Y+
5D7 9149 LD R20,Y+
5D8 9508 RET
_LCD_Disp_a_Char:
cl --> R20
Video_Mode --> Y,+11
Char_Value --> R22
Y --> R10
X --> R12
KS0108_12864LCD.C:LCD_Disp_a_Char:
5D9 940E 0719 CALL push_xgsetF03C
5DB 2EA2 MOV R10,R18
5DC 2EC0 MOV R12,R16
5DD 9721 SBIW R28,1
5DE 8569 LDD R22,Y+9
(0318) }
(0319)
(0320) /*----------------------------------------------------------------------------*-
(0321)
(0322) LCD_Disp_a_Char()
(0323)
(0324) Used to determine where we want to dispaly a char on the LCD panel
(0325) and - thus - whether the text appears on Page 0, page 1, Column 0,
(0326) Column 1, etc.
(0327)
(0328) Parameters:
(0329) ---------------------------------------------------------------------------
(0330) X : range (Page 0 ~ Page 7)
(0331) Y : range (0 ~ 127)
(0332) Params (X, Y) : The DDRAM address we wish to write to.
(0333)
(0334) Char_Value : The character value which's going to be displayed
(0335) on the LCD panel
(0336)
(0337) Video_Mode : If Video_Mode == INVERSE(1), inverse video mode
(0338) If Video_Mode == NORMAL(0), normal video mode
(0339)
(0340) -*----------------------------------------------------------------------------*/
(0341) static void LCD_Disp_a_Char(uInt8 X, uInt8 Y, uInt8 Char_Value,
(0342) uInt8 Video_Mode)
(0343) {
(0344) uInt8 cl;
(0345)
(0346) // Fine the char in the lookup table
(0347) // See "FONT6x8.C" for details
(0348) Char_Value -= 32;
5DF 5260 SUBI R22,0x20
(0349)
(0350) for (cl = 0; cl < 6; cl++)
5E0 2744 CLR R20
5E1 C015 RJMP 0x05F7
(0351) {
(0352) LCD_Set_XY(X, Y + cl);
5E2 2D2A MOV R18,R10
5E3 0F24 ADD R18,R20
5E4 2D0C MOV R16,R12
5E5 DFCA RCALL _LCD_Set_XY
(0353) LCD_Send_Byte(FONT6x8[Char_Value][cl], D_DATA, Video_Mode);
5E6 840B LDD R0,Y+11
5E7 8208 STD Y+0,R0
5E8 E021 LDI R18,1
5E9 E086 LDI R24,6
5EA 9F86 MUL R24,R22
5EB 0110 MOVW R2,R0
5EC E880 LDI R24,0x80
5ED E090 LDI R25,0
5EE 0E28 ADD R2,R24
5EF 1E39 ADC R3,R25
5F0 2FE4 MOV R30,R20
5F1 27FF CLR R31
5F2 0DE2 ADD R30,R2
5F3 1DF3 ADC R31,R3
5F4 9104 LPM R16,0(Z)
5F5 DF98 RCALL KS0108_12864LCD.C:LCD_Send_Byte
5F6 9543 INC R20
5F7 3046 CPI R20,6
5F8 F348 BCS 0x05E2
5F9 9621 ADIW R28,1
5FA 940C 0722 JMP pop_xgsetF03C
KS0108_12864LCD.C:LCD_Disp_String:
_LCD_Disp_String:
Video_Mode --> Y,+11
pString --> R20
Y --> R22
X --> R10
5FC 940E 070B CALL push_xgsetF00C
5FE 2F62 MOV R22,R18
5FF 2EA0 MOV R10,R16
600 9723 SBIW R28,3
601 8549 LDD R20,Y+9
602 855A LDD R21,Y+10
(0354) }
(0355) }
(0356)
(0357) /*----------------------------------------------------------------------------*-
(0358)
(0359) LCD_Disp_String()
(0360)
(0361) Used to determine where we want to dispaly a string on the LCD panel
(0362) and - thus - whether the text appears on Page 0, page 1, Column 0,
(0363) Column 1, etc.
(0364)
(0365) Parameters:
(0366) ---------------------------------------------------------------------------
(0367) X : range (Page 0 ~ Page 7)
(0368) Y : range (0 ~ 127)
(0369) Params (X, Y) : The DDRAM address we wish to write to.
(0370)
(0371) pString : The string pointer point out the string which's going to
(0372) be displayed on the LCD panel
(0373)
(0374) Video_Mode : If Video_Mode == INVERSE(1), inverse video mode
(0375) If Video_Mode == NORMAL(0), normal video mode
(0376)
(0377) -*----------------------------------------------------------------------------*/
(0378) static void LCD_Disp_String(uInt8 X, uInt8 Y, flash uInt8 * pString,
(0379) uInt8 Video_Mode)
(0380) {
603 C00B RJMP 0x060F
(0381) while (* pString)
(0382) {
(0383) LCD_Disp_a_Char(X, Y, * pString, Video_Mode);
604 840B LDD R0,Y+11
605 820A STD Y+2,R0
606 01FA MOVW R30,R20
607 9024 LPM R2,2(Z)
608 8228 STD Y+0,R2
609 2F26 MOV R18,R22
60A 2D0A MOV R16,R10
60B DFCD RCALL _LCD_Disp_a_Char
(0384) Y += 6; // Characters are 6x8 pixel
60C 5F6A SUBI R22,0xFA
(0385) pString++;
60D 5F4F SUBI R20,0xFF
60E 4F5F SBCI R21,0xFF
60F 01FA MOVW R30,R20
610 9024 LPM R2,255(Z)
611 2022 TST R2
612 F789 BNE 0x0604
613 9623 ADIW R28,3
614 940C 0712 JMP pop_xgsetF00C
_LCD_Disp_Chinese_String:
nm --> R10
cl --> R22
Video_Mode --> Y,+21
pCN_String --> Y,+19
Char_Gap --> Y,+17
Start_Char --> Y,+15
Char_Amount --> Y,+13
Char_Length --> R12
Y --> R14
X --> R20
KS0108_12864LCD.C:LCD_Disp_Chinese_String:
616 940E 06F6 CALL push_xgsetF0FC
618 2EE2 MOV R14,R18
619 2F40 MOV R20,R16
61A 9721 SBIW R28,1
61B 84CB LDD R12,Y+11
(0386) }
(0387) }
(0388)
(0389) /*----------------------------------------------------------------------------*-
(0390)
(0391) LCD_Disp_Chinese_String()
(0392)
(0393) Display a Chinese String on the LCD panel.
(0394)
(0395) Parameters:
(0396) ---------------------------------------------------------------------------
(0397) X, Y : The Chinese String start coordinates on the LCD panel
(0398)
(0399) Char_Length : The Chinese character's length (in pixel)
(0400) Char_Amount : The amount of Chinese characters
(0401) Start_Char : Which Chinese character should be display first in the array
(0402) Char_Gap : The space between on characters to another (in pixel)
(0403)
(0404) Video_Mode : If Video_Mode == INVERSE(1), inverse video mode
(0405) If Video_Mode == NORMAL(0), normal video mode
(0406)
(0407) -*----------------------------------------------------------------------------*/
(0408) static void LCD_Disp_Chinese_String (uInt8 X, uInt8 Y,
(0409) uInt8 Char_Length, uInt8 Char_Amount,
(0410) uInt8 Start_Char, uInt8 Char_Gap,
(0411) flash uInt8 (* pCN_String)[32],
(0412) uInt8 Video_Mode)
(0413) {
(0414) uInt8 cl, nm;
(0415)
(0416) for (nm = 0; nm < Char_Amount; )
61C 24AA CLR R10
61D C02F RJMP 0x064D
(0417) {
(0418) for (cl = 0; cl < Char_Length * 2; cl++) // Send a Chinese character
61E 2766 CLR R22
61F C023 RJMP 0x0643
(0419) {
(0420) if (cl >= Char_Length)
620 156C CP R22,R12
621 F038 BCS 0x0629
(0421) {
(0422) // Send below part of a Chinese character
(0423) LCD_Set_XY(X + 1, Y + cl - Char_Length);
622 2D2E MOV R18,R14
623 0F26 ADD R18,R22
624 192C SUB R18,R12
625 2F04 MOV R16,R20
626 5F0F SUBI R16,0xFF
627 DF88 RCALL _LCD_Set_XY
(0424) }
628 C004 RJMP 0x062D
(0425) else
(0426) {
(0427) // Set coordinates
(0428) LCD_Set_XY(X, Y + cl);
629 2D2E MOV R18,R14
62A 0F26 ADD R18,R22
62B 2F04 MOV R16,R20
62C DF83 RCALL _LCD_Set_XY
(0429) }
(0430)
(0431) LCD_Send_Byte(* (* (pCN_String + Start_Char + nm)+ cl),
62D 880D LDD R0,Y+21
62E 8208 STD Y+0,R0
62F E021 LDI R18,1
630 E280 LDI R24,0x20
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -