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

📄 12864_example.lst

📁 我们编写了一个支持位操作、普通端口操作、并行操作、串行操作等多种模式的12864驱动
💻 LST
📖 第 1 页 / 共 4 页
字号:
(0185) /********************************************************
(0186) *  函数说明:虚拟端口处理程序                           *
(0187) ********************************************************/
(0188) void VirtualPORTProccess(void)
(0189) {
(0190)     if (IfPortChange)
_VirtualPORTProccess:
    02CF 90200064  LDS	R2,IfPortChange
    02D1 2022      TST	R2
    02D2 F021      BEQ	0x02D7
(0191) 	{
(0192) 	    refreshVirtualPORT();
    02D3 D004      RCALL	_refreshVirtualPORT
(0193) 		IfPortChange = False;
    02D4 2422      CLR	R2
    02D5 92200064  STS	IfPortChange,R2
(0194) 	}
    02D7 9508      RET
_refreshVirtualPORT:
  TempData             --> R20
  n                    --> R22
    02D8 940E053D  CALL	push_gset2
(0195) }
(0196) 
(0197) /********************************************************
(0198) *  函数说明:刷新虚拟端口函数                           *
(0199) ********************************************************/
(0200) void refreshVirtualPORT(void)
(0201) {
(0202) 	char n = 0;
    02DA 2766      CLR	R22
(0203) 	char TempData = 0;
    02DB 2744      CLR	R20
(0204) 	
(0205) 	VRCK = 0;
    02DC 91E00079  LDS	R30,PORTD_BIT
    02DE 91F0007A  LDS	R31,PORTD_BIT+1
    02E0 8180      LDD	R24,Z+0
    02E1 7F87      ANDI	R24,0xF7
    02E2 8380      STD	Z+0,R24
(0206) 	for (n=0;n<(VIRTUAL_BIT_COUNT>>3);n++)
    02E3 C014      RJMP	0x02F8
(0207) 	{
(0208) 	    TempData = (VPORT<<(n<<3))>>(VIRTUAL_BIT_COUNT-8);
    02E4 2F26      MOV	R18,R22
    02E5 2733      CLR	R19
    02E6 0F22      LSL	R18
    02E7 1F33      ROL	R19
    02E8 0F22      LSL	R18
    02E9 1F33      ROL	R19
    02EA 0F22      LSL	R18
    02EB 1F33      ROL	R19
    02EC 91000060  LDS	R16,VPORT
    02EE 91100061  LDS	R17,VPORT+1
    02F0 940E0556  CALL	lsl16
    02F2 01A8      MOVW	R20,R16
    02F3 2F45      MOV	R20,R21
    02F4 2755      CLR	R21
(0209) 		sendBITS(TempData);
    02F5 2F04      MOV	R16,R20
    02F6 D010      RCALL	_sendBITS
    02F7 9563      INC	R22
    02F8 3062      CPI	R22,2
    02F9 F350      BCS	0x02E4
(0210) 	}
(0211) 	VRCK = 1;
    02FA 91E00079  LDS	R30,PORTD_BIT
    02FC 91F0007A  LDS	R31,PORTD_BIT+1
    02FE 8180      LDD	R24,Z+0
    02FF 6088      ORI	R24,0x8
    0300 8380      STD	Z+0,R24
(0212) 	IfPortChange = False;
    0301 2422      CLR	R2
    0302 92200064  STS	IfPortChange,R2
    0304 940E0531  CALL	pop_gset2
    0306 9508      RET
_sendBITS:
  n                    --> R20
  Data                 --> R22
    0307 940E053D  CALL	push_gset2
    0309 2F60      MOV	R22,R16
(0213) }
(0214) 
(0215) /********************************************************
(0216) *  函数说明:发送串行数据函数                           *
(0217) *  输入:    要发送的字节                               *
(0218) ********************************************************/
(0219) void sendBITS(char Data)
(0220) {
(0221)     char n = 0;
    030A 2744      CLR	R20
(0222) 	for (n = 0;n<8;n++)
    030B C025      RJMP	0x0331
(0223) 	{
(0224) 	    VSCK = 0;
    030C 91E00079  LDS	R30,PORTD_BIT
    030E 91F0007A  LDS	R31,PORTD_BIT+1
    0310 8180      LDD	R24,Z+0
    0311 7E8F      ANDI	R24,0xEF
    0312 8380      STD	Z+0,R24
(0225) 	    if (((Data<<n)& 0x80 )==0)
    0313 2F06      MOV	R16,R22
    0314 2F14      MOV	R17,R20
    0315 940E055D  CALL	lsl8
    0317 2F80      MOV	R24,R16
    0318 7880      ANDI	R24,0x80
    0319 F441      BNE	0x0322
(0226) 		{
(0227) 		    VSI = 0;
    031A 91E00079  LDS	R30,PORTD_BIT
    031C 91F0007A  LDS	R31,PORTD_BIT+1
    031E 8180      LDD	R24,Z+0
    031F 7D8F      ANDI	R24,0xDF
    0320 8380      STD	Z+0,R24
(0228) 		}
    0321 C007      RJMP	0x0329
(0229) 		else
(0230) 		{
(0231) 		    VSI = 1;
    0322 91E00079  LDS	R30,PORTD_BIT
    0324 91F0007A  LDS	R31,PORTD_BIT+1
    0326 8180      LDD	R24,Z+0
    0327 6280      ORI	R24,0x20
    0328 8380      STD	Z+0,R24
(0232) 		}
(0233) 		VSCK = 1;                                        //拉高时钟线
    0329 91E00079  LDS	R30,PORTD_BIT
    032B 91F0007A  LDS	R31,PORTD_BIT+1
    032D 8180      LDD	R24,Z+0
    032E 6180      ORI	R24,0x10
    032F 8380      STD	Z+0,R24
    0330 9543      INC	R20
    0331 3048      CPI	R20,0x8
    0332 F408      BCC	0x0334
    0333 CFD8      RJMP	0x030C
    0334 940E0531  CALL	pop_gset2
    0336 9508      RET
FILE: G:\单片机\源程序\液晶12864驱动\CGM12864\LCD12864_Example\RD_LCD12864.h
(0001) /********************************************************
(0002) *  函数库说明:12864LCD显示基本驱动函数库               *
(0003) *  版本:      v1.0                                     *
(0004) *  作者:      王卓然                                   *
(0005) *  日期:      2005年10月7日                            *
(0006) *  修改:      王卓然                                   *
(0007) *  修改日期:  2006年2月16日                            *
(0008) *                                                       *
(0009) *  说明:                                               *
(0010) *          1、提供基本的现实函数。                      *
(0011) *          2、支持小组编程规范0.9版的要求。             *
(0012) *          3、对外提供接口,支持位操作。                *
(0013) *          4、注意,这里的X/Y是屏幕竖方时候的坐标轴,   *
(0014) *             如果使用字库,要使用转制过后竖向扫描的    *
(0015) *             字库。                                    *
(0016) *          5、为了兼容串行扫描方式,所以使用宏定义接口  *
(0017) *             的方法。同时也支持非位操作的方式。        *
(0018) ********************************************************/
(0019) #ifndef _Use_LCD12864
(0020) # define _Use_LCD12864
(0021) 
(0022) /***********************
(0023) *    系 统 宏 定 义    *
(0024) ***********************/
(0025) 
(0026) /*---------------------*
(0027) *    常 量 宏 定 义    *
(0028) *---------------------*/
(0029) #ifndef True
(0030)     # define True       0x01
(0031) #endif
(0032) #ifndef False
(0033)     # define False      0x00
(0034) #endif
(0035) #ifndef High
(0036)     # define High       0x01
(0037) #endif
(0038) #ifndef Low
(0039)     # define Low        0x00
(0040) #endif
(0041) #ifndef NULL
(0042)     # define NULL       0x00
(0043) #endif
(0044) 
(0045) # define LCD12864_BUSY      7
(0046) # define LCD12864_ON_OFF    5
(0047) # define LCD12864_RESET     4
(0048) # define LCD12864_ON        0x3f
(0049) # define LCD12864_OFF       0x3e
(0050) 
(0051) #ifdef _LCD12864_WriteOnly
(0052)     #ifndef LCD12864_WaitTime
(0053)         # define LCD12864_WaitTime 5
(0054)     #endif
(0055) #endif
(0056) /*---------------------*
(0057) *    动 作 宏 定 义    *
(0058) *---------------------*/
(0059) # define LCD12864_SetModel_Data           SETBIT_RS;
(0060) # define LCD12864_SetModel_Command        CLRBIT_RS;
(0061) # define LCD12864_SetModel_Read           SETBIT_RW;SetDataPORTDirection_READ;
(0062) # define LCD12864_SetModel_Write          CLRBIT_RW;SetDataPORTDirection_WRITE;
(0063) # define LCD12864_SetEnable               SETBIT_E;
(0064) # define LCD12864_SetDisable              CLRBIT_E;
(0065) # define LCD12864_ChooseCS1               SETBIT_CS1;CLRBIT_CS2;
(0066) # define LCD12864_ChooseCS2               SETBIT_CS2;CLRBIT_CS1;
(0067) # define LCD12864_ChooseBoth              SETBIT_CS1;SETBIT_CS2;
(0068) # define LCD12864_Start                   CLRBIT_RST;
(0069) # define LCD12864_Reset                   SETBIT_RST;
(0070) 
(0071) # define LCD12864_SetLCD_ON               setLCDOnOFF(LCD12864_ON);
(0072) # define LCD12864_SetLCD_OFF              setLCDOnOFF(LCD12864_OFF);
(0073) 
(0074) /***********************
(0075) *    全局变量声明区    *
(0076) ***********************/
(0077) 
(0078) /***********************
(0079) *    系统函数声明区    *
(0080) ***********************/
(0081) void sendDataToLCD(char Data);
(0082) void sendCommandToLCD(char Command);
(0083) void waitForLCDReady(void);
(0084) void setLCDOnOFF(char State);
(0085) void setX(char X);
(0086) void setStartLine(char Y);
(0087) void setY(char Y);
(0088) void ClearLCD(void);
(0089) void LCDDraw(char X,char Y,char Data);
(0090) void LCD12864DispPicture(flash char *PIC,char Width,char Height,char Top,char Left);
(0091) 
(0092) /********************************************************
(0093) *  函数说明:检测LCD状态函数                            *
(0094) ********************************************************/
(0095) void waitForLCDReady(void)
(0096) {
(0097) #ifndef _LCD12864_WriteOnly
(0098)     LCD12864_SetModel_Command;
(0099) 	LCD12864_SetModel_Read;
(0100) 
(0101) 	do
(0102) 	{
(0103) 	    LCD12864_SetEnable;
(0104) 	}
(0105) 	while ((ReadDataPORT & (1<<LCD12864_BUSY)));
(0106) #else
(0107)     char a = 0;
_waitForLCDReady:
  a                    --> R16
    0337 2700      CLR	R16
(0108) 	for (a=0;a<LCD12864_WaitTime;a++)
    0338 C002      RJMP	0x033B
(0109) 	{
(0110) 	     asm("nop");
    0339 0000      NOP
    033A 9503      INC	R16
    033B 3001      CPI	R16,1
    033C F3E0      BCS	0x0339
    033D 9508      RET
_sendDataToLCD:
  Data                 --> R20
    033E 940E053F  CALL	push_gset1
    0340 2F40      MOV	R20,R16
(0111) 	}
(0112) #endif
(0113) }
(0114) 
(0115) 
(0116) /********************************************************
(0117) *  函数说明:发送数据函数                               *
(0118) *  输入:    需要发送的数据                             *
(0119) ********************************************************/
(0120) void sendDataToLCD(char Data)
(0121) {
(0122)     waitForLCDReady();
    0341 DFF5      RCALL	_waitForLCDReady
(0123) 	
(0124) 	
(0125) 	LCD12864_SetModel_Data;
    0342 91E00062  LDS	R30,VPORTBit
    0344 91F00063  LDS	R31,VPORTBit+1
    0346 8180      LDD	R24,Z+0
    0347 6081      ORI	R24,1
    0348 8380      STD	Z+0,R24
(0126) 	LCD12864_SetModel_Write;
    0349 91E00062  LDS	R30,VPORTBit
    034B 91F00063  LDS	R31,VPORTBit+1
    034D 8180      LDD	R24,Z+0
    034E 7F8D      ANDI	R24,0xFD
    034F 8380      STD	Z+0,R24
(0127) 	
(0128) 	//DataPORT = Data;
(0129) 	LCD12864_DataTransfer(Data);
    0350 91800060  LDS	R24,VPORT
    0352 91900061  LDS	R25,VPORT+1
    0354 7090      ANDI	R25,0
    0355 93900061  STS	VPORT+1,R25
    0357 93800060  STS	VPORT,R24
    0359 2E24      MOV	R2,R20
    035A 2433      CLR	R3
    035B 2C32      MOV	R3,R2
    035C 2422      CLR	R2
    035D 012C      MOVW	R4,R24
    035E 2842      OR	R4,R2
    035F 2853      OR	R5,R3
    0360 92500061  STS	VPORT+1,R5
    0362 92400060  STS	VPORT,R4
    0364 DF73      RCALL	_refreshVirtualPORT
(0130) 	
(0131) 	
(0132) 	LCD12864_SetEnable;
    0365 91E00062  LDS	R30,VPORTBit
    0367 91F00063  LDS	R31,VPORTBit+1
    0369 8180      LDD	R24,Z+0
    036A 6084      ORI	R24,4
    036B 8380      STD	Z+0,R24
    036C DF6B      RCALL	_refreshVirtualPORT
(0133) 	LCD12864_SetDisable;
    036D 91E00062  LDS	R30,VPORTBit
    036F 91F00063  LDS	R31,VPORTBit+1
    0371 8180      LDD	R24,Z+0
    0372 7F8B      ANDI	R24,0xFB
    0373 8380      STD	Z+0,R24
    0374 DF63      RCALL	_refreshVirtualPORT
    0375 940E0542  CALL	pop_gset1
    0377 9508      RET
_sendCommandToLCD:
  Command              --> R20
    0378 940E053F  CALL	push_gset1
    037A 2F40      MOV	R20,R16
(0134) }
(0135) 
(0136) /********************************************************
(0137) *  函数说明:发送指令函数                               *
(0138) *  输入:    需要发送的指令                             *
(0139) ********************************************************/
(0140) void sendCommandToLCD(char Command)
(0141) {
(0142)     waitForLCDReady();
    037B DFBB      RCALL	_waitForLCDReady
(0143) 
(0144) 	LCD12864_SetModel_Command;
    037C 91E00062  LDS	R30,VPORTBit
    037E 91F00063  LDS	R31,VPORTBit+1
    0380 8180      LDD	R24,Z+0
    0381 7F8E      ANDI	R24,0xFE
    0382 8380      STD	Z+0,R24
(0145) 	LCD12864_SetModel_Write;
    0383 91E00062  LDS	R30,VPORTBit
    0385 91F00063  LDS	R31,VPORTBit+1
    0387 8180      LDD	R24,Z+0
    0388 7F8D      ANDI	R24,0xFD
    0389 8380      STD	Z+0,R24
(0146) 	
(0147) 	//DataPORT = Command;
(0148) 	
(0149) 	LCD12864_DataTransfer(Command);
    038A 91800060  LDS	R24,VPORT
    038C 91900061  LDS	R25,VPORT+1
    038E 7090      ANDI	R25,0
    038F 93900061  STS	VPORT+1,R25
    0391 93800060  STS	VPORT,R24
    0393 2E24      MOV	R2,R20
    0394 2433      CLR	R3
    0395 2C32      MOV	R3,R2
    0396 2422      CLR	R2
    0397 012C      MOVW	R4,R24
    0398 2842      OR	R4,R2
    0399 2853      OR	R5,R3
    039A 92500061  STS	VPORT+1,R5
    039C 92400060  STS	VPORT,R4
    039E DF39      RCALL	_refreshVirtualPORT
(0150) 	
(0151) 	LCD12864_SetEnable;
    039F 91E00062  LDS	R30,VPORTBit
    03A1 91F00063  LDS	R31,VPORTBit+1
    03A3 8180      LDD	R24,Z+0
    03A4 6084      ORI	R24,4
    03A5 8380      STD	Z+0,R24
    03A6 DF31      RCALL	_refreshVirtualPORT
(0152) 	LCD12864_SetDisable;
    03A7 91E00062  LDS	R30,VPORTBit
    03A9 91F00063  LDS	R31,VPORTBit+1
    03AB 8180      LDD	R24,Z+0
    03AC 7F8B      ANDI	R24,0xFB
    03AD 8380      STD	Z+0,R24
    03AE DF29      RCALL	_refreshVirtualPORT
    03AF 940E0542  CALL	pop_gset1
    03B1 9508      RET
_setX:
  X                    --> R20
    03B2 940E053F  CALL	push_gset1
    03B4 2F40      MOV	R20,R16
(0153) }
(0154) 
(0155) /********************************************************
(0156) *  函数说明:设置显示列(竖向)                           *
(0157) *  输入:    列号(0~7)                                  *
(0158) ********************************************************/
(0159) void setX(char X)
(0160) {
(0161)     X &= 0x07;
    03B5 7047      ANDI	R20,7
(0162) 	X |= 0xb8;
    03B6 6B48      ORI	R20,0xB8

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -