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

📄 jm12864lcd_driver.asm

📁 LCD 人机界面 用61单片机做的,请大家指点下
💻 ASM
字号:
//*========================================================
//* 文件名: JM12864LCD_Driver.asm
//* 功  能: 12864LCD底层驱动文件
//* 作  者: fenglover/xzh20081983/spce061a
//* 日  期: 2006-08-11
//*========================================================
.INCLUDE spce061a.inc
//* 可以修改下列宏定义,选择LCD12864的数据口
.DEFINE LCD_Data_D P_IOA_Data
.DEFINE LCD_Dir_D P_IOA_Dir
.DEFINE LCD_Attrib_D P_IOA_Attrib
.DEFINE P_Buffer_D P_IOA_Buffer
//* 可以修改下列宏定义,选择LCD12864的控制口
.DEFINE LCD_Data_C P_IOB_Data
.DEFINE LCD_Dir_C P_IOB_Dir
.DEFINE LCD_Attrib_C P_IOB_Attrib
.DEFINE LCD_Buffer P_IOB_Buffer
//* 可以修改下列宏定义,选择LCD12864的数据位
.DEFINE LCD_MASK	0					//1:低8位   0:高8位
.IF LCD_MASK
.DEFINE LCD_DATA	0x00ff
.ELSE
.DEFINE LCD_DATA	0xff00
.ENDIF	
//* 可以修改下列宏定义,选择LCD12864的数据控制位
.DEFINE LCD_RS		0x0400
.DEFINE LCD_RW		0x0800
.DEFINE LCD_EN		0x1000
//*==================RAM区=================================
.RAM
.VAR TEMP                               
//*=================宏函数区===============================
//*========================================================
Set_LCD_RS: .MACRO
		PUSH R1 TO [SP]
		R1=[LCD_Buffer]
		R1|=LCD_RS
		[LCD_Buffer]=R1
		POP R1 FROM [SP]
.ENDM
//*========================================================
Clr_LCD_RS: .MACRO
		PUSH R1 TO [SP]
		R1=[LCD_Buffer]
		R1&=~LCD_RS
		[LCD_Buffer]=R1
		POP R1 FROM [SP]
.ENDM
//*========================================================
Set_LCD_RW: .MACRO
		PUSH R1 TO [SP]
		R1=[LCD_Buffer]
		R1|=LCD_RW
		[LCD_Buffer]=R1
		POP R1 FROM [SP]
.ENDM
//*========================================================
Clr_LCD_RW: .MACRO
		PUSH R1 TO [SP]
		R1=[LCD_Buffer]
		R1&=~LCD_RW
		[LCD_Buffer]=R1
		POP R1 FROM [SP]
.ENDM
//*========================================================
Set_LCD_EN: .MACRO
		PUSH R1 TO [SP]
		R1=[LCD_Buffer]
		R1|=LCD_EN
		[LCD_Buffer]=R1
		POP R1 FROM [SP]
.ENDM
//*========================================================
Clr_LCD_EN: .MACRO
		PUSH R1 TO [SP]
		R1=[LCD_Buffer]
		R1&=~LCD_EN
		[LCD_Buffer]=R1
		POP R1 FROM [SP]
.ENDM
//*====================代码区==============================
//*========================================================
.CODE
//*========================================================
//* 函数名称: Set_LCD_DATA_Input(void)
//* 功能描述: 设置LCD12864数据口为下拉输入口,因为要准备从
//*           LCD读忙标志或者读数据,所以读忙时应该为输入状态
//* 堆栈破坏: 无
//*========================================================
.PUBLIC _Set_LCD_DATA_Input,F_Set_LCD_DATA_Input
_Set_LCD_DATA_Input:
F_Set_LCD_DATA_Input:
		PUSH R1 TO [SP]
		R1=[LCD_Dir_D]
		R1&=~LCD_DATA
		[LCD_Dir_D]=R1
		
		R1=[LCD_Attrib_D]
		R1&=~LCD_DATA
		[LCD_Attrib_D]=R1
		
		R1=[LCD_Data_D]
		R1&=~LCD_DATA
		[LCD_Data_D]=R1
		POP R1 FROM [SP]
		RETF
//*========================================================
//* 函数名称: Set_LCD_DATA_Output(void)
//* 功能描述: 设置LCD12864数据口为带数据缓冲器高电平输出
//*           口,准备写数据或者指令到LCD.         
//* 堆栈破坏: 无
//*========================================================
.PUBLIC _Set_LCD_DATA_Output,F_Set_LCD_DATA_Output
_Set_LCD_DATA_Output:
F_Set_LCD_DATA_Output:
		PUSH R1 TO [SP]
		R1=[LCD_Dir_D]
		R1|=LCD_DATA
		[LCD_Dir_D]=R1
		
		R1=[LCD_Attrib_D]
		R1|=LCD_DATA
		[LCD_Attrib_D]=R1
		
		R1=[LCD_Data_D]
		R1|=LCD_DATA
		[LCD_Data_D]=R1
		POP R1 FROM [SP]
		RETF
//*========================================================
//* 函数名称: Set_LCD_Control_Output(void)
//* 功能描述: 初始化LCD12864的控制位RS,RW,EN为输出
//* 堆栈破坏: 无
//*========================================================
.PUBLIC _Set_LCD_Control_Output,F_Set_LCD_Control_Output
_Set_LCD_Control_Output:
F_Set_LCD_Control_Output:
		PUSH R1 TO [SP]
		R1=[LCD_Dir_C]
		R1|=(LCD_RS+LCD_RW+LCD_EN)
		[LCD_Dir_C]=R1
		
		R1=[LCD_Attrib_C]
		R1|=(LCD_RS+LCD_RW+LCD_EN)
		[LCD_Attrib_C]=R1
		
		R1=[LCD_Data_C]
		R1|=(LCD_RS+LCD_RW+LCD_EN)
		[LCD_Data_C]=R1
		POP R1 FROM [SP]
		RETF
//*========================================================
//* 函数名称: LCD_R_Busy(void)
//* 功能描述: 判忙标志,为1正在工作,为0空闲.
//* 堆栈破坏: 无
//*========================================================
.PUBLIC _LCD_R_Busy,F_LCD_R_Busy
_LCD_R_Busy:
F_LCD_R_Busy:
		PUSH R1 TO [SP]
		CALL F_Set_LCD_DATA_Input		//数据口输入
		Clr_LCD_RS();					//指令操作									
		Set_LCD_RW();					//读操作
		Set_LCD_EN();					//准备读忙标志
?SystemBusyLoop:
		R1=[LCD_Data_D]
.IF LCD_MASK
		TEST R1,0x0080
.ELSE
		TEST R1,0x8000
.ENDIF
		JNZ ?SystemBusyLoop

		Clr_LCD_EN();					//恢复EN信号
		POP R1 FROM [SP]
		RETF
//*========================================================
//* 函数名称: LCD_W_Command(unsigned int command)
//* 功能描述: 写一个字节指令给LCD
//* 堆栈破坏: R1,R2
//*========================================================
.PUBLIC _LCD_W_Command,F_LCD_W_Command
_LCD_W_Command:
F_LCD_W_Command:
		PUSH BP TO [SP]
		BP=SP+1
		R1=[BP+3]						//取得参数值command
		CALL F_LCD_R_Busy				//判忙标志
		CALL F_Set_LCD_DATA_Output		//数据口输出
		Clr_LCD_RS();					//指令操作						
		Clr_LCD_RW();					//写操作
		Set_LCD_EN();					//准备写指令
		R2=[LCD_Data_D]					
.IF LCD_MASK
		R2&=0xff00
		R1&=0x00ff
.ELSE
		R1=R1 LSL 4
		R1=R1 LSL 4
		R2&=0x00ff
		R1&=0xff00
.ENDIF
		[LCD_Data_D]=R1+R2
		Clr_LCD_EN();					//EN下降沿将指令command写入LCD
		Set_LCD_EN();					//降EN拉高
		Set_LCD_RW();					//拉高RW
		POP BP FROM [SP]
		RETF
//*========================================================
//* 函数名称: LCD_W_Data(unsigned char data)
//* 功能描述: 写一个字节数据给LCD
//* 堆栈破坏: 无
//*========================================================
.PUBLIC _LCD_W_Data,F_LCD_W_Data
_LCD_W_Data:
F_LCD_W_Data:
		PUSH BP TO [SP]
		BP=SP+1
		R1=[BP+3]						//取得参数值data
		CALL F_LCD_R_Busy				//判忙标志
		CALL F_Set_LCD_DATA_Output		//数据口输出
		Set_LCD_RS();					//数据操作						
		Clr_LCD_RW();					//写操作
		Set_LCD_EN();					//准备写数据
		R2=[LCD_Data_D]					
.IF LCD_MASK
		R2&=0xff00
		R1&=0x00ff
.ELSE
		R1=R1 LSL 4
		R1=R1 LSL 4
		R2&=0x00ff
		R1&=0xff00
.ENDIF
		[LCD_Data_D]=R1+R2
		Clr_LCD_EN();					//EN下降沿将数据data写入LCD
		Set_LCD_EN();					//降EN拉高
		Set_LCD_RW();					//拉高RW
		POP BP FROM [SP]
		RETF

⌨️ 快捷键说明

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