找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4229|回复: 9
打印 上一主题 下一主题
收起左侧

求大神帮调试51单片机简易计算器程序,功能基本正确,只有一个问题,求大神帮...

[复制链接]
跳转到指定楼层
楼主
ID:721062 发表于 2020-4-26 00:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
100黑币
本帖最后由 一半借我做衣衫 于 2020-4-26 00:40 编辑

问题如下:
输入被减数“321”按下“-”符号后,它显示为“32-”
继续输入减数“36”后,它显示为“32-36”
按下“=”键后,显示为“32-36=29”
其问题在于,被减数个位上的数“1”被“-”覆盖未显示,且被减数和减数的最后一位都没参加运算,即我输入 的是321-36,单片机实际计算的是32-3=28
下面是项目文件,C文件也在里面

改.zip

47.25 KB, 下载次数: 17

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:462827 发表于 2020-4-26 02:15 | 只看该作者
你的按键处理和显示处理都搞得很不好,框架比较差不易维护。

矩阵按键扫描做成一个函数就只返回键值就行了,用数组做个简单的键盘映射,用一条语句就能查表取得按键对应的数字或功能了,不用搞一大堆的switch-case 。
回复

使用道具 举报

板凳
ID:723156 发表于 2020-4-26 12:47 | 只看该作者
我觉得只是显示的问题,分开显示试一下。else if(xx!=0&&xf==1)xf=0,bei=0,LCDWriteCommand(0x01),LCDWriteData(xx);  //刚选择完运算符号,被加减乘除的数已经输入完
                        else if(xx!=0&&xf==0)LCDWriteCommand(0x01),LCDWriteData(shu);         //        符号已选,正在输入加减乘除的数
回复

使用道具 举报

地板
ID:592807 发表于 2020-4-26 13:46 | 只看该作者
你这是显示覆盖问题,很好解决的,方法很多,举例2种1 弄个全局变量标记数字坐标,显示完第一个数字(字符)后坐标自
2弄个数组 比如 a[10],然后赋值 a[i++] = 输入字符;最后从头到尾显示数组内容
回复

使用道具 举报

5#
ID:592807 发表于 2020-4-26 14:11 | 只看该作者
抱歉,我太年轻了,看了一下你的问题没看全就会贴了,重看了一下你的代码,发现是这样的。1  switch函数没有带default语柄                         这问题不大

2  按键‘=’使用了四个if判断加减乘除还用abcd指代,如果我按完 加号(a = 1)再按减号(b= 1)会怎么样
           case(14):if(a==1)
                           {result=temp+result;a=0;key=0;}
                        if(b==1)
                           {result=temp-result;b=0;key=0;}
                        if(c==1)
                           {result=temp*result;c=0;key=0;}
                        if(d==1)
                           {
                              if(result==0) {error=1;result=0;d=0;key=0;}
                               else{result=temp/result;d=0;key=0;}
                           }


3  你在while(1)里面定义变量是认真的吗?看到这里可以十分肯定告诉你你的错误99%出现在这
void main()
{
        LCD_Init();         
    while(1)
        {
             static long key=0,result=0,temp=0,a=0,b=0,c=0,d=0;  
             unsigned char i=0;



回复

使用道具 举报

6#
ID:592807 发表于 2020-4-26 14:12 | 只看该作者
hantu 发表于 2020-4-26 02:15
你的按键处理和显示处理都搞得很不好,框架比较差不易维护。

矩阵按键扫描做成一个函数就只返回键值就行 ...

void main()
{
        LCD_Init();            
    while(1)
        {
static long key=0,result=0,temp=0,a=0,b=0,c=0,d=0;   
unsigned char i=0;


看看他在while(1)里面做了啥,定义变量,
回复

使用道具 举报

7#
ID:721062 发表于 2020-4-26 16:37 | 只看该作者
黄youhui 发表于 2020-4-26 14:11
抱歉,我太年轻了,看了一下你的问题没看全就会贴了,重看了一下你的代码,发现是这样的。1  switch函数没 ...

非常感谢你给我指出的问题 ,我是新手,你提出的3个问题,第1个我已加了default:break;,第2个我还没想好怎么弄。第3个我把变量第一在了为了外面。可是现在问题更严重了...按一下1会出现一排1了,计算功能也紊乱了,大神能讲一下解决办法吗,改了好几天了,不是专业学这个的,知识有限,希望大神施以援手,小弟感激不尽
回复

使用道具 举报

8#
ID:721062 发表于 2020-4-26 16:38 | 只看该作者
LiUCONG520 发表于 2020-4-26 12:47
我觉得只是显示的问题,分开显示试一下。else if(xx!=0&&xf==1)xf=0,bei=0,LCDWriteCommand(0x01),LCDWrite ...

您说的分开显示是什么意思,在下菜鸟入门,没明白大神的意思
回复

使用道具 举报

9#
ID:592807 发表于 2020-4-26 20:52 | 只看该作者
想帮你改代码,但是想想还是算了,世界上最难的两件事之一就是把自己的思想放进别人的大脑里,想法上的偏差可能让我写的代码你看不懂,
再加上我不熟悉你这LCD不清楚指令 。


你说的第二种其实
加法 A = 1
减法A=2
乘法A=3
除法A=4
没输入A=0
就好了


至于第三种一直输出1你是你的变量shu='1',这个标志一直在没清空所以一直打印1。
另外你输入运算符号后result清空了吗
  for(i=i-1;i=>0;i--)
  {
    LCDWriteData(n[i]+48);
  }








回复

使用道具 举报

10#
ID:723156 发表于 2020-4-27 09:59 | 只看该作者
一半借我做衣衫 发表于 2020-4-26 16:38
您说的分开显示是什么意思,在下菜鸟入门,没明白大神的意思

我的意思是 当你输入321再输入‘-’ 时, 把321清除  只显示一个 ‘-’,再输入数字36时,把‘-’也清除掉。就像一般的计算机 这样就不会显示覆盖,如果你一定想把整个算式都显示出来,楼下的那个办法可以。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表