📄 2808.asm
字号:
.include hardware.inc;
.CONST C_Program_Time = 40 //50*10=500us
.CONST C_blockErase_Time = 6 //500*6 =3ms
.CONST C_read_Time =8 //10us Data Transfer form Cell to Register
.CODE
.DEFINE SM_RE 0X0800 // ==IOB11
.DEFINE SM_CE 0X1000 // ==IOB12
.DEFINE SM_CLE 0X2000 // ==IOB13
.DEFINE SM_ALE 0X4000 // ==IOB14
.DEFINE SM_WE 0X8000 // ==IOB15
.public _SP_WriteCmd;
_SP_WriteCmd: .PROC
push bp to [sp]
bp = sp + 1
push r1 to [sp]
r1 = [bp+3] //cmd
call F_SP_WriteCmd
pop r1 from [sp]
pop bp from [sp]
retf
.ENDP
.public F_SP_WriteCmd;
F_SP_WriteCmd:.proc
push r1,r3 to [sp]
setbit(SM_CLE);
clrbit((~SM_ALE)&(~SM_CE));
NOP;
[P_IOA_Data]=r1
clrbit(~SM_WE);
NOP;
setbit(SM_WE);
nop;
clrbit(~SM_CLE);
setbit(SM_CE);
pop r1,r3 from [sp]
retf
.ENDP
.public _SP_WriteAddr;
_SP_WriteAddr: .PROC
push bp to [sp]
bp = sp + 1
push r1 to [sp]
r1 = [bp+3] //addr
call F_SP_WriteAddr
pop r1 from [sp]
pop bp from [sp]
retf
.ENDP
.public F_SP_WriteAddr;
F_SP_WriteAddr:.proc
push r1,r3 to [sp]
clrbit(~SM_CE);
clrbit(~SM_CLE);
setbit(SM_ALE);
NOP;
[P_IOA_Data]=r1
NOP;
clrbit(~SM_WE);
NOP;
setbit(SM_WE);
clrbit(~SM_ALE);
pop r1,r3 from [sp]
retf
.ENDP
.public _SP_WriteData;
_SP_WriteData: .PROC
push bp to [sp]
bp = sp + 1
push r1 to [sp]
r1 = [bp+3] //Data
call F_SP_WriteData
pop r1 from [sp]
pop bp from [sp]
retf
.ENDP
.public F_SP_WriteData;
F_SP_WriteData:.proc
push r1,r3 to [sp]
clrbit((~SM_CE)&(~SM_ALE)&(~SM_CLE));
NOP;
clrbit(~SM_WE);
[P_IOA_Data]=r1
NOP;
setbit(SM_WE);
pop r1,r3 from [sp]
retf
.ENDP
.public _SP_WriteData_Eoc;
_SP_WriteData_Eoc: .PROC
push bp to [sp]
bp = sp + 1
push r1 to [sp]
r1 = [bp+3] //cmd
call F_SP_WriteData_Eoc
pop r1 from [sp]
pop bp from [sp]
retf
.ENDP
.public F_SP_WriteData_Eoc;
F_SP_WriteData_Eoc:.proc
push r1,r3 to [sp]
setbit(SM_WE);
pop r1,r3 from [sp]
retf
.ENDP
.public _SP_Read_Init
_SP_Read_Init: .proc
push r2,r2 to [sp]
clrbit((~SM_CE)&(~SM_ALE)&(~SM_CLE));
setbit(SM_WE);
R2 = [P_IOA_Dir]; //数据线IOA0~IOA7设为输入
R2 &=0xFF00;
[P_IOA_Dir] = R2;
pop r2,r2 from [sp]
RETF
.endp
.public _SP_Read_Over
_SP_Read_Over: .proc
push r3,r3 to [sp]
R3 = [P_IOA_Dir]; //数据线IOA0~IOA7设为输出
R3 |=0xffff;
[P_IOA_Dir] = R3;
pop r3,r3 from [sp]
RETF
.endp
.public _SP_serial_Read
_SP_serial_Read: .PROC
call F_SP_serial_Read // R1: return value
retf
.ENDP
.public F_SP_serial_Read
F_SP_serial_Read:.proc
push r2,r2 to [sp]
clrbit(~SM_RE);
nop;
R1 = [P_IOA_Data]
setbit(SM_RE);
pop r2,r2 from [sp] // don't pop r1(return value)
retf
.endp
.public _SP_serial_Read1_Eoc
_SP_serial_Read1_Eoc: .PROC
call F_SP_serial_Read1_Eoc // R1: return value
retf
.ENDP
.public F_SP_serial_Read1_Eoc
F_SP_serial_Read1_Eoc:.proc
push r2,r2 to [sp]
setbit(SM_CE);
pop r2,r2 from [sp] //
retf
.endp
//块察除时间3MS//
.PUBLIC _F_Delay_blockErase_Time;
_F_Delay_blockErase_Time: .PROC
r2 = C_blockErase_Time; //6
?L_Wait_blockErase_Time_Over:
call F_Delay_Program_Time;
r2- = 1; //3
jnz ?L_Wait_blockErase_Time_Over; //5
retf;
.ENDP
//写入延时500US//
.PUBLIC _F_Delay_Program_Time;
_F_Delay_Program_Time:.proc
call F_Delay_Program_Time
retf
.endp
.public F_Delay_Program_Time;
F_Delay_Program_Time: .PROC
r1 = C_Program_Time; //6
?L_Wait_Program_Time_Over:
call F_Delay_read_Time;
r1- = 1; //3
jnz ?L_Wait_Program_Time_Over; //5
retf;
.ENDP
//数据建立时间10US/////////Data Transfer form Cell to Register
.PUBLIC _F_Delay_read_Time;
_F_Delay_read_Time: .PROC
call F_Delay_read_Time;
retf
.endp
.PUBLIC F_Delay_read_Time;
F_Delay_read_Time: .PROC
r3 = C_read_Time; //6
?L_Wait_read_Time_Over: //52cycle,1us @ 49Mhz
nop; //4
nop; //4
nop; //4
nop; //4
nop; //4
nop; //4
nop; //4
nop; //4
nop; //4
nop; //4
nop; //4
nop; //4
nop; //4
r3- = 1; //3
jnz ?L_Wait_read_Time_Over; //5
retf; //12
.endp
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -