📄 jm12864lcd_driver.asm
字号:
//============================================================
// FILE: JM12864LCD_Driver.asm
// FUNCTION: The driver for JM12864M
// DATA: 2006-07-17 By fenglover
// RESOURCE: http://www.unsp.com.cn
//============================================================
.DEFINE P_IOA_Data 0x7000
.DEFINE P_IOA_Buffer 0x7001
.DEFINE P_IOA_Dir 0x7002
.DEFINE P_IOA_Attrib 0x7003
.DEFINE P_IOA_Latch 0x7004
.DEFINE P_IOB_Data 0x7005
.DEFINE P_IOB_Buffer 0x7006
.DEFINE P_IOB_Dir 0x7007
.DEFINE P_IOB_Attrib 0x7008
.DEFINE P_Watchdog_Clear 0x7012
//**********************************************************************************//
//定义数据端口
.DEFINE Port_Data_D P_IOB_Data
.DEFINE Port_Buffer_D P_IOB_Buffer
.DEFINE Port_Dir_D P_IOB_Dir
.DEFINE Port_Attrib_D P_IOB_Attrib
//定义控制端口
.DEFINE Port_Data_C P_IOB_Data
.DEFINE Port_Buffer_C P_IOB_Buffer
.DEFINE Port_Dir_C P_IOB_Dir
.DEFINE Port_Attrib_C P_IOB_Attrib
//定义控制端口当中,每个控制线所对应的端口号
.DEFINE LCD_EN 0x2000
.DEFINE LCD_RW 0x4000
.DEFINE LCD_RS 0x8000
//数据端口高低位定义,如使用低八位则定义为0x00ff,高八位则为0xff00
.DEFINE M_Mask 0x00ff
.DEFINE M_Delay_Timers 0x00ff //延时时程定义,当默认时为0x00ff,大概会延时6ms左右
//用户可根据自己的程序适当修改
.RAM
.VAR R_Port_Dir,R_Port_Data,R_Port_Attrib
.CODE
//========================================================
// 汇编格式: InitIO_JM12864
// C格式: 无
// 实现功能: 初始化端口
//========================================================
.PUBLIC F_IO_Initial
F_IO_Initial:
push r1 to [sp]
r1 = [Port_Dir_D]
r1 = r1&(~M_Mask)
[Port_Dir_D] = r1
r1 = [Port_Attrib_D]
r1 = r1&(~M_Mask)
[Port_Attrib_D] = r1
r1 = [Port_Buffer_D]
r1 = r1&(~M_Mask)
[Port_Data_D] = r1
r1 = [Port_Dir_C]
r1 = r1|(LCD_EN+LCD_RS+LCD_RW)
[Port_Dir_C] = r1
r1 = [Port_Attrib_C]
r1 = r1|(LCD_EN+LCD_RS+LCD_RW)
[Port_Attrib_C] = r1
r1 = [Port_Buffer_C]
r1 = r1|(LCD_EN+LCD_RS+LCD_RW)
[Port_Data_C] = r1
pop r1 from [sp]
retf
//========================================================
// 汇编格式: F_DataPort_Input
// C格式: NULL
// 实现功能: 把数据端口设置为输入口
//========================================================
F_DataPort_Input:
r4 = [Port_Dir_D]
[R_Port_Dir] = r4
r4 = r4&(~M_Mask)
[Port_Dir_D] = r4
r4 = [Port_Attrib_D]
[R_Port_Attrib] = r4
r4 = r4&(~M_Mask)
[Port_Attrib_D] = r4
r4 = [Port_Buffer_D]
[R_Port_Data] = r4
r4 = r4&(~M_Mask)
[Port_Data_D] = r4
retf
//========================================================
// 汇编格式: F_DataPort_Output
// C格式: NULL
// 实现功能: 把数据端口设置为输入口
//========================================================
F_DataPort_Output:
r3 = [Port_Dir_D]
r3 = r3|M_Mask
[Port_Dir_D] = r3
r3 = [Port_Attrib_D]
r3 = r3|M_Mask
[Port_Attrib_D] = r3
r3 = [Port_Buffer_D]
r3 = r3|M_Mask
[Port_Data_D] = r3
retf
//========================================================
// 汇编格式: F_DataPort_Resum
// C格式: NULL
// 实现功能: 恢复端口设置
//========================================================
F_DataPort_Resum:
r2 = [R_Port_Dir]
[Port_Dir_D] = r2
r2 = [R_Port_Attrib]
[Port_Attrib_D] = r2
r2 = [R_Port_Data]
[Port_Data_D] = r2
retf
//========================================================
// 汇编格式: _IO_Initial
// C格式: void IO_Initial(void)
// 实现功能: I0口初始化程序
//========================================================
.PUBLIC _IO_Initial
_IO_Initial:
push r1,r2 to [sp]
call F_IO_Initial
call F_DataPort_Output
r2 = [Port_Buffer_D] //获取当前端口输出值
r2 = r2&(~M_Mask)
r2 = r2|0x0030
[Port_Data_D] = r2
r2 = [Port_Buffer_C] //获取当前端口输出值
r2 = r2&(~(LCD_RW+LCD_RS))
[Port_Data_C] = r2
r1 = 3
?IO_Initial_1:
r2 = r2|LCD_EN
[Port_Data_C] = r2 //EN hight
nop
r2 = r2&(~LCD_EN)
[Port_Data_C] = r2 //EN to low
call F_Delay
r1 = r1-1
jnz ?IO_Initial_1
r2 = [Port_Buffer_D]
r2 = r2&(~M_Mask)
r2 = r2|0x0038
[Port_Data_D] = r2
r2 = [Port_Buffer_C]
r2 = r2|LCD_EN
[Port_Buffer_C] = r2
nop
r2 = r2&(~LCD_EN)
[Port_Buffer_C] = r2 //EN to low
call F_Delay
pop r1,r2 from [sp]
retf
//========================================================
// 汇编格式: F_LCD_W_Command
// C格式: void LCD_W_Command(unsigned int com)
// 实现功能: 写指令子函数
// 入口参数: Com(利用R1传递) 要写入LCD的指令
//========================================================
.PUBLIC _LCD_W_Command,F_LCD_W_Command
_LCD_W_Command:
F_LCD_W_Command:
push r1,r4 to [sp]
call F_DataPort_Input
r2 = [Port_Buffer_C] //获取当前端口输出值
r2 = r2|LCD_RW
r2 = r2&(~(LCD_EN+LCD_RS)) //RW=1 RS=0 EP=0
[Port_Data_C] = r2
nop
?LCD_W_Command_BZ:
r2 = r2|LCD_EN
[Port_Data_C] = r2 //EN hight!
r3 = [Port_Data_D]
r2 = r2&(~LCD_EN)
[Port_Data_C] = r2 //EN low!
test r3,0x0080
jnz ?LCD_W_Command_BZ //Busy? yes---Loop
call F_DataPort_Output
r2 = r2&(~LCD_RW)
[Port_Data_C] = r2 //RW low
r2 = [Port_Buffer_D]
r2 = r2&(~M_Mask)
r2 = r2|r1 //or the command
[Port_Data_D] = r2
r2 = [Port_Buffer_C]
r2 = r2|LCD_EN //EN hight
[Port_Data_C] = r2
nop
nop
r2 = r2&(~LCD_EN)
[Port_Data_C] = r2 //EN low
call F_DataPort_Resum //resum the IO Port
pop r1,r4 from [sp]
retf
//========================================================
// 汇编格式: F_LCD_W_Data
// C格式: void LCD_W_Data(unsigned int dat)
// 实现功能: 写显示数据函数
// 入口参数: Data(利用R1传递) 要写入LCD的数据
//========================================================
.PUBLIC _LCD_W_Data,F_LCD_W_Data
_LCD_W_Data:
F_LCD_W_Data:
push r1,r4 to [sp]
call F_DataPort_Input
r2 = [Port_Buffer_C] //获取当前端口输出值
r2 = r2|LCD_RW
r2 = r2&(~(LCD_EN+LCD_RS)) //RW=1 RS=0 EP=0
[Port_Data_C] = r2
nop
?LCD_W_Data_BZ:
r2 = r2|LCD_EN
[Port_Data_C] = r2 //EN hight!
r3 = [Port_Data_D]
r2 = r2&(~LCD_EN)
[Port_Data_C] = r2 //EN low!
test r3,0x0080
jnz ?LCD_W_Data_BZ //Busy? yes---Loop
call F_DataPort_Output
r2 = r2&(~LCD_RW)
r2 = r2|LCD_RS //RS hight
[Port_Data_C] = r2 //RW low
r2 = [Port_Buffer_D]
r2 = r2&(~M_Mask)
r2 = r2|r1 //or the command
[Port_Data_D] = r2
r2 = [Port_Buffer_C]
r2 = r2|LCD_EN //EN hight
[Port_Data_C] = r2
nop
nop
r2 = r2&(~LCD_EN)
[Port_Data_C] = r2 //EN low
call F_DataPort_Resum //resum the IO Port
pop r1,r4 from [sp]
retf
//========================================================
// 汇编格式: F_Read_Data
// C格式: unsigned int Read_Data(void)
// 实现功能: 读显示数据函数
// 入口参数: 无
// 出口参数: 读回的数据 r1返回
//========================================================
.PUBLIC _Read_Data,F_Read_Data
_Read_Data:
F_Read_Data:
push r2,r4 to [sp]
call F_DataPort_Input
r2 = [Port_Buffer_C] //获取当前端口输出值
r2 = r2|LCD_RW
r2 = r2&(~(LCD_EN+LCD_RS)) //RW=1 RS=0 EP=0
[Port_Data_C] = r2
?Read_Data_BZ:
r2 = r2|LCD_EN
[Port_Data_C] = r2 //EN hight!
r3 = [Port_Data_D]
r2 = r2&(~LCD_EN)
[Port_Data_C] = r2 //EN low!
test r3,0x0080
jnz ?Read_Data_BZ //Busy? yes---Loop
r2 = r2|LCD_RS //RS hight
[Port_Data_C] = r2 //
nop
r2 = r2|LCD_EN //EN hight
[Port_Data_C] = r2
nop
nop
r1 = [Port_Data_D]
r1 = r1&M_Mask
r2 = r2&(~LCD_EN)
[Port_Data_C] = r2 //EN low
call F_DataPort_Resum //resum the IO Port
pop r2,r4 from [sp]
retf
//========================================================
// 汇编格式: F_Read_BZAC
// C格式: unsigned int Read_BZAC(void)
// 实现功能: 读显示数据函数
// 入口参数: 无
// 出口参数: 读回的数据 r1返回
//========================================================
.PUBLIC _Read_BZAC,F_Read_BZAC
_Read_BZAC:
F_Read_BZAC:
push r2,r4 to [sp]
call F_DataPort_Input
r2 = [Port_Buffer_C] //获取当前端口输出值
r2 = r2|LCD_RW
r2 = r2&(~(LCD_EN+LCD_RS)) //RW=1 RS=0 EN=0
[Port_Data_C] = r2
?Read_BZAC_BZ:
r2 = r2|LCD_EN
[Port_Data_C] = r2 //EN hight!
r3 = [Port_Data_D]
r2 = r2&(~LCD_EN)
[Port_Data_C] = r2 //EN low!
test r3,0x0080
jnz ?Read_BZAC_BZ //Busy? yes---Loop
r2 = r2|LCD_EN //EN hight
[Port_Data_C] = r2
nop
r1 = [Port_Data_D]
r1 = r1&M_Mask
r2 = r2&(~LCD_EN)
[Port_Data_C] = r2 //EN low
call F_DataPort_Resum //resum the IO Port
pop r2,r4 from [sp]
retf
//========================================================
// 汇编格式: F_Delay
// C格式: void Delay(unsigned int)
// 实现功能: 延时程序
//========================================================
.PUBLIC F_Delay
F_Delay:
push r1,r3 to [sp]
r1 = 5
F_Delay_1:
r2 = M_Delay_Timers
F_Delay_2:
r3 = 0x0001
[P_Watchdog_Clear] = r3
r2 = r2-1
jnz F_Delay_2
r1 = r1-1
jnz F_Delay_1
pop r1,r3 from [sp]
retf
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -