📄 lcd1286418.lst
字号:
(0133) ClrBit(LCDPORTCS2,LCDCS2);
53A 981B CBI 0x03,3
(0134) }
(0135) NOP; /* DELAY AT LEAST 140ns */
53B 0000 NOP
(0136) NOP;
53C 0000 NOP
(0137) SetBit(LCDPORTEN,LCDEN); /* EN = 1 */
53D 9AC3 SBI 0x18,3
53E 940E 15B4 CALL 0x15B4
(0138) NOP; /* DELAY AT LEAST 450ns */
(0139) NOP;
(0140) NOP;
(0141) NOP;
(0142) NOP;
540 0000 NOP
(0143) LCDDDRDATA = 0XFF; /* WRITE DATA TO LCD */
541 EF8F LDI R24,0xFF
542 9380 0061 STS 0x0061,R24
(0144) LCDPORTDATA = data;
544 92A0 0062 STS 0x0062,R10
546 940E 163A CALL 0x163A
(0145) ClrBit(LCDPORTEN,LCDEN); /* EN = 0 */
(0146) NOP; /* DELAY AT LEAST 10ns */
(0147) SetBit(LCDPORTCS1,LCDCS1); /* CHIP DISABLE */
(0148) SetBit(LCDPORTCS2,LCDCS2);
(0149) NOP;
548 9149 LD R20,Y+
549 90A9 LD R10,Y+
54A 9508 RET
_LcdRdSta:
temp --> R10
chiplr --> R16
54B 92AA ST R10,-Y
(0150) }
(0151)
(0152) /*****************************************
(0153) * FUNCTION NAME: LcdRdSta
(0154) * DESCRIPTION: Read Status From LCD
(0155) /*****************************************/
(0156) unsigned char LcdRdSta(unsigned char chiplr)
(0157) {
(0158) unsigned char temp;
(0159) ClrBit(LCDPORTRS,LCDRS); /* RS = 0 ,COMMAND */
54C 98C2 CBI 0x18,2
(0160) SetBit(LCDPORTRW,LCDRW); /* RW = 1 ,READ */
54D 9A1C SBI 0x03,4
(0161) if(chiplr == 'L') /* CS = 0 ,CHIP SELECT */
54E 340C CPI R16,0x4C
54F F411 BNE 0x0552
(0162) ClrBit(LCDPORTCS1,LCDCS1);
550 981A CBI 0x03,2
551 C006 RJMP 0x0558
(0163) else if(chiplr == 'R')
552 3502 CPI R16,0x52
553 F411 BNE 0x0556
(0164) ClrBit(LCDPORTCS2,LCDCS2);
554 981B CBI 0x03,3
555 C002 RJMP 0x0558
(0165) else
(0166) {
(0167) ClrBit(LCDPORTCS1,LCDCS1);
556 981A CBI 0x03,2
(0168) ClrBit(LCDPORTCS2,LCDCS2);
557 981B CBI 0x03,3
(0169) }
(0170) NOP; /* DELAY AT LEAS;T 140ns */
558 940E 1555 CALL 0x1555
(0171) NOP;
(0172) SetBit(LCDPORTEN,LCDEN); /* EN = 1 */
(0173) NOP; /* DELAY AT LEAST 450ns */
(0174) NOP;
(0175) NOP;
(0176) NOP;
(0177) NOP;
(0178) LCDDDRDATA = 0X00; /* READ DATA FROM LCD */
(0179) temp = LCDPINDATA;
(0180) ClrBit(LCDPORTEN,LCDEN); /* EN = 0 */
(0181) NOP; /* DELAY AT LEAST 10ns */
(0182) SetBit(LCDPORTCS1,LCDCS1); /* CHIP DISABLE */
(0183) SetBit(LCDPORTCS2,LCDCS2);
(0184) NOP;
(0185) return temp;
55A 90A9 LD R10,Y+
55B 9508 RET
_LcdRdDat:
temp --> R10
chiplr --> R20
55C 92AA ST R10,-Y
55D 934A ST R20,-Y
55E 2F40 MOV R20,R16
(0186) }
(0187)
(0188) /*****************************************
(0189) * FUNCTION NAME: LcdRdDat
(0190) * DESCRIPTION: Read Data From LCD
(0191) /*****************************************/
(0192) unsigned char LcdRdDat(unsigned char chiplr)
(0193) {
(0194) unsigned char temp;
(0195) while(LcdBusy() == 0) /* IF LCD BUSY,WAIT... */
55F D013 RCALL _LcdBusy
560 2300 TST R16
561 F3E9 BEQ 0x055F
(0196) ;
(0197) SetBit(LCDPORTRS,LCDRS); /* RS = 1 ,DATA */
562 9AC2 SBI 0x18,2
(0198) SetBit(LCDPORTRW,LCDRW); /* RW = 1 ,READ */
563 9A1C SBI 0x03,4
(0199) if(chiplr == 'L') /* CS = 0 ,CHIP SELECT */
564 344C CPI R20,0x4C
565 F411 BNE 0x0568
(0200) ClrBit(LCDPORTCS1,LCDCS1);
566 981A CBI 0x03,2
567 C006 RJMP 0x056E
(0201) else if(chiplr == 'R')
568 3542 CPI R20,0x52
569 F411 BNE 0x056C
(0202) ClrBit(LCDPORTCS2,LCDCS2);
56A 981B CBI 0x03,3
56B C002 RJMP 0x056E
(0203) else
(0204) {
(0205) ClrBit(LCDPORTCS1,LCDCS1);
56C 981A CBI 0x03,2
(0206) ClrBit(LCDPORTCS2,LCDCS2);
56D 981B CBI 0x03,3
(0207) }
(0208) NOP; /* DELAY AT LEAS;T 140ns */
56E 940E 1555 CALL 0x1555
(0209) NOP;
(0210) SetBit(LCDPORTEN,LCDEN); /* EN = 1 */
(0211) NOP; /* DELAY AT LEAST 450ns */
(0212) NOP;
(0213) NOP;
(0214) NOP;
(0215) NOP;
(0216) LCDDDRDATA = 0X00; /* READ DATA FROM LCD */
(0217) temp = LCDPINDATA;
(0218) ClrBit(LCDPORTEN,LCDEN); /* EN = 0 */
(0219) NOP; /* DELAY AT LEAST 10ns */
(0220) SetBit(LCDPORTCS1,LCDCS1); /* CHIP DISABLE */
(0221) SetBit(LCDPORTCS2,LCDCS2);
(0222) NOP;
(0223) return temp;
570 9149 LD R20,Y+
571 90A9 LD R10,Y+
572 9508 RET
_LcdBusy:
temp2 --> R20
temp1 --> R22
573 934A ST R20,-Y
574 936A ST R22,-Y
(0224) }
(0225)
(0226) /*****************************************
(0227) * FUNCTION NAME: LcdBusy
(0228) * DESCRIPTION: LCD BUSY OR NOT
(0229) * BUSY-RETURN 0
(0230) * NOT BUSY-RETURN 1
(0231) /*****************************************/
(0232) unsigned char LcdBusy(void)
(0233) {
(0234) unsigned char temp1,temp2;
(0235) temp1 = LcdRdSta('L'); /* READ LCD STA. */
575 E40C LDI R16,0x4C
576 DFD4 RCALL _LcdRdSta
577 2F60 MOV R22,R16
(0236) temp1 = temp1&0X80;
578 7860 ANDI R22,0x80
(0237) temp2 = LcdRdSta('R');
579 E502 LDI R16,0x52
57A DFD0 RCALL _LcdRdSta
57B 2F40 MOV R20,R16
(0238) temp2 = temp2&0X80;
57C 7840 ANDI R20,0x80
(0239) if(temp1|temp2)
57D 2E26 MOV R2,R22
57E 2A24 OR R2,R20
57F F011 BEQ 0x0582
(0240) return 0;
580 2700 CLR R16
581 C001 RJMP 0x0583
(0241) else
(0242) return 1;
582 E001 LDI R16,1
583 9169 LD R22,Y+
584 9149 LD R20,Y+
585 9508 RET
_LcdClr:
count --> R20
temp --> R22
586 934A ST R20,-Y
587 936A ST R22,-Y
(0243) }
(0244)
(0245) /*****************************************
(0246) * FUNCTION NAME: LcdClr
(0247) * DESCRIPTION: CLEAR LCD
(0248) /*****************************************/
(0249) void LcdClr(void)
(0250) {
(0251) unsigned char count;
(0252) unsigned char temp;
(0253) /* CLEAR LEFT&RIGHT SCREEN */
(0254) LcdWrCmd('B',0X3E); /* LCD OFF */
588 E32E LDI R18,0x3E
589 E402 LDI R16,0x42
58A DF7E RCALL _LcdWrCmd
(0255) LcdWrCmd('B',0XC0); /* SET ROW */
58B EC20 LDI R18,0xC0
58C E402 LDI R16,0x42
58D DF7B RCALL _LcdWrCmd
(0256) for(count=0; count<8; count++)
58E 2744 CLR R20
58F C010 RJMP 0x05A0
(0257) {
(0258) LcdWrCmd('B',0XB8+count); /* SET PAGE */
590 2F24 MOV R18,R20
591 5428 SUBI R18,0x48
592 E402 LDI R16,0x42
593 DF75 RCALL _LcdWrCmd
(0259) LcdWrCmd('B',0X40); /* SET Y */
594 E420 LDI R18,0x40
595 E402 LDI R16,0x42
596 DF72 RCALL _LcdWrCmd
(0260) for(temp=0; temp<64; temp++)
597 2766 CLR R22
598 C004 RJMP 0x059D
(0261) {
(0262) LcdWrDat('B',0X00);
599 2722 CLR R18
59A E402 LDI R16,0x42
59B DF8E RCALL _LcdWrDat
59C 9563 INC R22
59D 3460 CPI R22,0x40
59E F3D0 BCS 0x0599
59F 9543 INC R20
5A0 3048 CPI R20,0x8
5A1 F370 BCS 0x0590
(0263) }
(0264) }
(0265) LcdWrCmd('B',0X3F); /* LCD ON */
5A2 E32F LDI R18,0x3F
5A3 E402 LDI R16,0x42
5A4 DF64 RCALL _LcdWrCmd
5A5 9169 LD R22,Y+
5A6 9149 LD R20,Y+
5A7 9508 RET
_LcdDisplaySeg:
data --> R10
offset --> R20
page --> R22
5A8 940E 10D2 CALL push_xgsetF00C
5AA 2F42 MOV R20,R18
5AB 2F60 MOV R22,R16
5AC 80AE LDD R10,Y+6
(0266) }
(0267)
(0268) /*****************************************
(0269) * FUNCTION NAME: LcdDisplaySeg
(0270) * DESCRIPTION: DISPLAY 8-BIT SEGMENT
(0271) * <---------offset 0 to 127----------->
(0272) * page0
(0273) * |
(0274) * page7
(0275) * <---------offset 0 to 127----------->
(0276) /*****************************************/
(0277) void LcdDisplaySeg(unsigned char page,unsigned char offset,unsigned char data)
(0278) {
(0279) /* Display at Left Part */
(0280) if(offset < 64)
5AD 3440 CPI R20,0x40
5AE F478 BCC 0x05BE
(0281) {
(0282) //LcdWrCmd('L',0X3F); /* LCD ON */
(0283) LcdWrCmd('L',0XC0); /* SET ROW */
5AF EC20 LDI R18,0xC0
5B0 E40C LDI R16,0x4C
5B1 DF57 RCALL _LcdWrCmd
(0284) LcdWrCmd('L',0XB8+page); /* SET PAGE */
5B2 2F26 MOV R18,R22
5B3 5428 SUBI R18,0x48
5B4 E40C LDI R16,0x4C
5B5 DF53 RCALL _LcdWrCmd
(0285) LcdWrCmd('L',0X40+offset); /* SET Y */
5B6 2F24 MOV R18,R20
5B7 5C20 SUBI R18,0xC0
5B8 E40C LDI R16,0x4C
5B9 DF4F RCALL _LcdWrCmd
(0286) LcdWrDat('L',data); /* WRITE SEGMENT */
5BA 2D2A MOV R18,R10
5BB E40C LDI R16,0x4C
5BC DF6D RCALL _LcdWrDat
(0287) }
5BD C012 RJMP 0x05D0
(0288) else
(0289) {
(0290) LcdWrCmd('R',0X3F); /* LCD ON */
5BE E32F LDI R18,0x3F
5BF E502 LDI R16,0x52
5C0 DF48 RCALL _LcdWrCmd
(0291) LcdWrCmd('R',0XC0); /* SET ROW */
5C1 EC20 LDI R18,0xC0
5C2 E502 LDI R16,0x52
5C3 DF45 RCALL _LcdWrCmd
(0292) LcdWrCmd('R',0XB8+page); /* SET PAGE */
5C4 2F26 MOV R18,R22
5C5 5428 SUBI R18,0x48
5C6 E502 LDI R16,0x52
5C7 DF41 RCALL _LcdWrCmd
(0293) LcdWrCmd('R',0X40+offset-64); /* SET Y */
5C8 2F24 MOV R18,R20
5C9 5C20 SUBI R18,0xC0
5CA 5420 SUBI R18,0x40
5CB E502 LDI R16,0x52
5CC DF3C RCALL _LcdWrCmd
(0294) LcdWrDat('R',data); /* WRITE SEGMENT */
5CD 2D2A MOV R18,R10
5CE E502 LDI R16,0x52
5CF DF5A RCALL _LcdWrDat
(0295) }
5D0 940C 10D7 JMP pop_xgsetF00C
_LcdDisplayDot:
temp2 --> R12
temp1 --> R22
a --> R10
data --> R14
y --> R10
x --> Y,+10
5D2 940E 16A8 CALL 0x16A8
5D4 2EA2 MOV R10,R18
5D5 84EE LDD R14,Y+14
(0296) }
(0297)
(0298) /************************************************
(0299) * FUNCTION NAME: LcdDisplayDot
(0300) * DESCRIPTION: DISPLAY 1-BIT DOT
(0301) * 不在单片机里面开设缓存,直接修改LCD的RAM后显示
(0302) * <---------offset 0 to 127----------->
(0303) * 0
(0304) * |
(0305) * 64
(0306) * <---------offset 0 to 127----------->
(0307) /*************************************************/
(0308) void LcdDisplayDot(unsigned char x,unsigned char y,unsigned char data)
(0309) {
(0310) unsigned char temp1,temp2,a;
(0311) if(x>127 | y>63)
5D6 E78F LDI R24,0x7F
5D7 840A LDD R0,Y+10
5D8 1580 CP R24,R0
5D9 940E 15CF CALL 0x15CF
5DB 158A CP R24,R10
5DC F418 BCC 0x05E0
5DD E041 LDI R20,1
5DE E050 LDI R21,0
5DF C002 RJMP 0x05E2
5E0 2744 CLR R20
5E1 2755 CLR R21
5E2 011B MOVW R2,R22
5E3 2A24 OR R2,R20
5E4 2A35 OR R3,R21
5E5 2022 TST R2
5E6 F411 BNE 0x05E9
5E7 2033 TST R3
5E8 F009 BEQ 0x05EA
(0312) return;
5E9 C062 RJMP 0x064C
(0313) temp1 = y / 8; /* GET VALUE OF WHICH PAGE */
5EA 2D6A MOV R22,R10
5EB 9566 LSR R22
5EC 9566 LSR R22
5ED 9566 LSR R22
(0314) temp2 = y % 8; /* GET VALUE OF WHICH Y-OFFSET */
5EE E018 LDI R17,0x8
5EF 2D0A MOV R16,R10
5F0 940E 1076 CALL mod8u
5F2 2EC0 MOV R12,R16
(0315) /* IN ORDER TO NOT MODFIY NOW DISPLY VALUE */
(0316) if(x < 64) /* GET PRE. SEGMENT VALUE */
5F3 858A LDD R24,Y+10
5F4 3480 CPI R24,0x40
5F5 F4E0 BCC 0x0612
(0317) {
(0318) LcdWrCmd('L',0XC0); /* SET ROW */
5F6 EC20 LDI R18,0xC0
5F7 E40C LDI R16,0x4C
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -