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

📄 bcd-bin.asm

📁 基于SPMC75的变频电机驱动例子,相当于一个简单的变频器. 望对变频器开发的工程式师有一定的帮助!
💻 ASM
字号:
.CODE

//=============================================================
// ----Function: unsigned int BIN_BCD(unsigned int Data);
// -Description: 十六位二进制转十进制,得5位十进制结果
// --Parameters: None
// -----Returns: None
// -------Notes: r1为源数据,r2、r1返回转换结果
//=============================================================
.PUBLIC _BIN_BCD
  _BIN_BCD: push bp,bp to [sp]		
            r5 = 0				//结果暂存
            push r5,r5 to [sp]	//结果的高位,定义为局部变量
            r4 = 16				//循环计数器          
  BIN_BCDa: r1 += r1
  			r3 = r5 & 0x000f
            r3 += r3,Carry
            cmp r3,9
            jbe BIN_BCDb
            r3 += 6
  BIN_BCDb: r5 &= 0xfff0
			r2 = r5 & 0x00f0
            r5 += r3			//结果更新
			r3 = r5 & 0x00f0
			r3 += r2
			cmp r3,0x0090
            jbe BIN_BCDc
            r3 +=0x0060
  BIN_BCDc: r5 &= 0xff0f
			r2 = r5 & 0x0f00
            r5 += r3			//结果更新
			r3 = r5 & 0x0f00
			r3 += r2
			cmp r3,0x0900
            jbe BIN_BCDd
            r3 +=0x0600
  BIN_BCDd: r5 &= 0xf0ff
			r2 = r5 & 0xf000
			r5 += r3
			r3 = r5 & 0xf000
			r3 += r2
			jcs BIN_BCDf
			cmp r3,0x9000
            jbe BIN_BCDe            
			r3 +=0x6000               
  BIN_BCDe: r5 &= 0x0fff
  			pop r2,r2 from [sp]
  			r2 += r2,Carry
  			push r2,r2 to [sp]
  BIN_BCDg: r5 += r3
  			r4 -= 1
            jnz BIN_BCDa
            r1 = r5
            pop r4,bp from [sp]
            retf
  BIN_BCDf: pop r2,r2 from [sp]
  			r2 += r2,Carry
  			push r2,r2 to [sp]
  			r3 +=0x6000
  			r5 &= 0x0fff
            jmp BIN_BCDg

//=============================================================
// ----Function: unsigned int BIN_BCD_DF(unsigned int Data);
// -Description: 二进制小数转十进制小数
// --Parameters: None
// -----Returns: None
// -------Notes: 
//=============================================================
.PUBLIC _BIN_BCD_DF
  _BIN_BCD_DF: push bp,bp to [sp]		
            r5 = 0			//结果暂存
            r4 = 16			//循环计数器            
BIN_BCD_DFa:r5 = r5 lsr 1
  			r3 = r1 & 1
  			jz BIN_BCD_DFb
  			r5 |= 0x8000
BIN_BCD_DFb:r3 = r5 & 0xff00
			r2 = r5 & 0x0080
			jz BIN_BCD_DFc
			r5 += 0x00d0
BIN_BCD_DFc:r2 = r5 & 0x0008
			jz BIN_BCD_DFd
			r5 += 0x00fd
BIN_BCD_DFd:r5 &= 0x00ff
			r2 = r3 & 0x8000
			jz BIN_BCD_DFe
			r3 += 0xd000
BIN_BCD_DFe:r2 = r3 & 0x0800
			jz BIN_BCD_DFf
			r3 += 0xfd00
BIN_BCD_DFf:r5 |= r3
			r1 = r1 lsr 1			
  			r4 -= 1
            jnz BIN_BCD_DFa
            r1 = r5
            pop bp,bp from [sp]
            retf

//=============================================================
// ----Function: unsigned int BCD_BIN(unsigned int Data);
// -Description: 十进制整数转二进制整数
// --Parameters: None
// -----Returns: None
// -------Notes: 
//=============================================================
.PUBLIC _BCD_BIN
  _BCD_BIN: push bp,bp to [sp]	
			r2 = 16				//循环计数器
			r3 = 0				//结果寄存器
  BCD_BINf:	r3 = r3 lsr 1
			r4 = r1 & 0x0001
			jz BCD_BINa
			r3 |= 0x8000
  BCD_BINa: r1 = r1 lsr 1
  			r5 = r1 & 0xff00
			r4 = r5 & 0x8000
			jz BCD_BINb
			r5 += 0xd000
  BCD_BINb: r4 = r5 & 0x0800
  			jz BCD_BINc
  			r5 += 0xfd00
  BCD_BINc: r4 = r1 & 0x0080
  			jz BCD_BINd
  			r1 += 0x00d0
  BCD_BINd: r4 = r1 & 0x0008
  			jz BCD_BINe
  			r1 += 0x00fd
  BCD_BINe: r1 &= 0x00ff
  			r1 |= r5
  			r2 -= 1
  			jnz BCD_BINf
  			r1 = r3
  			pop bp,bp from [sp]
  			retf

//=============================================================
// ----Function: unsigned int BCD_BIN_DF(unsigned int Data);
// -Description: 十进制小数转二进制小数
// --Parameters: None
// -----Returns: None
// -------Notes: 
//=============================================================			
.PUBLIC _BCD_BIN_DF
_BCD_BIN_DF:push bp,bp to [sp]		
            r5 = 0				//结果暂存
            r4 = 16				//循环计数器           
BCD_BIN_DFa:r3 = r1 & 0x000f
            r3 += r3
            cmp r3,9
            jbe BCD_BIN_DFb
            r3 += 6
BCD_BIN_DFb:r2 = r1 & 0x00f0
  			r1 &= 0xfff0
            r1 += r3			//结果更新
			r3 = r1 & 0x00f0
			r3 += r2
			cmp r3,0x0090
            jbe BCD_BIN_DFc
            r3 +=0x0060
BCD_BIN_DFc:r2 = r1 & 0x0f00
  			r1 &= 0xff0f
            r1 += r3			//结果更新
			r3 = r1 & 0x0f00
			r3 += r2
			cmp r3,0x0900
            jbe BCD_BIN_DFd
            r3 +=0x0600
BCD_BIN_DFd:r2 = r1 & 0xf000
  			r1 &= 0xf0ff
			r1 += r3
			r3 = r1 & 0xf000
			r3 += r2
			jcs BCD_BIN_DFf		//进位处理
			cmp r3,0x9000
            jbe BCD_BIN_DFe            
			r3 +=0x6000              
BCD_BIN_DFe:r1 &= 0x0fff
			jcs BCD_BIN_DFh
			r1 += r3
			r5 = r5 lsl 1
BCD_BIN_DFg:r4 -= 1
            jnz BCD_BIN_DFa
            r1 = r5
            pop bp,bp from [sp]
            retf
BCD_BIN_DFf:r3 += 0x6000
			r1 &= 0x0fff
BCD_BIN_DFh:r1 += r3
			r5 = r5 lsl 1
			r5 |= 0x0001
			jmp BCD_BIN_DFg

//============================================================================
// ----Function: unsigned int DIV16(unsigned int Data_A,unsigned int Data_B);
// -Description: 16/16 得16位结果 除数的高位不能为1
// --Parameters: None
// -----Returns: None
// -------Notes: 
//============================================================================			
.PUBLIC _DIV16
    _DIV16: r4 = sp + 3		//3.27更改	r4 = sp + 4
  			r3 = [r4 ++]	//3.27更改	r3 = r1
  			r2 = [r4]
  			r4 = 0
			r3 += r3			//左移一位,规格化为Q31格式
			r4 += r4,Carry
  			r1 = fr				//清除AQ标志
            r1 &= 0xbfff
            fr = r1
            divq mr,r2
    		divq mr,r2
    		divq mr,r2
    		divq mr,r2
    		divq mr,r2
    		divq mr,r2
    		divq mr,r2
    		divq mr,r2
    		divq mr,r2
    		divq mr,r2
    		divq mr,r2
    		divq mr,r2
    		divq mr,r2
    		divq mr,r2
    		divq mr,r2
    		divq mr,r2
			r1 = r3				//返回结果
			retf

//============================================================================
// ----Function: unsigned int DIV32_16(long unsigned int Data_A,unsigned int Data_B);
// -Description: 32/16 得16位结果的无符号数除法!  同时可得到余数
// --Parameters: None
// -----Returns: None
// -------Notes: 
//============================================================================
.PUBLIC _DIV32_16
 _DIV32_16: r4 = sp + 3			//3.27更改   r4 = sp + 5
			r1 = [r4 ++]		//3.27添加
			r2 = [r4 ++]		//3.27添加
  			r3 = [r4]
			r4 = 16
 DIV_3216B: r1 += r1   			//商左移一位
      		r2 += r2,Carry
      		jcs DIV_3216C
   			cmp r2,r3
   			jcs DIV_3216C
			r4 -= 1
  			jnz DIV_3216B
			retf
 DIV_3216C: r2 -= r3			
 DIV_3216D: r1 += 1
			r4 -= 1
  			jnz DIV_3216B
			retf


//============================================================================
// ----Function: long unsigned int DIV32(long unsigned int Data_A,long unsigned int Data_B);
// -Description: 32/32 得32位结果的无符号数除法!  同时可得到余数
// --Parameters: None
// -----Returns: None
// -------Notes: 
//============================================================================
.SRAM
.VAR Temp_H
.VAR Temp_L
.CODE
.PUBLIC _DIV32
    _DIV32: push bp,bp to [sp]
  			bp = sp + 1
  			r1 = [bp + 3]		//3.27添加
  			r2 = [bp + 4]		//3.27添加
  			r3 = [bp + 6]
  			[Temp_H] = r3
  			r3 = [bp + 5]
  			[Temp_L] = r3
  			r3 = 0
			r4 = r3
			r5 = 32
   DIV_32B: r1 += r1   			//商左移一位
      		r2 += r2,Carry  
   			r3 += r3,Carry		//被除数左移一位
     		r4 += r4,Carry
     		jcs DIV_32C
			r3 -= [Temp_L]
   			r4 -= [Temp_H],Carry
   			jcs DIV_32D
   			r3 += [Temp_L]		//不够减则恢复
   			r4 += [Temp_H],Carry
			r5 -= 1
  			jnz DIV_32B
			pop bp,bp from [sp]
			retf
   DIV_32C:	r3 -= [Temp_L]
   			r4 -= [Temp_H],Carry
   DIV_32D: r1 += 1
			r5 -= 1
  			jnz DIV_32B
			pop bp,bp from [sp]
			retf

//============================================================================
// ----Function: unsigned int MUL_L_Shift6(unsigned int Data_A,unsigned int Data_B);
// -Description: (A*B) << 6
// --Parameters: None
// -----Returns: None
// -------Notes: 
//============================================================================
.PUBLIC _MUL_L_Shift6
_MUL_L_Shift6:
			r2 = sp + 3			//3.27更改   r2 = sp + 4
			r1 = [r2 ++]		//3.27添加
  			r3 = [r2]
  			mr = r1*r3,uu
			r3 = r3 lsl 4
			r4 = r4 rol 4
			r3 = r3 lsl 4
			r4 = r4 rol 2
			r1 = r4				//返回结果
			retf	

//=============================================================
// ----Function: unsigned int MUL_DIV(unsigned int Data, \
//					unsigned int Q_Data,unsigned int X_Data);
// -Description: Data*Q_Data/X_Data
// --Parameters: 这里主要用作数据格式转化
// -----Returns: 
// -------Notes: 
//============================================================= 
.PUBLIC _MUL_DIV
  _MUL_DIV: r2 = sp + 3				//3.27更改   r2 = sp + 4
  			r1 = [r2 ++]			//3.27添加
			r3 = [r2 ++]
			mr = r3 * r1,uu
			r2 = [r2]
			r3 += r3
			r4 += r4,Carry
			r1 = fr
            r1 &= 0xbfff
            fr = r1
			divq mr,r2
    		divq mr,r2
    		divq mr,r2
    		divq mr,r2
    		divq mr,r2
    		divq mr,r2
    		divq mr,r2
    		divq mr,r2
    		divq mr,r2
    		divq mr,r2
    		divq mr,r2
    		divq mr,r2
    		divq mr,r2
    		divq mr,r2
    		divq mr,r2
    		divq mr,r2
			r1 = r3
			retf
.end			

⌨️ 快捷键说明

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