在好例子网,分享、交流、成长!
您当前所在位置:首页C/C++ 开发实例嵌入式开发 → proteus仿真51数码管矩阵键盘计算器

proteus仿真51数码管矩阵键盘计算器

嵌入式开发

下载此实例
  • 开发语言:C/C++
  • 实例大小:0.23M
  • 下载次数:1
  • 浏览次数:37
  • 发布时间:2024-05-29
  • 实例类别:嵌入式开发
  • 发 布 人:EEAA2013
  • 文件格式:.7z
  • 所需积分:3

实例介绍

【实例简介】

用Proteus仿真51单片机控制矩阵键盘和数码管,可计算加、减、乘、除、lg、ln,用Keil写的程序。

【实例截图】

from clipboard

【核心代码】

/*******************************************************************************
* 函数名         : 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);
}
}
}
}

实例下载地址

proteus仿真51数码管矩阵键盘计算器

不能下载?内容有错? 点击这里报错 + 投诉 + 提问

好例子网口号:伸出你的我的手 — 分享

网友评论

发表评论

(您的评论需要经过审核才能显示)

查看所有0条评论>>

小贴士

感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。

  • 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
  • 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
  • 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
  • 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。

关于好例子网

本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明

;
报警