📄 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为同相高电平输出
// IOB4=CS_N=1同相高电平输出
// IOB5=ALE=0同相低电平输出
// IOB6=WR_N=1为同相高电平输出
// IOB7=RD_N=1为同相高电平输出
// 参 数: 无
// 返回值: 无
//=====================================================================
_F_System_Initial: .PROC
push R1,R1 to [sp];
int off;
R1=0x0100; //开中断IRQ3_EXT1
[P_INT_Ctrl_New]=R1;
R1=Fosc_CLK_RATE; //
R1|=CPU_CLK_RATE; //设置系统时钟
[P_SystemClock]=R1;
R1=0x00ff; //设置IOA8-IOA15为带上拉电阻地输入
[P_IOA_Dir]=R1; //设置IOA0-IOA7为同相低电平输出
[P_IOA_Attrib]=R1;
R1=0xff00;
[P_IOA_Data]=R1;
R1=0xFFFB; //CS_N=IOB4=1,ALE=IOB5=0,WR_N=IOB6=1,RD_N=IOB7=1;
[P_IOB_Dir]=R1; //IOB3=RESET_N=1,IOB2=INT_N=1,IOB0、IOB1输出
[P_IOB_Attrib]=R1; //不选中D12
R1=0xFFDF ;
[P_IOB_Data]=R1;
R1=0xFFC7;
[P_IOB_Data]=R1; //CS_N=0,ALE=0,WR_N=1,RD_N=1,RESET_N=0,INT_N=1
call F_Delay; //系统复位延时。
R1=0xFFCF;
[P_IOB_Data]=R1; //CS_N=0,ALE=0,WR_N=1,RD_N=1,RESET_N=1,INT_N=1
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_Data]=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_Data]=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_Data]=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_Data]=R1;
pop R1 from [sp];
retf;
.endp
//====================================================================
// 函 数: F_InitWriteD12()
// 语 法: void F_TurnOffFirstLed(void)
// 描 述: 初始化写PDIUSBD12
// 参 数: 无
// 返回值: 无
//=====================================================================
_F_InitWriteD12: .proc
push R1,R1 to [sp];
R1 = 0xFFFF;
[P_IOA_Dir] = R1; // Port IOA15- IOA8: 同相高电平输出
[P_IOA_Attrib] = R1; //
R1 = 0xFF00; //
[P_IOA_Data] = R1; //
R1 = 0x00Cf; //
[P_IOB_Data] = R1; //
pop R1,R1 from [sp];
retf ;
.endp
//====================================================================
// 函 数: F_InitReadD12()
// 语 法: void F_InitReadD12(void)
// 描 述: 初始化读PDIUSBD12
// 参 数: 无
// 返回值: 无
//=====================================================================
_F_InitReadD12: .PROC
push R1,R1 to [sp];
R1 = 0x00FF ;
[P_IOA_Dir] = R1; // Port IOA15- IOA8: 设置为悬浮式输入input(FL)
R1 = 0xFFFF; //
[P_IOA_Attrib] = R1; //
R1 = 0x0000; //
[P_IOA_Data] = R1; //
R1 = 0x00Cf; //
[P_IOB_Data] = 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;
[P_IOA_Data] = R1; // 送偶地址到D12
R3 = 0x00EF; // CS_N=0, ALE=IOB8=1,WR_N=1,RD_N=1;RESET_N=1,INT_N=1
[P_IOB_Data] = R3;
R1=0x00Cf;
[P_IOB_Data] = R1; // CS_N=0,ALE=0,WR_N=1,RD_N=1;RESET_N=1,INT_N=1
R1=0x004f;
[P_IOB_Data] = R1; // CS_N=0,ALE=0,WR_N=1,RD_N=0;RESET_N=1,INT_N=1
nop;
R1 = [P_IOA_Data]; // Get data
R1 = R1 lsr 4; // Prepare high 8 bits Addr. to low 8 bits
R2 = R1 lsr 4; // Get low byte data
R1=R2; // R1 save ruturn value
R2 = 0x00CF; // 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; //
[P_IOA_Data] = R1; // move 02 or 03 Addr to IOA8-IOA15
R1=0x00EF; // CS_N=0,ALE=IOA7=1,WR_N=1,RD_N=1,RESET_N=1,INT_N=1
[P_IOB_Data] = R1; // ALE=1
R1=0x00CF; // CS_N=0,ALE=IOA7=0,WR_N=1,RD_N=1;RESET_N=1,INT_N=1
[P_IOB_Data] = R1; // 在ALE 下降沿的时候,D12锁定地址;
R1=0x008F;
[P_IOA_Buffer] = R2; // 准备数据写入D12
[P_IOB_Data] = R1; // CS_N=0,ALE=0,WR_N=0,RD_N=1;RESET_N=1,INT_N=1
nop;
R1=0x00CF; // CS_N=0,ALE=0,WR_N=1,RD_N=1;
[P_IOB_Data] = 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 + -