Weight_Bed/Multiplication_Division.c

105 lines
2.6 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "H/Function_Init.H"
unsigned long product = 0;//乘积
unsigned long quotient = 0;//商
unsigned int remainder = 0;//余数
typedef struct
{
unsigned char MDU_EXA3Reg; //EXA3寄存器
unsigned char MDU_EXA2Reg; //EXA2寄存器
unsigned char MDU_EXA1Reg; //EXA1寄存器
unsigned char MDU_EXA0Reg; //EXA0寄存器
} MDU_EXAxReg_Typedef;
typedef union
{
MDU_EXAxReg_Typedef MDU_EXAxReg;
unsigned long MDU_Temp;
} MDU_Temp_Union;
//Result_union result;
void Multiplication(unsigned int faciend, unsigned int Multiplier);
void Division(unsigned long dividend,unsigned int divisor);
void Multiplier_Divider_Test()
{
while(1)
{
Multiplication(15,16);
if(product == 240)
{
P03 = ~P03;
}
Division(16,5);
if((quotient == 3) && (remainder == 1))
{
P04 = ~P04;
}
}
}
/****************************************************
*函数名称Multiplication(unsigned int faciend, unsigned int Multiplier)
*函数功能:乘法运算
*入口参数faciendMultiplier
*出口参数:无
****************************************************/
void Multiplication(unsigned int faciend, unsigned int Multiplier)
{
MDU_Temp_Union MDU_ProductTemp;
OPERCON &= ~0x40; //选择乘法
EXA0 = faciend;
EXA1 = faciend>>8;
EXBL = Multiplier;
EXBH = Multiplier>>8;
OPERCON |= 0x80; //开始计算
while(OPERCON & 0x80); //等待计算完成
MDU_ProductTemp.MDU_EXAxReg.MDU_EXA0Reg = EXA0;
MDU_ProductTemp.MDU_EXAxReg.MDU_EXA1Reg = EXA1;
MDU_ProductTemp.MDU_EXAxReg.MDU_EXA2Reg = EXA2;
MDU_ProductTemp.MDU_EXAxReg.MDU_EXA3Reg = EXA3;
product = MDU_ProductTemp.MDU_Temp; //获取乘积
}
/****************************************************
*函数名称Division(unsigned long dividend,unsigned int divisor)
*函数功能:除法运算
*入口参数dividenddivisor
*出口参数:无
****************************************************/
void Division(unsigned long dividend,unsigned int divisor)
{
MDU_Temp_Union MDU_ProductTemp;
MDU_ProductTemp.MDU_Temp = dividend;
OPERCON &= ~0x40;
OPERCON |= 0x40; //选择除法
EXA0 = MDU_ProductTemp.MDU_EXAxReg.MDU_EXA0Reg; //输入除数
EXA1 = MDU_ProductTemp.MDU_EXAxReg.MDU_EXA1Reg;
EXA2 = MDU_ProductTemp.MDU_EXAxReg.MDU_EXA2Reg;
EXA3 = MDU_ProductTemp.MDU_EXAxReg.MDU_EXA3Reg;
EXBL = divisor; //输入被除数
EXBH = divisor>>8;
OPERCON |= 0xC0; //开始计算
while(OPERCON & 0x80); //等待计算完成
MDU_ProductTemp.MDU_EXAxReg.MDU_EXA0Reg = EXA0;
MDU_ProductTemp.MDU_EXAxReg.MDU_EXA1Reg = EXA1;
MDU_ProductTemp.MDU_EXAxReg.MDU_EXA2Reg = EXA2;
MDU_ProductTemp.MDU_EXAxReg.MDU_EXA3Reg = EXA3;
remainder = EXBH*256+ EXBL; //余数
quotient = MDU_ProductTemp.MDU_Temp; //商
}