⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 12864_example.lst

📁 我们编写了一个支持位操作、普通端口操作、并行操作、串行操作等多种模式的12864驱动
💻 LST
📖 第 1 页 / 共 4 页
字号:
(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 + -