⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 st39vf040.asm

📁 用凌阳的十六位单片机SPCE061A做得语音开发板,可以录播WMA格式的音乐,外挂ST39VF040存储,可以存几十首歌,有音频编解码代码
💻 ASM
字号:
//========================================================================================
// Progarm: ST39VF040.asm 
// By: renjianhe

// IOA0-IOA7 ==> DB0-DB7
// IOA8-IOA15==> Addr8 -Addr15
// IOB0-IOB2 ==> Addr16-Addr18
// IOB12-IOB15 ==> ALE+OE+WE+CE    ALE高电平使能
//========================================================================================
.INCLUDE SPCE061A.inc

.DEFINE AE_BIT_DIS 0x1000
.DEFINE RE_BIT_DIS 0x2000
.DEFINE WE_BIT_DIS 0x4000
.DEFINE CE_BIT_DIS 0x8000
//////////////////////////////////////////////
//ST39VF040 command
/////////////////////////////////////////////
.data
        Software_bytewrite_addr: .dw 0x5555,0x2aaa,0x5555
        Software_bytewrite_data: .dw 0x00aa,0x0055,0x00a0
		Software_chiperase_addr: .dw 0x5555,0x2aaa,0x5555,0x5555,0x2aaa,0x5555
		Software_chiperase_data: .dw 0x00aa,0x0055,0x0080,0x00aa,0x0055,0x0010
		Software_sectorerase_addr: .dw 0x5555,0x2aaa,0x5555,0x5555,0x2aaa
		Software_sectorerase_data: .dw 0x00aa,0x0055,0x0080,0x00aa,0x0055

.IRAM
.VAR Read_Byte=0
.VAR Read_Byte2=0
.VAR Write_Byte=0

.PUBLIC _ERASE_ST39VF040
.PUBLIC _ERASE_ST39VF040_Sector
.PUBLIC _Write_ST39VF040_One_Word
.PUBLIC _Read_ST39VF040_One_Word

.CODE
//----------------------------------------------------------------------
_ERASE_ST39VF040_Sector:
    PUSH bp TO [SP]
    R5 = SP 
    R4 = [R5 + 4]           //get AddrL
	R5 = 0x0000    
Chip_SectorErase:
	R1 = R5 +  Software_sectorerase_addr
	R3 = R5 +  Software_sectorerase_data
	R1 = [R1]      //get LOW address
	R3 = [R3]      //get data
	R2 = 0x0000    //get HIGH address
	call Write_ST39VF040_One_Byte;
	R5 = R5 + 1
	CMP R5,5
	JNE  Chip_SectorErase
	R2=R4 LSR 4;
	R1=R4 & 0x000F
	R1=R1 LSL 4;
	R1=R1 LSL 4;
	R1=R1 LSL 4;
	R3= 0x0030;	
	call Write_ST39VF040_One_Byte;	
//	CALL Delay100uS	                //delay 100us
	POP bp FROM [SP]
RETF
//......................................................................
_ERASE_ST39VF040:
    PUSH bp TO [SP]
	R5 = 0x0000    
Chip_MassErase_L:
	R1 = R5 +  Software_chiperase_addr
	R3 = R5 +  Software_chiperase_data
	R1 = [R1]      //get LOW address
	R3 = [R3]      //get data
	R2 = 0x0000    //get HIGH address
	call Write_ST39VF040_One_Byte;
	R5 = R5 + 1
	CMP R5,6
	JNE  Chip_MassErase_L
	CALL Delay11ms	                //delay 10ms
	POP bp FROM [SP]
RETF
//----------------------------------------------------------------------
ProtectDisable:
    PUSH R1,R5 TO [SP]
	R5 = 0x0000    
Chip_Protect_L:
	R1 = R5 +  Software_bytewrite_addr
	R3 = R5 +  Software_bytewrite_data
	R1 = [R1]      //get LOW address
	R3 = [R3]      //get data
	R2 = 0x0000    //get HIGH address
	call Write_ST39VF040_One_Byte;
	R5 = R5 + 1
	CMP R5,3
	JNE  Chip_Protect_L
	POP R1,R5 FROM [SP]
RETF
//----------------------------------------------------------------------
_Write_ST39VF040_One_Word:
	PUSH R1,R5 TO [SP]
    R5 = SP 
    R1 = [R5 + 8]           //get AddrL
    R2 = [R5 + 9]           //get AddrH
    R3 = [R5 + 10]          //get Data
    R4 = [R5 + 10]
    [Write_Byte]=R4
    R3=R4&0x00FF;
    CALL  ProtectDisable
    CALL  Write_ST39VF040_One_Byte    
	CMP R1,0xFFFF;
	JNE	Inc_WriteAddr;
	r1=0;
	r2+=1;
	jmp WriteNextByte;
Inc_WriteAddr:
	r1+=1;
WriteNextByte:
    R4=[Write_Byte]
	R3=R4 LSR 4;
	R3=R3 LSR 4;
	CALL Delay200uS
	CALL  ProtectDisable
 	CALL  Write_ST39VF040_One_Byte;
    POP R1,R5 FROM [SP]
RETF    
//----------------------------------------------------------------------
Write_ST39VF040_One_Byte:
	PUSH R1,R5 TO [SP];		
	R4 = [P_IOB_Data]
    R4 &= 0x0FFF
	R4 |= (AE_BIT_DIS|RE_BIT_DIS|WE_BIT_DIS|CE_BIT_DIS) //ALE=1,CE=1,WE=1,OE=1
    R4 &= 0xFFF8	
	R4 |= R2
	[P_IOB_Data] = R4    //write AddrH
	[P_IOA_Data] = R1   	//write AddrL

    R4 &= 0x0FFF
	R4 |= (RE_BIT_DIS|WE_BIT_DIS|CE_BIT_DIS) //ALE=0,CE=1,WE=1,OE=1
    [P_IOB_Data] = R4    //change to data
    
    R1 &=0xFF00
    R1 |=R3
    [P_IOA_Data] = R1   	//data output 

    R4 &= 0x0FFF
	R4 |= (RE_BIT_DIS) //ALE=0,CE=0,WE=0,OE=1
    [P_IOB_Data] = R4 

    CALL Delay100uS
    
    R4 &= 0x0FFF
    R4 |= (AE_BIT_DIS|WE_BIT_DIS|CE_BIT_DIS|RE_BIT_DIS) //ALE=1,CE=1,WE=1,OE=1
    [P_IOB_Data] = R4 

	POP R1,R5 FROM [SP];
RETF
//----------------------------------------------------------------------
_Read_ST39VF040_One_Word:
    PUSH R2,R5 TO [SP]
    R5 = SP
    R1 = [R5 + 7] //	[AddrL] = R1
    R2 = [R5 + 8] //    [AddrH] = R2 
    CALL Read_ST39VF040_One_Byte; 
    R3 = [Read_Byte];               //read Data 
    [Read_Byte2]=R3;
    CMP R1,0xFFFF;
    JNE	INC_Addr;
	R1=0x0000;
	R2+=1;
	jmp GetNextByte;
INC_Addr:
	R1+=1;
GetNextByte:
	CALL Read_ST39VF040_One_Byte; 
	R1=[Read_Byte]; 
	R1=R1 LSL 4;
	R1=R1 LSL 4;
	R1+=[Read_Byte2];
    POP R2,R5 FROM [SP]
RETF 
//----------------------------------------------------------------------
Read_ST39VF040_One_Byte:
    PUSH R1,R5 TO [SP]
    R4 = [P_IOB_Data]
    R4 &= 0x0FFF
	R4 |= (AE_BIT_DIS|RE_BIT_DIS|WE_BIT_DIS|CE_BIT_DIS) //ALE=1,CE=1,WE=1,OE=1
    R4 &= 0xFFF8	
	R4 |= R2
	[P_IOB_Data] = R4    //write AddrH
	[P_IOA_Data] = R1    //write AddrL
	 
    R4 &= 0x0FFF
	R4 |= (RE_BIT_DIS|WE_BIT_DIS|CE_BIT_DIS) //ALE=0,CE=1,WE=1,OE=1
    [P_IOB_Data] = R4    //change to data

    R5 = [P_IOA_Dir]
	R5 &= 0xFF00
	[P_IOA_Dir] = R5
        
    R4 &= 0x0FFF
	R4 |= (WE_BIT_DIS) //ALE=0,CE=0,WE=1,OE=0
    [P_IOB_Data] = R4 
    
    R5=0x0001
    [P_Watchdog_Clear] = R5
    
    R1 = [P_IOA_Data]          //get data 
    R1 &= 0x00FF 
    [Read_Byte] = R1;
    
    R5 = [P_IOA_Dir]
	R5 |= 0x00FF
	[P_IOA_Dir] = R5
    
    R4 &= 0x0FFF
	R4 |= (AE_BIT_DIS|WE_BIT_DIS|RE_BIT_DIS|CE_BIT_DIS) //ALE=1,CE=1,WE=1,OE=1
    [P_IOB_Data] = R4 

    POP R1,R5 FROM [SP]
    RETF     
///////////////////////////////////////////////////////////////
//Function : 100us Dealy for S_Flash programming time (base on CPUCLK= 24MHz)
Delay11ms:
        push r1,r1 to [sp];
        //r1=17*10;
        r1=20*20;  // delay 
L_LoopDelay11:
        call    Delay100uS;
        r1-=1;
        jne     L_LoopDelay11
        pop r1,r1 from [sp];
        retf;


///////////////////////////////////////////////////////////////
//Function : 100us Dealy for S_Flash programming time (base on CPUCLK= 24MHz)
Delay200uS:
        push r1 to [sp]; //7
        r1=100;  //6
L_DelayLoop2:
        r1-=1;  //3
        jne     L_DelayLoop2;   //5
        pop r1 from [sp];    //7
retf;      //12

Delay100uS:
        push r1 to [sp]; //7
        r1=50;  //6
L_DelayLoop:
        r1-=1;  //3
        jne     L_DelayLoop;   //5
        pop r1 from [sp];    //7
retf; 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -