?? lcd701_drv.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 + -