嘿,亲!知识可是无价之宝呢,但咱这精心整理的资料也耗费了不少心血呀。小小地破费一下,绝对物超所值哦!如有下载和支付问题,请联系我们QQ(微信同号):813200300
本次赞助数额为: 3 元微信扫码支付:3 元
请留下您的邮箱,我们将在2小时内将文件发到您的邮箱
用Proteus仿真51单片机控制矩阵键盘和数码管,可计算加、减、乘、除、lg、ln,用Keil写的程序。
/*******************************************************************************
* 函数名 : main
* 函数功能 : 主函数
* 输入 : 无
* 输出 : 无
*******************************************************************************/
int main()
{
float sub_01=0,sub_02=0,result= 8.;
int8 UART_str[10];
InitCalParameter(&g_DigData, &g_NumCount, &g_IsHaveDot, &g_KeyValue, &g_CalNum);
g_KeyIsNum = FALSE;
GPIO_Init();
UART_Init();
LSA=0; //给一个数码管提供位选
LSB=0;
LSC=0;
CloseBeep();
UART_SendStrNoInt("\r\nSTC89C52RC Calculater\r\n2022, 04, 09\r\n");
#ifndef UART_DEBUG
UART_SendStrNoInt("\r\nClose UART print!\r\n");
UART_Close();
#endif
InitTimer0_20ms();
while(1)
{
KeyScan(&g_KeyValue, &g_KeyIsNum, g_NumCount);
GetCalculateNum(); //输入计算数据
if (g_KeyValue == ST_Clear) //清除按键
{
InitCalParameter(&g_DigData, &g_NumCount, &g_IsHaveDot, &g_KeyValue, &g_CalNum);
#ifdef UART_DEBUG
UART_SendStrNoInt("\r\nClear \r\n");
#endif
}
else if (g_KeyValue == ST_Add) //加法按键
{
CalNum2Str((uint8*)&UART_str[0], &g_CalNum);
#ifdef UART_DEBUG
UART_SendStrNoInt("\r\nFirst num: ");
UART_SendStrNoInt((uint8*)&UART_str[0]);
UART_SendStrNoInt("\r\n");
#endif
sub_01 = atof(UART_str); //计算第一个数的值存到sub_01里
InitCalParameter(&g_DigData, &g_NumCount, &g_IsHaveDot, &g_KeyValue, &g_CalNum);
while(1)
{
KeyScan(&g_KeyValue, &g_KeyIsNum, g_NumCount);
GetCalculateNum();
if (g_KeyValue == ST_Equal)
{
break;
}
else if (g_KeyValue == ST_Clear) //清除按键
{
InitCalParameter(&g_DigData, &g_NumCount, &g_IsHaveDot, &g_KeyValue, &g_CalNum);
#ifdef UART_DEBUG
UART_SendStrNoInt("\r\nClear \r\n");
#endif
break;
}
}
CalNum2Str((uint8*)&UART_str[0], &g_CalNum);
#ifdef UART_DEBUG
UART_SendStrNoInt("\r\nSecond num: ");
UART_SendStrNoInt((uint8*)&UART_str[0]);
#endif
g_KeyValue = ST_Null;
sub_02 = atof(UART_str); //计算第2个数的值存到sub_02里
result = sub_01 sub_02; //加法计算
sprintf(UART_str, "%.7f", result);
if (FALSE == GetDigDataStr(g_DigData, UART_str))
{
#ifdef UART_DEBUG
UART_SendStrNoInt("\r\nError !\r\n");
#endif
FillDigDataError(g_DigData);
ErrorBeep();
}
#ifdef UART_DEBUG
UART_SendStrNoInt("\r\nResult is: ");
UART_SendStrNoInt((uint8*)&UART_str[0]);
#endif
}
else if (g_KeyValue == ST_Subtract) //减法按键
{
CalNum2Str((uint8*)&UART_str[0], &g_CalNum);
#ifdef UART_DEBUG
UART_SendStrNoInt("\r\nFirst num: ");
UART_SendStrNoInt((uint8*)&UART_str[0]);
UART_SendStrNoInt("\r\n");
#endif
sub_01 = atof(UART_str); //计算第一个数的值存到sub_01里
InitCalParameter(&g_DigData, &g_NumCount, &g_IsHaveDot, &g_KeyValue, &g_CalNum);
while(1)
{
KeyScan(&g_KeyValue, &g_KeyIsNum, g_NumCount);
GetCalculateNum();
if (g_KeyValue == ST_Equal)
{
break;
}
else if (g_KeyValue == ST_Clear) //清除按键
{
InitCalParameter(&g_DigData, &g_NumCount, &g_IsHaveDot, &g_KeyValue, &g_CalNum);
#ifdef UART_DEBUG
UART_SendStrNoInt("\r\nClear \r\n");
#endif
break;
}
}
CalNum2Str((uint8*)&UART_str[0], &g_CalNum);
#ifdef UART_DEBUG
UART_SendStrNoInt("\r\nSecond num: ");
UART_SendStrNoInt((uint8*)&UART_str[0]);
#endif
g_KeyValue = ST_Null;
sub_02 = atof(UART_str); //计算第2个数的值存到sub_02里
result = sub_01 - sub_02; //减法计算
sprintf(UART_str, "%.7f", result);
if (FALSE == GetDigDataStr(g_DigData, UART_str))
{
#ifdef UART_DEBUG
UART_SendStrNoInt("\r\nError !\r\n");
#endif
FillDigDataError(g_DigData);
ErrorBeep();
}
#ifdef UART_DEBUG
UART_SendStrNoInt("\r\nResult is: ");
#endif
UART_SendStrNoInt((uint8*)&UART_str[0]);
}
else if (g_KeyValue == ST_Multiply) //乘法按键
{
CalNum2Str((uint8*)&UART_str[0], &g_CalNum);
#ifdef UART_DEBUG
UART_SendStrNoInt("\r\nFirst num: ");
UART_SendStrNoInt((uint8*)&UART_str[0]);
UART_SendStrNoInt("\r\n");
#endif
sub_01 = atof(UART_str); //计算第一个数的值存到sub_01里
InitCalParameter(&g_DigData, &g_NumCount, &g_IsHaveDot, &g_KeyValue, &g_CalNum);
while(1)
{
KeyScan(&g_KeyValue, &g_KeyIsNum, g_NumCount);
GetCalculateNum();
if (g_KeyValue == ST_Equal)
{
break;
}
else if (g_KeyValue == ST_Clear) //清除按键
{
InitCalParameter(&g_DigData, &g_NumCount, &g_IsHaveDot, &g_KeyValue, &g_CalNum);
#ifdef UART_DEBUG
UART_SendStrNoInt("\r\nClear \r\n");
#endif
break;
}
}
CalNum2Str((uint8*)&UART_str[0], &g_CalNum);
#ifdef UART_DEBUG
UART_SendStrNoInt("\r\nSecond num: ");
UART_SendStrNoInt((uint8*)&UART_str[0]);
#endif
g_KeyValue = ST_Null;
sub_02 = atof(UART_str); //计算第2个数的值存到sub_02里
result = sub_01 * sub_02; //乘法计算
sprintf(UART_str, "%.7f", result);
if (FALSE == GetDigDataStr(g_DigData, UART_str))
{
#ifdef UART_DEBUG
UART_SendStrNoInt("\r\nError !\r\n");
#endif
FillDigDataError(g_DigData);
ErrorBeep();
}
#ifdef UART_DEBUG
UART_SendStrNoInt("\r\nResult is: ");
UART_SendStrNoInt((uint8*)&UART_str[0]);
#endif
}
else if (g_KeyValue == ST_Division) //除法按键
{
CalNum2Str((uint8*)&UART_str[0], &g_CalNum);
#ifdef UART_DEBUG
UART_SendStrNoInt("\r\nFirst num: ");
UART_SendStrNoInt((uint8*)&UART_str[0]);
UART_SendStrNoInt("\r\n");
#endif
sub_01 = atof(UART_str); //计算第一个数的值存到sub_01里
InitCalParameter(&g_DigData, &g_NumCount, &g_IsHaveDot, &g_KeyValue, &g_CalNum);
while(1)
{
KeyScan(&g_KeyValue, &g_KeyIsNum, g_NumCount);
GetCalculateNum();
if (g_KeyValue == ST_Equal)
{
break;
}
else if (g_KeyValue == ST_Clear) //清除按键
{
InitCalParameter(&g_DigData, &g_NumCount, &g_IsHaveDot, &g_KeyValue, &g_CalNum);
#ifdef UART_DEBUG
UART_SendStrNoInt("\r\nClear \r\n");
#endif
break;
}
}
CalNum2Str((uint8*)&UART_str[0], &g_CalNum);
#ifdef UART_DEBUG
UART_SendStrNoInt("\r\nSecond num: ");
UART_SendStrNoInt((uint8*)&UART_str[0]);
#endif
g_KeyValue = ST_Null;
sub_02 = atof(UART_str); //计算第2个数的值存到sub_02里
result = sub_01 / sub_02; //除法计算
sprintf(UART_str, "%.7f", result);
if (FALSE == GetDigDataStr(g_DigData, UART_str))
{
#ifdef UART_DEBUG
UART_SendStrNoInt("\r\nError !\r\n");
#endif
FillDigDataError(g_DigData);
ErrorBeep();
}
#ifdef UART_DEBUG
UART_SendStrNoInt("\r\nResult is: ");
UART_SendStrNoInt((uint8*)&UART_str[0]);
#endif
}
else if (g_KeyValue == ST_Lg) //对数lg按键
{
#ifdef UART_DEBUG
UART_SendStrNoInt("\r\n Log10 calculate, please input num.\r\n");
#endif
InitCalParameter(&g_DigData, &g_NumCount, &g_IsHaveDot, &g_KeyValue, &g_CalNum);
while(1)
{
KeyScan(&g_KeyValue, &g_KeyIsNum, g_NumCount);
GetCalculateNum(); //输入计算数据
if (g_KeyValue == ST_Equal)
{
break;
}
else if (g_KeyValue == ST_Clear) //清除按键
{
InitCalParameter(&g_DigData, &g_NumCount, &g_IsHaveDot, &g_KeyValue, &g_CalNum);
#ifdef UART_DEBUG
UART_SendStrNoInt("\r\nClear \r\n");
#endif
break;
}
}
CalNum2Str((uint8*)&UART_str[0], &g_CalNum);
#ifdef UART_DEBUG
UART_SendStrNoInt("\r\nlog(10):");
UART_SendStrNoInt((uint8*)&UART_str[0]);
#endif
g_KeyValue = ST_Null;
sub_01 = atof(UART_str); //计算第1个数的值存到sub_01里
if (sub_01 > 0)
{
result = log10(sub_01); //log10(x)计算
sprintf(UART_str, "%.7f", result);
if (FALSE == GetDigDataStr(g_DigData, UART_str))
{
#ifdef UART_DEBUG
UART_SendStrNoInt("\r\nError !\r\n");
#endif
FillDigDataError(g_DigData);
ErrorBeep();
}
#ifdef UART_DEBUG
UART_SendStrNoInt("\r\nResult is: ");
UART_SendStrNoInt((uint8*)&UART_str[0]);
#endif
}
}
else if (g_KeyValue == ST_Ln) //对数ln按键
{
#ifdef UART_DEBUG
UART_SendStrNoInt("\r\n Ln calculate, please input num.\r\n");
#endif
InitCalParameter(&g_DigData, &g_NumCount, &g_IsHaveDot, &g_KeyValue, &g_CalNum);
while(1)
{
KeyScan(&g_KeyValue, &g_KeyIsNum, g_NumCount);
GetCalculateNum(); //输入计算数据
if (g_KeyValue == ST_Equal)
{
break;
}
else if (g_KeyValue == ST_Clear) //清除按键
{
InitCalParameter(&g_DigData, &g_NumCount, &g_IsHaveDot, &g_KeyValue, &g_CalNum);
#ifdef UART_DEBUG
UART_SendStrNoInt("\r\nClear \r\n");
#endif
break;
}
}
CalNum2Str((uint8*)&UART_str[0], &g_CalNum);
#ifdef UART_DEBUG
UART_SendStrNoInt("\r\nlog(e):");
UART_SendStrNoInt((uint8*)&UART_str[0]);
#endif
g_KeyValue = ST_Null;
sub_01 = atof(UART_str); //计算第1个数的值存到sub_01里
if (sub_01 > 0)
{
result = log(sub_01); //log10(x)计算
sprintf(UART_str, "%.7f", result);
if (FALSE == GetDigDataStr(g_DigData, UART_str))
{
#ifdef UART_DEBUG
UART_SendStrNoInt("\r\nError !\r\n");
#endif
FillDigDataError(g_DigData);
ErrorBeep();
}
#ifdef UART_DEBUG
UART_SendStrNoInt("\r\nResult is: ");
UART_SendStrNoInt((uint8*)&UART_str[0]);
#endif
}
}
else if (g_KeyValue == ST_Delete) //删除一个数字的按键
{
if (g_NumCount > 1) //至少保留一个数字
{
if (g_DigData[0] >= 20 && g_DigData[0] <=29)//最右侧数字有小数点
{
g_IsHaveDot = FALSE;
Disable_Int();
g_DigData[0] -= 20; //去掉小数点
Enable_Int();
DeleteCalculateNum(&g_CalNum);
g_KeyValue = ST_Null;
}
else//需要限制数字个数,防止删除到不显示任何数字
{
Disable_Int();
Right_Data(g_DigData, g_DigData, 8); //删除后数字就向右移动一位
Enable_Int();
g_NumCount --;
DeleteCalculateNum(&g_CalNum);
g_KeyValue = ST_Null;
}
}
else
{
InitCalParameter(&g_DigData, &g_NumCount, &g_IsHaveDot, &g_KeyValue, &g_CalNum);
}
}
}
}