?? system.asm
字號:
//====================================================================================//
// 文件名: system.asm
// 描 述: 該文件的程序主要用于初始化SPCE061A和PDIUSBD12,以及對PDIUSBD12的讀寫操作
// 日 期: 2003/04/03
//====================================================================================//
.include hardware.inc;
//for led
.public _F_TurnOnFirstLed
.public _F_TurnOffFirstLed
.public _F_TurnOnSecondLed
.public _F_TurnOffSecondLed
//for d12
.public _F_InitWriteD12
.public _F_InitReadD12
.public _F_ReadD12
.public _F_WriteCmdOrDataToD12
//for system
.public _F_System_Initial
.public _F_Interrupt_On
.public _F_Delay
.public _F_Interrupt_Off
.define Fosc_CLK_RATE FoscCLK_49 //選擇不同Fosc信號頻率
.define CPU_CLK_RATE CPUCLK_Fosc //改變CPUClk頻率
.code
//====================================================================
// 函 數: F_System_Initial()
// 語 法: void F_System_Initial(void) (for c)
// 描 述: 該函數用于初始化SPCE061A的中斷、時鐘、I/0、復位PDIUSBD12
// 初始化:
// IOB0,IOB1為同相高電平輸出
// IOB2=INT_N=1為帶上拉電阻的輸入
// IOB3=RESET_N=1為同相高電平輸出
// IOB8=CS_N=1同相高電平輸出
// IOB6=ALE=0同相低電平輸出
// IOB5=WR_N=1為同相高電平輸出
// IOB4=RD_N=1為同相高電平輸出
// 參 數: 無
// 返回值: 無
//=====================================================================
_F_System_Initial: .PROC
PUSH r1,r1 TO [sp];
INT OFF;
r1=0x0100; //開中斷IRQ3_EXT1
[P_INT_Ctrl]=r1;
//[P_INT_Ctrl_New]=r1;
r1=Fosc_CLK_RATE; //
r1|=CPU_CLK_RATE; //設置系統時鐘
[P_SystemClock]=r1;
r1=0xFFFF; //設置IOA為同相高電平輸出
[P_IOA_Dir]=r1;
[P_IOA_Attrib]=r1;
[P_IOA_Data]=r1;
r1=0xFFF0; //設置IOB的高12位為同相高電平輸出,低四位為上拉輸入
[P_IOB_Dir]=r1;
[P_IOB_Attrib]=r1;
r1=0xFFFF;
[P_IOB_Data]=r1;
CALL _F_USB_Io_Initial;
POP r1,r1 FROM [sp];
RETF;
.ENDP;
_F_USB_Io_Initial: .PROC
PUSH r1,r1 TO [sp];
r1 = [P_IOA_Dir];
r1&=0x00FF;
[P_IOA_Dir]=r1;
r1=[P_IOA_Attrib];
r1&=0x00FF; //設置IOA8-IOA15為帶上拉電阻地輸入
[P_IOA_Attrib]=r1;
r1=[P_IOA_Buffer];
r1|=0xFF00;
[P_IOA_Buffer]=r1;
r1=[P_IOB_Dir];//IOB8低輸出,IOB6低輸出,IOB5、IOB4高輸出,IOB3高輸出,IOB2上拉輸入。
r1|=0x0178;
r1&=0xFFFD;
[P_IOB_Dir]=r1;
r1=[P_IOB_Attrib];
r1|=0x0178;
r1&=0xFFFD;
[P_IOB_Attrib]=r1;
r1=[P_IOB_Buffer];//IOB8=CS_N=0,IOB6=ALE=0,IOB5=WR_N=1,IOB4=RD_N=1,IOB3=RESET_N=0,IOB2=1
r1|=0x0034;
R1&=0xFEF7;
[P_IOB_Buffer]=r1;
call F_Delay;//系統復位延時。
r1=[P_IOB_Buffer];//IOB8=CS_N=0,IOB6=ALE=0,IOB5=WR_N=1,IOB4=RD_N=1,IOB3=RESET_N=0,IOB2=1
r1|=0x003C;
R1&=0xFEFF;
[P_IOB_Buffer]=r1;
POP r1,r1 FROM [sp];
RETF
.ENDP
//====================================================================
// 函 數: F_Interrupt_On()
// 語 法: void F_Interrupt_On(void) (for c)
// 描 述: 開中斷函數
// 參 數: 無
// 返回值: 無
// 使用寄存器: 無
//=====================================================================
_F_Interrupt_On: .PROC
F_Interrupt_On:
int irq;
retf;
.endp;
//====================================================================
// 函 數: F_Interrupt_Off()
// 語 法: void F_Interrupt_Off(void) (for c)
// 描 述: 開中斷函數
// 參 數: 無
// 返回值: 無
// 使用寄存器: 無
//=====================================================================
_F_Interrupt_Off: .PROC
F_Interrupt_Off:
int off;
retf;
.endp;
//====================================================================
// 函 數: F_Delay()
// 語 法: void F_Delay(void) (for c)
// 描 述: 延時函數
// 參 數: 無
// 返回值: 無
//=====================================================================
_F_Delay: .proc
F_Delay:
push r1,r2 to [sp];
r2=0x000f;
Loop1:
r1=0xffff;
Loop2:
r1-=1;
jnz Loop2;
r2-=1;
jnz Loop1;
nop;
pop r1,r2 from [sp];
retf;
.endp
//====================================================================
// 函 數: F_TurnOffFirstLed()
// 語 法: void F_TurnOffFirstLed(void) (for c)
// 描 述: 熄滅與IOA0相連的LED
// 參 數: 無
// 返回值: 無
//=====================================================================
_F_TurnOffFirstLed: .proc
push r1 to [sp];
r1=[P_IOA_Buffer];
r1&=0xFFFE;
[P_IOA_Buffer]=r1;
pop r1 from [sp];
retf
.endp
//====================================================================
// 函 數: F_TurnOffFirstLed()
// 語 法: void F_TurnOffFirstLed(void)
// 描 述: 點亮與IOA0相連的LED
// 參 數: 無
// 返回值: 無
//=====================================================================
_F_TurnOnFirstLed: .proc
push r1 to [sp];
r1=[P_IOA_Buffer];
r1|=0x0001;
[P_IOA_Buffer]=r1;
pop r1 from [sp];
retf;
.endp
//====================================================================
// 函 數: SP_TurnOffFirstLed()
// 語 法: void SP_TurnOffFirstLed(void)
// 描 述: 熄滅與IOA1相連的LED
// 參 數: 無
// 返回值: 無
//=====================================================================
_F_TurnOffSecondLed: .proc
push r1 to [sp];
r1=[P_IOA_Buffer];
r1&=0xFFFD;
[P_IOA_Buffer]=r1;
pop r1 from [sp];
retf;
.endp
//====================================================================
// 函 數: SP_TurnOffFirstLed()
// 語 法: void SP_TurnOffFirstLed(void)
// 描 述: 點亮與IOA1相連的LED
// 參 數: 無
// 返回值: 無
//=====================================================================
_F_TurnOnSecondLed: .proc
push r1 to [sp];
r1=[P_IOA_Buffer];
r1|=0x0002;
[P_IOA_Buffer]=r1;
pop r1 from [sp];
retf;
.endp
//====================================================================
// 函 數: F_InitWriteD12()
// 語 法: void F_TurnOffFirstLed(void)
// 描 述: 初始化寫PDIUSBD12
// 參 數: 無
// 返回值: 無
//=====================================================================
_F_InitWriteD12: .proc
push r1,r1 to [sp];
r1 = [P_IOA_Dir];
r1|=0xFF00;
[P_IOA_Dir]=r1;
r1=[P_IOA_Attrib];
r1|=0xFF00; //Port IOA15- IOA8: 同相高電平輸出
[P_IOA_Attrib]=r1;
r1=[P_IOA_Buffer];
r1|=0xFF00;
[P_IOA_Buffer]=r1;
r1=[P_IOB_Buffer];//IOB8=CS_N=0,IOB6=ALE=0,IOB5=WR_N=1,IOB4=RD_N=1,IOB3=RESET_N=1,IOB2=1
r1|=0x0034;
R1&=0xFEFF;
[P_IOB_Buffer]=r1;
pop r1,r1 from [sp];
retf ;
.endp
//====================================================================
// 函 數: F_InitReadD12()
// 語 法: void F_InitReadD12(void)
// 描 述: 初始化讀PDIUSBD12
// 參 數: 無
// 返回值: 無
//=====================================================================
_F_InitReadD12: .PROC
push r1,r1 to [sp];
r1 = [P_IOA_Dir];
r1&=0x00FF;
[P_IOA_Dir]=r1;
r1=[P_IOA_Attrib];
r1|=0xFF00; //Port IOA15- IOA8: 設置為懸浮式輸入input(FL)
[P_IOA_Attrib]=r1;
r1=[P_IOA_Buffer];
r1&=0x00FF;
[P_IOA_Buffer]=r1;
r1=[P_IOB_Buffer];//IOB8=CS_N=0,IOB6=ALE=0,IOB5=WR_N=1,IOB4=RD_N=1,IOB3=RESET_N=1,IOB2=1
r1|=0x0034;
R1&=0xFEFF;
[P_IOB_Buffer]=r1;
pop r1,r1 from [sp];
retf
.ENDP
//====================================================================
// 函 數: F_ReadD12()
// 語 法: void F_ReadD12(unsigned int D_Addr)
// 描 述: 從PDIUSBD12讀數據
// 參 數: D_Addr:為偶地址0xff02
// 返回值: r1
//=====================================================================
_F_ReadD12: .PROC
push bp to [sp];
bp = sp + 1 ;
r1 = [bp+3] ; // D12 Address
call F_ReadD12; // r1: return value
pop bp from [sp] ;
retf ;
.ENDP
F_ReadD12:
push r2,r3 to [sp];
r1 = r1 lsl 4; // move 02 to IOA8-IOA15
r1 = r1 lsl 4;
r2 = [P_IOA_Data];
r2&= 0x00FF;
r1|=r2;
[P_IOA_Data] = r1; // 送偶地址到D12
r3=[P_IOB_Buffer];
r3&=0xFEFF; // CS_N=0, ALE=1,WR_N=1,RD_N=1;RESET_N=1,INT_N=1
r3|=0x007C;
[P_IOB_Buffer] = r3;
r3=[P_IOB_Buffer];
r3&=0xFEBF; // CS_N=0, ALE=0,WR_N=1,RD_N=1;RESET_N=1,INT_N=1
r3|=0x003C;
[P_IOB_Buffer] = r3;
r3=[P_IOB_Buffer];
r3&=0xFEAF; // CS_N=0, ALE=0,WR_N=1,RD_N=0;RESET_N=1,INT_N=1
r3|=0x002C;
[P_IOB_Buffer] = r3;
nop;
r1 = [P_IOA_Data]; // Get data
r1 = r1 lsr 4; // Prepare high 8 bits Addr. to low 8 bits
r1 = r1 lsr 4; // Get low byte data
r2 = [P_IOB_Buffer];
r2 &=0xFEBF
r2 |= 0x003C; // CS_N=0,ALE=0,WR_N=1,RD_N=1 ;RESET_N=1,INT_N=1
[P_IOB_Buffer] = r2; //
pop r2,r3 from [sp]; // don't pop r1(return value)
retf ;
//===================================================================================================
// 函 數: F_WriteCmdOrDataToD12()
// 語 法: void F_WriteCmdOrDataToD12(unsigned int D_or_C_Addr,unsigned int Data_or_Command)
// 描 述: 向PDIUSBD12寫數據或命令
// 參 數: D_or_C_Addr:地址參數;Data_or_Command:命令或數據參數
// 返回值: 無
//===================================================================================================
_F_WriteCmdOrDataToD12: .PROC
push bp to [sp] ;
bp = sp + 1;
push r1,r2 to [sp];
r1 = [bp+3]; // Address
r2 = [bp+4] ; // Data
call F_WriteCmdOrDataToD12;
pop r1,r2 from [sp];
pop bp from [sp] ;
retf ;
.ENDP
F_WriteCmdOrDataToD12:
push r1,r3 to [sp];
r1 = r1 lsl 4;
r1 = r1 lsl 4;
r2 = r2 lsl 4; // shift low 8 bits data to high 8 bits
r2 = r2 lsl 4; //
r3 = [P_IOA_Buffer];
r3 &=0x00FF;
r1 |=r3;
[P_IOA_Buffer] = r1; // move 02 or 03 Addr to IOA8-IOA15
r1 = [P_IOB_Buffer];
r1&=0xFEFF;
r1|=0x007C; // CS_N=0,ALE=IOA7=1,WR_N=1,RD_N=1,RESET_N=1,INT_N=1
[P_IOB_Buffer] = r1; // ALE=1
r1 = [P_IOB_Buffer];
r1&=0xFEBF;
r1|=0x003C; // CS_N=0,ALE=0,WR_N=1,RD_N=1,RESET_N=1,INT_N=1
[P_IOB_Buffer] = r1; // 在ALE 下降沿的時候,D12鎖定地址;
r1= [P_IOA_Buffer];
r1&=0x00FF;
r2|=r1;
[P_IOA_Buffer] = r2; // 準備數據寫入D12
r1 = [P_IOB_Buffer];
r1&=0xFE9F; // CS_N=0,ALE=0,WR_N=0,RD_N=1;RESET_N=1,INT_N=1
r1|=0x001C
[P_IOB_Buffer] = r1;
r1 = [P_IOB_Buffer];
r1&=0xFEBF; // CS_N=0,ALE=0,WR_N=1,RD_N=1;RESET_N=1,INT_N=1
r1|=0x003C
[P_IOB_Buffer]=r1;
pop r1,r3 from [sp];
retf;
.PUBLIC _F_Clear_WatchDog
_F_Clear_WatchDog:
PUSH r1 TO [SP];
r1=0x0001;
[P_Watchdog_Clear]=r1;
POP r1 FROM [SP];
RETF;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -