📄 12864_example.lst
字号:
(0163)
(0164) sendCommandToLCD(X);
03B7 2F04 MOV R16,R20
03B8 DFBF RCALL _sendCommandToLCD
03B9 940E0542 CALL pop_gset1
03BB 9508 RET
_setY:
Y --> R20
03BC 940E053F CALL push_gset1
03BE 2F40 MOV R20,R16
(0165) }
(0166)
(0167) /********************************************************
(0168) * 函数说明:设置显示行(竖向) *
(0169) * 输入: 行号(0~127) *
(0170) ********************************************************/
(0171) void setY(char Y)
(0172) {
(0173) Y &= 0x3f;
03BF 734F ANDI R20,0x3F
(0174) Y |= 0x40;
03C0 6440 ORI R20,0x40
(0175)
(0176) sendCommandToLCD(Y);
03C1 2F04 MOV R16,R20
03C2 DFB5 RCALL _sendCommandToLCD
03C3 940E0542 CALL pop_gset1
03C5 9508 RET
_setStartLine:
Y --> R20
03C6 940E053F CALL push_gset1
03C8 2F40 MOV R20,R16
(0177) }
(0178)
(0179) /********************************************************
(0180) * 函数说明:设置起始扫描行(竖向) *
(0181) * 输入: 行号(0~63) *
(0182) ********************************************************/
(0183) void setStartLine(char Y)
(0184) {
(0185) Y &= 0x07;
03C9 7047 ANDI R20,7
(0186) Y |= 0xc0;
03CA 6C40 ORI R20,0xC0
(0187)
(0188) sendCommandToLCD(Y);
03CB 2F04 MOV R16,R20
03CC DFAB RCALL _sendCommandToLCD
03CD 940E0542 CALL pop_gset1
03CF 9508 RET
_setLCDOnOFF:
State --> R20
03D0 940E053F CALL push_gset1
03D2 2F40 MOV R20,R16
(0189) }
(0190)
(0191) /********************************************************
(0192) * 函数说明:设置LCD开关状态 *
(0193) * 输入: 开关状态控制字 *
(0194) ********************************************************/
(0195) void setLCDOnOFF(char State)
(0196) {
(0197) State |= 0x3e;
03D3 634E ORI R20,0x3E
(0198)
(0199) sendCommandToLCD(State);
03D4 2F04 MOV R16,R20
03D5 DFA2 RCALL _sendCommandToLCD
03D6 940E0542 CALL pop_gset1
03D8 9508 RET
_LCDDraw:
Data --> Y+4
Y --> R20
X --> R22
03D9 940E053D CALL push_gset2
03DB 2F42 MOV R20,R18
03DC 2F60 MOV R22,R16
(0200) }
(0201)
(0202) /********************************************************
(0203) * 函数说明:LCD写屏函数 *
(0204) * 输入: 坐标(竖向),数据 *
(0205) ********************************************************/
(0206) void LCDDraw(char X,char Y,char Data)
(0207) {
(0208) setX(X);
03DD 2F06 MOV R16,R22
03DE DFD3 RCALL _setX
(0209)
(0210) if (Y > 63)
03DF E38F LDI R24,0x3F
03E0 1784 CP R24,R20
03E1 F490 BCC 0x03F4
(0211) {
(0212) LCD12864_ChooseCS2;
03E2 91E00062 LDS R30,VPORTBit
03E4 91F00063 LDS R31,VPORTBit+1
03E6 8180 LDD R24,Z+0
03E7 6180 ORI R24,0x10
03E8 8380 STD Z+0,R24
03E9 91E00062 LDS R30,VPORTBit
03EB 91F00063 LDS R31,VPORTBit+1
03ED 8180 LDD R24,Z+0
03EE 7F87 ANDI R24,0xF7
03EF 8380 STD Z+0,R24
(0213) setY(Y-64);
03F0 2F04 MOV R16,R20
03F1 5400 SUBI R16,0x40
03F2 DFC9 RCALL _setY
(0214) }
03F3 C010 RJMP 0x0404
(0215) else
(0216) {
(0217) LCD12864_ChooseCS1;
03F4 91E00062 LDS R30,VPORTBit
03F6 91F00063 LDS R31,VPORTBit+1
03F8 8180 LDD R24,Z+0
03F9 6088 ORI R24,0x8
03FA 8380 STD Z+0,R24
03FB 91E00062 LDS R30,VPORTBit
03FD 91F00063 LDS R31,VPORTBit+1
03FF 8180 LDD R24,Z+0
0400 7E8F ANDI R24,0xEF
0401 8380 STD Z+0,R24
(0218) setY(Y);
0402 2F04 MOV R16,R20
0403 DFB8 RCALL _setY
(0219) }
(0220)
(0221) sendDataToLCD(Data);
0404 810C LDD R16,Y+4
0405 DF38 RCALL _sendDataToLCD
0406 940E0531 CALL pop_gset2
0408 9508 RET
_ClearLCD:
a --> R20
b --> R22
0409 940E053D CALL push_gset2
(0222) }
(0223)
(0224) /********************************************************
(0225) * 函数说明:清屏函数 *
(0226) ********************************************************/
(0227) void ClearLCD(void)
(0228) {
(0229) char a = 0,b = 0;
040B 2744 CLR R20
040C 2766 CLR R22
(0230) LCD12864_ChooseBoth;
040D 91E00062 LDS R30,VPORTBit
040F 91F00063 LDS R31,VPORTBit+1
0411 8180 LDD R24,Z+0
0412 6088 ORI R24,0x8
0413 8380 STD Z+0,R24
0414 91E00062 LDS R30,VPORTBit
0416 91F00063 LDS R31,VPORTBit+1
0418 8180 LDD R24,Z+0
0419 6180 ORI R24,0x10
041A 8380 STD Z+0,R24
(0231) setX(0);
041B 2700 CLR R16
041C DF95 RCALL _setX
(0232) setY(0);
041D 2700 CLR R16
041E DF9D RCALL _setY
(0233)
(0234) for (a=0;a<8;a++)
041F C00A RJMP 0x042A
(0235) {
(0236) setX(a);
0420 2F04 MOV R16,R20
0421 DF90 RCALL _setX
(0237) for (b=0;b<64;b++)
0422 2766 CLR R22
0423 C003 RJMP 0x0427
(0238) {
(0239) sendDataToLCD(NULL);
0424 2700 CLR R16
0425 DF18 RCALL _sendDataToLCD
0426 9563 INC R22
0427 3460 CPI R22,0x40
0428 F3D8 BCS 0x0424
0429 9543 INC R20
042A 3048 CPI R20,0x8
042B F3A0 BCS 0x0420
042C 940E0531 CALL pop_gset2
042E 9508 RET
(0240) }
(0241) }
(0242) }
(0243)
(0244) /********************************************************
(0245) * 函数说明:12864初始化函数 *
(0246) ********************************************************/
(0247) void LCD12864Init(void)
(0248) {
(0249) LCD12864_Start;
_LCD12864Init:
042F 91E00062 LDS R30,VPORTBit
0431 91F00063 LDS R31,VPORTBit+1
0433 8180 LDD R24,Z+0
0434 7D8F ANDI R24,0xDF
0435 8380 STD Z+0,R24
0436 DEA1 RCALL _refreshVirtualPORT
(0250) LCD12864_Reset;
0437 91E00062 LDS R30,VPORTBit
0439 91F00063 LDS R31,VPORTBit+1
043B 8180 LDD R24,Z+0
043C 6280 ORI R24,0x20
043D 8380 STD Z+0,R24
043E DE99 RCALL _refreshVirtualPORT
(0251) LCD12864_ChooseBoth;
043F 91E00062 LDS R30,VPORTBit
0441 91F00063 LDS R31,VPORTBit+1
0443 8180 LDD R24,Z+0
0444 6088 ORI R24,0x8
0445 8380 STD Z+0,R24
0446 91E00062 LDS R30,VPORTBit
0448 91F00063 LDS R31,VPORTBit+1
044A 8180 LDD R24,Z+0
044B 6180 ORI R24,0x10
044C 8380 STD Z+0,R24
(0252)
(0253) LCD12864_SetLCD_OFF;
044D E30E LDI R16,0x3E
044E DF81 RCALL _setLCDOnOFF
(0254)
(0255) setX(0);
044F 2700 CLR R16
0450 DF61 RCALL _setX
(0256) setStartLine(0);
0451 2700 CLR R16
0452 DF73 RCALL _setStartLine
(0257) setY(0);
0453 2700 CLR R16
0454 DF67 RCALL _setY
(0258)
(0259) LCD12864_SetLCD_ON;
0455 E30F LDI R16,0x3F
0456 DF79 RCALL _setLCDOnOFF
(0260) ClearLCD();
0457 DFB1 RCALL _ClearLCD
0458 9508 RET
_LCD12864DispPicture:
Y --> R20
X --> R22
Left --> Y+14
Top --> Y+12
Height --> R12
Width --> R14
PIC --> R10
0459 940E0537 CALL push_gset5
045B 2EE2 MOV R14,R18
045C 0158 MOVW R10,R16
045D 84CA LDD R12,Y+10
(0261) }
(0262)
(0263) /********************************************************
(0264) * 函数说明:图片显示函数 *
(0265) * 输入: 图片数组,尺寸,显示位置 *
(0266) ********************************************************/
(0267) void LCD12864DispPicture(flash char *PIC,char Width,char Height,char Top,char Left)
(0268) {
(0269) char X = 0,Y = 0;
045E 2766 CLR R22
045F 2744 CLR R20
(0270)
(0271) for (Y = 0;Y < (Height >>3);Y ++)
0460 C045 RJMP 0x04A6
(0272) {
(0273) LCD12864_ChooseBoth;
0461 91E00062 LDS R30,VPORTBit
0463 91F00063 LDS R31,VPORTBit+1
0465 8180 LDD R24,Z+0
0466 6088 ORI R24,0x8
0467 8380 STD Z+0,R24
0468 91E00062 LDS R30,VPORTBit
046A 91F00063 LDS R31,VPORTBit+1
046C 8180 LDD R24,Z+0
046D 6180 ORI R24,0x10
046E 8380 STD Z+0,R24
(0274) setX(Y);
046F 2F04 MOV R16,R20
0470 DF41 RCALL _setX
(0275) for (X = 0;X < Width;X ++)
0471 2766 CLR R22
0472 C02F RJMP 0x04A2
(0276) {
(0277) if (X <64)
0473 3460 CPI R22,0x40
0474 F488 BCC 0x0486
(0278) {
(0279)
(0280) LCD12864_ChooseCS1;
0475 91E00062 LDS R30,VPORTBit
0477 91F00063 LDS R31,VPORTBit+1
0479 8180 LDD R24,Z+0
047A 6088 ORI R24,0x8
047B 8380 STD Z+0,R24
047C 91E00062 LDS R30,VPORTBit
047E 91F00063 LDS R31,VPORTBit+1
0480 8180 LDD R24,Z+0
0481 7E8F ANDI R24,0xEF
0482 8380 STD Z+0,R24
(0281) setY(X);
0483 2F06 MOV R16,R22
0484 DF37 RCALL _setY
(0282) }
0485 C011 RJMP 0x0497
(0283) else
(0284) {
(0285) LCD12864_ChooseCS2;
0486 91E00062 LDS R30,VPORTBit
0488 91F00063 LDS R31,VPORTBit+1
048A 8180 LDD R24,Z+0
048B 6180 ORI R24,0x10
048C 8380 STD Z+0,R24
048D 91E00062 LDS R30,VPORTBit
048F 91F00063 LDS R31,VPORTBit+1
0491 8180 LDD R24,Z+0
0492 7F87 ANDI R24,0xF7
0493 8380 STD Z+0,R24
(0286) setY(X - 64);
0494 2F06 MOV R16,R22
0495 5400 SUBI R16,0x40
0496 DF25 RCALL _setY
(0287) }
(0288) sendDataToLCD(PIC[Y*Width+X]);
0497 9D4E MUL R20,R14
0498 01F0 MOVW R30,R0
0499 2E26 MOV R2,R22
049A 2433 CLR R3
049B 0DE2 ADD R30,R2
049C 1DF3 ADC R31,R3
049D 0DEA ADD R30,R10
049E 1DFB ADC R31,R11
049F 9104 LPM R16,0(Z)
04A0 DE9D RCALL _sendDataToLCD
04A1 9563 INC R22
04A2 156E CP R22,R14
04A3 F408 BCC 0x04A5
04A4 CFCE RJMP 0x0473
04A5 9543 INC R20
04A6 2C2C MOV R2,R12
04A7 9426 LSR R2
04A8 9426 LSR R2
04A9 9426 LSR R2
04AA 1542 CP R20,R2
04AB F408 BCC 0x04AD
04AC CFB4 RJMP 0x0461
04AD 940E0534 CALL pop_gset5
04AF 9508 RET
FILE: G:\单片机\源程序\液晶12864驱动\CGM12864\LCD12864_Example\12864_Example.c
(0001) /********************************************************
(0002) * 函数库说明:12864LCD显示示例程序 *
(0003) * 版本: v1.0 *
(0004) * 作者: 傻孩子 *
(0005) * 日期: 2006年2月15日 *
(0006) * 修改: 傻孩子 *
(0007) * 修改日期: 2006年2月15日 *
(0008) * *
(0009) * 说明: *
(0010) * 1、提供基本的现实函数。 *
(0011) * 2、支持小组编程规范0.9版的要求。 *
(0012) * 3、对外提供接口,支持位操作。 *
(0013) * 4、注意,这里的X/Y是屏幕竖方时候的坐标轴, *
(0014) * 如果使用字库,要使用转制过后竖向扫描的 *
(0015) * 字库。 *
(0016) * 5、为了兼容串行扫描方式,所以使用宏定义接口 *
(0017) * 的方法。同时也支持非位操作的方式。 *
(0018) ********************************************************/
(0019) # include "RD_ATMega16L.h"
(0020)
(0021) /***********************
(0022) * 系 统 宏 定 义 *
(0023) ***********************/
(0024) # pragma interrupt_handler Timer0OvfIsr:10
(0025) /*---------------------*
(0026) * 常 量 宏 定 义 *
(0027) *---------------------*/
(0028) #ifndef True
(0029) # define True 0x01
(0030) #endif
(0031) #ifndef False
(0032) # define False 0x00
(0033) #endif
(0034) #ifndef High
(0035) # define High 0x01
(0036) #endif
(0037) #ifndef Low
(0038) # define Low 0x00
(0039) #endif
(0040) #ifndef NULL
(0041) # define NULL 0x00
(0042) #endif
(0043) /*---------------------*
(0044) * 动 作 宏 定 义 *
(0045) *---------------------*/
(0046)
(0047) /*---------------------*
(0048) * SerialToCollateral.h *
(0049) * 配置宏定义 *
(0050) *---------------------*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -