📄 lcd_driver_user_a.asm
字号:
//========================================================================
// 文件名: LCD_Driver_User_A.asm
// 作 者: Xinqiang Zhang(email: Xinqiang@Mzdesign.com.cn)
// www.Mzdesign.com.cn
// 日 期: 2007/01/09
// 描 述: 底层接口驱动基础程序集(ASM语言版本)
//
// 参 考: 请参考具体显示器的硬件描述说明书或者是DataSheet,并以此来编写底
// 层接口驱动程序
// 版 本:
// 2007/01/09 First version Mz Design
// 注 意: 该文件当中,主要是对四个重要的函数进行了ASM的重写
//========================================================================
.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 for the port use by LCD Driver
.define LCD_EP 0x0020
.define LCD_RW 0x0010
.define LCD_AO 0x0008
.define LCD_CS 0x0004
.define LCD_CMD_Dir P_IOB_Dir
.define LCD_CMD_Attrib P_IOB_Attrib
.define LCD_CMD_Buffer P_IOB_Buffer
.define LCD_Data_BUS_Out P_IOA_Buffer
.define LCD_Data_BUS_In P_IOA_Data
.define LCD_Data_BUS_Dir P_IOA_Dir
.define LCD_Data_BUS_Attrib P_IOA_Attrib
.define LCD_Data_BUS_Byte 0//1
.code
//========================================================================
// 函数: void SPLC501_DataWrite(unsigned int Data)
// 描述: 写一个字节的显示数据至LCD中的显示缓冲RAM当中
// 参数: Data 写入的数据
// 返回: 无
// 备注: 无
// 版本:
// 2007/01/09 First version
//========================================================================
.public _SPLC501_DataWrite//,_Fill_Dot_LCD
_SPLC501_DataWrite:
SPLC501_DataWrite:
//_Fill_Dot_LCD:
r1 = r1&0x00ff
r2 = [LCD_CMD_Buffer] //得到IOB口的状态
r2 &= ~(LCD_EP+LCD_CS+LCD_RW) //EP CS to Low 20050613 Editby xinqiang
// [LCD_CMD_Buffer] = r2 //EP Low
// r2 = [P_IO_Ctrl_B]
r2 |= LCD_AO
// r2 &= ~(LCD_RW)
[LCD_CMD_Buffer] = r2 //AO Hight, RW Low
.if LCD_Data_BUS_Byte==1
// r3 = r3&0xff00
r1 = r1 LSL 4
r1 = r1 LSL 4
r4 = [LCD_Data_BUS_Out]
r4 = r4&0x00ff
r4 = r4|r1
[LCD_Data_BUS_Out] = r4
.else
r4 = [LCD_Data_BUS_Out]
r4 = r4&0xff00
r4 = r4|r1
[LCD_Data_BUS_Out] = r4
.endif
r2 = [LCD_CMD_Buffer]
r2 |= LCD_EP //EP to Hight
[LCD_CMD_Buffer] = r2
r2 &= ~LCD_EP //EP to Low
r2 |= LCD_CS //CS to Hight 20050613 Editby xinqiag
[LCD_CMD_Buffer] = r2
retf
//========================================================================
// 函数: void SPLC501_RegWrite(unsigned char Command)
// 描述: 写一个字节的数据至LCD中的控制寄存器当中
// 参数: Command 写入的数据,低八位有效(byte)
// 返回: 无
// 备注:
// 版本:
// 2007/01/09 First version
//========================================================================
.public _SPLC501_RegWrite
_SPLC501_RegWrite:
SPLC501_RegWrite:
r1 = r1&0x00ff
r2 = [LCD_CMD_Buffer] //得到IOB口的状态
r2 &= ~(LCD_EP+LCD_CS+LCD_AO+LCD_RW) //EP CS to Low 20050613 Edit by xinqiang
// [LCD_CMD_Buffer] = r2 //EP Low
// r2 &= ~(LCD_AO+LCD_RW)
[LCD_CMD_Buffer] = r2 //AO RW Low
.if LCD_Data_BUS_Byte==1
// r3 = r3&0xff00
r1 = r1 LSL 4
r1 = r1 LSL 4
r4 = [LCD_Data_BUS_Out]
r4 = r4&0x00ff
r4 = r4|r1
[LCD_Data_BUS_Out] = r4
.else
r4 = [LCD_Data_BUS_Out]
r4 = r4&0xff00
r4 = r4|r1
[LCD_Data_BUS_Out] = r4
.endif
r2 = [LCD_CMD_Buffer]
r2 |= LCD_EP //EP to Hight
[LCD_CMD_Buffer] = r2
// nop
r2 &= ~LCD_EP //EP to Low
r2 |= LCD_CS //CS to hight 20050613 Edit by xinqiang
[LCD_CMD_Buffer] = r2
retf
//========================================================================
// 函数: unsigned char SPLC501_DataRead(void)
// 描述: 从LCD中的显示缓冲RAM当中读一个字节的显示数据
// 参数: 无
// 返回: 读出的数据,低八位有效(byte)
// 备注:
// 版本:
// 2007/01/09 First version
// 注意:
//========================================================================
.public _SPLC501_DataRead
_SPLC501_DataRead:
r3 = [LCD_Data_BUS_Dir] //设置数据口为输入
.if LCD_Data_BUS_Byte==1
r2 = r3&0x00ff
.else
r2 = r3&0xff00
.endif
[LCD_Data_BUS_Dir] = r2
r2 = [LCD_CMD_Buffer] //得到IOB口的状态
r2 &= ~(LCD_EP+LCD_CS) //EP CS to Low 20050613 Editby xinqiang
// [LCD_CMD_Buffer] = r2 //EP Low
r2 |= (LCD_AO+LCD_RW)
[LCD_CMD_Buffer] = r2 //AO Hight, RW Hight
// nop
r2 |= LCD_EP
[LCD_CMD_Buffer] = r2 //产生EP高电平,
// nop
r2 &= ~LCD_EP //EP to Low
[LCD_CMD_Buffer] = r2
r1 = [LCD_Data_BUS_In]
// r1 &= M_IO_DATA_MASK
r2 |= LCD_CS
[LCD_CMD_Buffer] = r2
//once more
// r2 = [LCD_CMD_Buffer] //得到IOB口的状态
r2 &= ~(LCD_EP+LCD_CS) //EP CS to Low 20050613 Editby xinqiang
// [LCD_CMD_Buffer] = r2 //EP Low
r2 |= (LCD_AO+LCD_RW)
[LCD_CMD_Buffer] = r2 //AO Hight, RW Hight
// nop
r2 |= LCD_EP
[LCD_CMD_Buffer] = r2 //产生EP高电平,
// nop
r2 &= ~LCD_EP //EP to Low
[LCD_CMD_Buffer] = r2
r1 = [LCD_Data_BUS_In]
// r1 &= M_IO_DATA_MASK
r2 |= LCD_CS
[LCD_CMD_Buffer] = r2
// r2 = [LCD_Data_BUS_Dir] //恢复数据口为输出状态
.if LCD_Data_BUS_Byte==1
// r2 = r2|0xff00
r1 = r1 lsr 4
r1 = r1 lsr 4
.else
// r2 = r2|0x00ff
r1 = r1&0x00ff
.endif
[LCD_Data_BUS_Dir] = r3
retf
//========================================================================
// 函数: void SPLC501_PortInit(void)
// 描述: 与SPLC501连接的端口初始化代码
// 参数: 无
// 返回: 无
// 备注:
// 版本:
// 2007/01/09 First version
// 注意:
//========================================================================
.public _SPLC501_PortInit
_SPLC501_PortInit:
.if LCD_Data_BUS_Byte==1
r1 = [LCD_Data_BUS_Dir]
r1 |= 0xff00
[LCD_Data_BUS_Dir] = r1
r1 = [LCD_Data_BUS_Attrib]
r1 |= 0xff00
[LCD_Data_BUS_Attrib] = r1
r1 = [LCD_Data_BUS_Out]
r1 |= 0xff00
[LCD_Data_BUS_Out] = r1
.else
r1 = [LCD_Data_BUS_Dir]
r1 |= 0x00ff
[LCD_Data_BUS_Dir] = r1
r1 = [LCD_Data_BUS_Attrib]
r1 |= 0x00ff
[LCD_Data_BUS_Attrib] = r1
r1 = [LCD_Data_BUS_Out]
r1 |= 0x00ff
[LCD_Data_BUS_Out] = r1
.endif
r1 = [LCD_CMD_Dir]
r1 |= (LCD_EP+LCD_AO+LCD_RW+LCD_CS)
[LCD_CMD_Dir] = r1
r1 = [LCD_CMD_Attrib]
r1 |= (LCD_EP+LCD_AO+LCD_RW+LCD_CS)
[LCD_CMD_Attrib] = r1
r1 = [LCD_CMD_Buffer]
r1 &= ~(LCD_EP+LCD_AO+LCD_RW+LCD_CS)
[LCD_CMD_Buffer] = r1
retf
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -