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

📄 lcd701_drv.asm

📁 利用SPCE061A实现中文输入,必要时可适当删减
💻 ASM
字号:
//======================================================
//  The information contained herein is the exclusive property of
//  Sunnnorth Technology Co. And shall not be distributed, reproduced,
//  or disclosed in whole in part without prior written permission.
//             (C) COPYRIGHT 2003  SUNNORTH TECHNOLOGY CO.
//                          ALL RIGHTS RESERVED
//  The entire notice above must be reproduced on all authorized copies.
//========================================================

//============================================================
// 文件名称:LCD701_Drv.asm
// 实现功能:SPLC701B底层驱动,利用SPCE061A的IO模拟SPLC701B时序
// 日期:    2005/6/18
//============================================================

.INCLUDE LCD701_Cfg.inc					// SPLC701B配置文件,可对传输模式、IO分配等进行设置

.PUBLIC _LCD701_InitIO
.PUBLIC F_LCD701_InitIO
.PUBLIC _LCD701_Read
.PUBLIC F_LCD701_Read
.PUBLIC _LCD701_Cmd
.PUBLIC F_LCD701_Cmd

.CODE

//======================================================
// 函数名称:	LCD701_InitIO
// C调用:		void LCD701_InitIO(void)
// 汇编调用:	F_LCD701_InitIO
// 实现功能:   初始化IO
// 入口参数:	无
// 出口参数:	无
// 破坏寄存器:	无
//======================================================
_LCD701_InitIO:
F_LCD701_InitIO:
	/////-----       串行模式	    -----/////
.IF (IM_CFG == 000b)or(IM_CFG == 001b)	
	push r1 to [sp]
	r1 = [P_Ctrl_Attrib]				
	r1 |= PIN_CSB + PIN_SCL + PIN_SDA
	[P_Ctrl_Attrib] = r1
	r1 = [P_Ctrl_Buffer]
	r1 |= PIN_CSB + PIN_SCL + PIN_SDA
	[P_Ctrl_Buffer] = r1
	r1 = [P_Ctrl_Dir]
	r1 |= PIN_CSB + PIN_SCL + PIN_SDA
	[P_Ctrl_Dir] = r1
	pop r1 from [sp]
.ENDIF
	/////-----       68-8位模式	    -----/////
.IF IM_CFG == 010b			
	push r1 to [sp]
	r1 = [P_Ctrl_Attrib]				
	r1 |= PIN_RS + PIN_CSB + PIN_RW + PIN_E
	[P_Ctrl_Attrib] = r1
	r1 = [P_Ctrl_Buffer]
	r1 |= PIN_RS + PIN_CSB + PIN_RW
	r1 &= ~PIN_E
	[P_Ctrl_Buffer] = r1
	r1 = [P_Ctrl_Dir]
	r1 |= PIN_RS + PIN_CSB + PIN_RW + PIN_E
	[P_Ctrl_Dir] = r1
	r1 = [P_DB_Attrib]
	r1 |= PIN_DB_MASK
	[P_DB_Attrib] = r1
	r1 = [P_DB_Dir]
	r1 |= PIN_DB_MASK
	[P_DB_Dir] = r1
	pop r1 from [sp]
.ENDIF
	/////-----       68-4位模式	    -----/////
.IF IM_CFG == 011b		
.ENDIF
	/////-----       80-8位模式	    -----/////
.IF IM_CFG == 110b		
	push r1 to [sp]
	r1 = [P_Ctrl_Attrib]				
	r1 |= PIN_RS + PIN_CSB + PIN_RDB + PIN_WRB
	[P_Ctrl_Attrib] = r1
	r1 = [P_Ctrl_Buffer]
	r1 |= PIN_RS + PIN_CSB + PIN_RDB + PIN_WRB
	[P_Ctrl_Buffer] = r1
	r1 = [P_Ctrl_Dir]
	r1 |= PIN_RS + PIN_CSB + PIN_RDB + PIN_WRB
	[P_Ctrl_Dir] = r1
	r1 = [P_DB_Attrib]
	r1 |= PIN_DB_MASK
	[P_DB_Attrib] = r1
	r1 = [P_DB_Dir]
	r1 |= PIN_DB_MASK
	[P_DB_Dir] = r1
	pop r1 from [sp]
.ENDIF
	/////-----       80-4位模式	    -----/////
.IF IM_CFG == 111b		
.ENDIF
retf

//======================================================
// 函数名称:	LCD701_Write(私有函数)
// C调用:		无
// 汇编调用:	F_LCD701_Write
// 实现功能:   仅对于串行模式,向SPLC701B写入16位数据
// 入口参数:   r1 - 待写入的数据
// 出口参数:   无
// 破坏寄存器: 无
//======================================================
	/////-----       串行模式	    -----/////
.IF (IM_CFG == 000b)or(IM_CFG == 001b)	
F_LCD701_Write:					
	int off
	push r1,r3 to [sp]

	r3 = [P_Ctrl_Buffer]			// Set CSB Low
	r3 &= ~PIN_CSB
	[P_Ctrl_Buffer] = r3

	r2 = 0x8000						// Bit Mask
?SP_Write_Loop:
	r3 &= ~PIN_SCL					// Set SCL Low
	[P_Ctrl_Buffer] = r3
	test r1,r2						// Determine whether SDA High or Low
	jnz ?SP_Write_High
?SP_Write_Low:
	r3 &= ~PIN_SDA					// SDA Low
	jmp ?SP_Write_SDA
?SP_Write_High:
	r3 |= PIN_SDA					// SDA High
?SP_Write_SDA:
	[P_Ctrl_Buffer] = r3			// Write SDA

	r3 |= PIN_SCL					// Set SCL High
	[P_Ctrl_Buffer] = r3
	r2 = r2 LSR 1
	jnz ?SP_Write_Loop				// Next bit

	r3 |= PIN_CSB					// Set CSB High
	[P_Ctrl_Buffer] = r3
	pop r1,r3 from [sp]
	int fiq,irq
retf
.ENDIF

//======================================================
// 函数名称:	LCD701_Read
// C调用:		unsigned LCD701_Read(void)
// 汇编调用:	F_LCD701_Read
// 实现功能:   从SPLC701B的当前地址读出一个字节数据
// 入口参数:   无
// 出口参数:   r1 - 读出的1字节数据
// 破坏寄存器: r1
//======================================================
	/////-----       串行模式	    -----/////
.IF (IM_CFG == 000b)or(IM_CFG == 001b)
_LCD701_Read:
F_LCD701_Read:
	int off
	push r2,r3 to [sp]
	r1 = 0x700F|((IM_CFG&0x01)<<10)	// Point Index Register to 0x0F
	call F_LCD701_Write
	
	r3 = [P_Ctrl_Buffer]			// Set CSB Low
	r3 &= ~PIN_CSB
	[P_Ctrl_Buffer] = r3

	r1 = 0x0073|((IM_CFG&0x01)<<2)	// Write 8 bit Start Code
	r2 = 0x0080						// Bit Mask
?SP_Write_Loop:
	r3 &= ~PIN_SCL					// Set SCL Low
	[P_Ctrl_Buffer] = r3
	test r1,r2						// Determine whether SDA High or Low
	jnz ?SP_Write_High
?SP_Write_Low:
	r3 &= ~PIN_SDA					// SDA Low
	jmp ?SP_Write_SDA
?SP_Write_High:
	r3 |= PIN_SDA					// SDA High
?SP_Write_SDA:
	[P_Ctrl_Buffer] = r3			// Write SDA

	r3 |= PIN_SCL					// Set SCL High
	[P_Ctrl_Buffer] = r3
	r2 = r2 LSR 1
	jnz ?SP_Write_Loop				// Next bit

	r3 = [P_Ctrl_Dir]				// Set SDA as Input Pin
	r3 &= ~PIN_SDA
	[P_Ctrl_Dir] = r3
	r3 = [P_Ctrl_Attrib]
	r3 &= ~PIN_SDA
	[P_Ctrl_Attrib] = r3
	r3 = [P_Ctrl_Buffer]
	r3 &= ~PIN_SDA
	[P_Ctrl_Data] = r3

	r2 = 0x8000						// Skip 16 bit Invalid Data
	r3 = [P_Ctrl_Buffer]
?SP_Skip_Loop:
	r3 &= ~PIN_SCL					// Set Clk Low
	[P_Ctrl_Buffer] = r3
	r3 |= PIN_SCL					// Set Clk High
	[P_Ctrl_Buffer] = r3
	r2 = r2 LSR 1
	jnz ?SP_Skip_Loop				// Next Bit
	
	r1 = 0x0000						// Read 8 bit Data to r1
	r2 = 0x0080						// Bit Mask
?SP_Read_Loop:
	r3 = [P_Ctrl_Buffer]			// Set Clk Low
	r3 &= ~PIN_SCL
	[P_Ctrl_Buffer] = r3

	r3 = [P_Ctrl_Data]				// Get SDA
	r3 &= PIN_SDA
	jz ?SP_Read_Low
?SP_Read_High:						
	r1 |= r2
?SP_Read_Low:						
	// do nothing
	r3 = [P_Ctrl_Buffer]
	r3 |= PIN_SCL					//Set Clk High
	[P_Ctrl_Buffer] = r3			
	r2 = r2 LSR 1
	jnz ?SP_Read_Loop				// Next bit

	r3 = [P_Ctrl_Attrib]			// Set SDA as Output Pin
	r3 |= PIN_SDA
	[P_Ctrl_Attrib] = r3
	r3 = [P_Ctrl_Dir]
	r3 |= PIN_SDA
	[P_Ctrl_Dir] = r3

	r3 = [P_Ctrl_Buffer]			//Set CSB High
	r3 |= PIN_CSB
	[P_Ctrl_Buffer] = r3
	pop r2,r3 from [sp]
	int fiq,irq
retf
.ENDIF

//======================================================
// 函数名称:	LCD701_Cmd
// C调用:		void LCD701_Cmd(unsigned CmdCode)
// 汇编调用:	F_LCD701_Cmd
// 实现功能:   向SPLC701B写入命令,命令格式为:
//					高8位 - Index Register
//					低8位 - Control Code
// 入口参数:   CmdCode(r1) - 16位命令
// 出口参数:   无
// 破坏寄存器: 无
//======================================================
_LCD701_Cmd:
	push r1 to [sp]
	r1 = sp+4
	r1 = [r1]
	call F_LCD701_Cmd
	pop r1 from [sp]
retf

	/////-----       串行模式	    -----/////
.IF (IM_CFG == 000b)or(IM_CFG == 001b)
// r1: Cmd
F_LCD701_Cmd:
	push r1,r2 to [sp]
	r2 = r1
	r1 = r1 lsr 4					//IR
	r1 = r1 lsr 4
	r1 |= 0x7000|((IM_CFG&0x01)<<10)
	call F_LCD701_Write
	
	r1 = r2
	r1 = r1 & 0x00ff
	r1 |= 0x7200|((IM_CFG&0x01)<<10)
	call F_LCD701_Write
	pop r1,r2 from [sp]
retf
.ENDIF

.IF IM_CFG == 010b						// 68 system interface, 8bit
F_LCD701_Cmd:
	push r1,r3 to [sp]
	r2 = r1
.IF P_DB_HighByte
	r1 &= 0xff00
.ELSE
	r1 = r1 lsr 4						// Index Register
	r1 = r1 lsr 4
.ENDIF
	r3 = [P_Ctrl_Buffer]			
	r3 &= ~PIN_E						// E=0
	[P_Ctrl_Buffer] = r3
r3 &= ~PIN_CSB
[P_Ctrl_Buffer] = r3
	r3 &= ~(PIN_CSB + PIN_RW + PIN_RS)	// CSB=0; RW=0; RS=0;
	[P_Ctrl_Buffer] = r3
	r3 = [P_DB_Buffer]					// Load IndexCode onto DataBus
	r3 &= ~PIN_DB_MASK
	r3 |= r1
	[P_DB_Buffer] = r3
	r3 = [P_Ctrl_Buffer]				// E=1
	r3 |= PIN_E
	[P_Ctrl_Buffer] = r3
	r3 = [P_Ctrl_Buffer]				// E=0
	r3 &= ~PIN_E
	[P_Ctrl_Buffer] = r3
r3 |= PIN_CSB
[P_Ctrl_Buffer]	= r3

	r1 = r2
.IF P_DB_HighByte
	r1 = r1 lsl 4
	r1 = r1 lsl 4
.ELSE
	r1 = r1 & 0x00ff					// Control Code
.ENDIF
	r3 = [P_Ctrl_Buffer]
	r3 |= PIN_RS						// RS=1
	[P_Ctrl_Buffer] = r3
r3 &= ~PIN_CSB
[P_Ctrl_Buffer]	= r3
	r3 = [P_DB_Buffer]					// Load ControlCode onto DataBus
	r3 &= ~PIN_DB_MASK
	r3 |= r1
	[P_DB_Buffer] = r3
	r3 = [P_Ctrl_Buffer]				// E=1
	r3 |= PIN_E
	[P_Ctrl_Buffer] = r3
	r3 = [P_Ctrl_Buffer]				// E=0
	r3 &= ~PIN_E
	[P_Ctrl_Buffer] = r3
	r3 = [P_Ctrl_Buffer]				// CSB=1, RW=1
	r3 |= (PIN_CSB + PIN_RW)			
	[P_Ctrl_Buffer] = r3
	pop r1,r3 from [sp]
retf
.ENDIF

.IF IM_CFG == 010b						// 68 system interface, 8bit
_LCD701_Read:
F_LCD701_Read:
	nop	
retf
.ENDIF

.IF IM_CFG == 110b						// 80 system interface, 8bit
F_LCD701_Cmd:
	push r1,r3 to [sp]
	r2 = r1
.IF P_DB_HighByte
	r1 &= 0xff00
.ELSE
	r1 = r1 lsr 4						// Index Register
	r1 = r1 lsr 4
.ENDIF
	r3 = [P_Ctrl_Buffer]			
	r3 &= ~PIN_RS						// RS=0
	[P_Ctrl_Buffer] = r3
	r3 = [P_Ctrl_Buffer]
	r3 &= ~PIN_CSB
	[P_Ctrl_Buffer] = r3
	r3 = [P_Ctrl_Buffer]
	r3 &= ~PIN_WRB						// WRB=0
	[P_Ctrl_Buffer] = r3
	r3 = [P_DB_Buffer]					// Load IndexCode onto DataBus
	r3 &= ~PIN_DB_MASK
	r3 |= r1
	[P_DB_Buffer] = r3
	r3 = [P_Ctrl_Buffer]				// WRB=1
	r3 |= PIN_WRB
	[P_Ctrl_Buffer] = r3
	r3 |= PIN_CSB
	[P_Ctrl_Buffer]	= r3

	r1 = r2
.IF P_DB_HighByte
	r1 = r1 lsl 4
	r1 = r1 lsl 4
.ELSE
	r1 = r1 & 0x00ff					// Control Code
.ENDIF
	r3 = [P_Ctrl_Buffer]
	r3 |= PIN_RS						// RS=1
	[P_Ctrl_Buffer] = r3
r3 &= ~PIN_CSB
[P_Ctrl_Buffer]	= r3
	r3 &= ~PIN_WRB							// WRB=0
	[P_Ctrl_Buffer] = r3
	r3 = [P_DB_Buffer]					// Load ControlCode onto DataBus
	r3 &= ~PIN_DB_MASK
	r3 |= r1
	[P_DB_Buffer] = r3
	r3 = [P_Ctrl_Buffer]				// WRB=1
	r3 |= PIN_WRB
	[P_Ctrl_Buffer] = r3
	r3 = [P_Ctrl_Buffer]				// CSB=1
	r3 |= PIN_CSB
	[P_Ctrl_Buffer] = r3
	pop r1,r3 from [sp]
retf
.ENDIF

.IF IM_CFG == 110b						// 80 system interface, 8bit
_LCD701_Read:
F_LCD701_Read:
	nop	
retf
.ENDIF

⌨️ 快捷键说明

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