欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4828|回復: 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 單片機教程網

快速回復 返回頂部 返回列表