📄 jm12864lcd_driver.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 + -