问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

单片机程序 两个数的相加

发布网友 发布时间:2023-07-17 02:24

我来回答

3个回答

热心网友 时间:2024-12-05 17:12

这是个比你要求还复杂的东东,计算器。

声明,此货不是我写的,是仿真软件proteus自带的。

附件发一个,图片抓一个,程序也贴出来

其他就看你自己了哈

首先,用吃奶的力气去看懂它,一点点的摸索,一点点的掌握

然后,理解整体方法

再然后,自己从头写起

再然后,反复调试到成功为止

OK,你进步非常多了

 

 


/*******************************************************************************
************                 LABCENTER ELECTRONICS                  ************                             
************       Proteus VSM Sample Design Code             ************    
************        Integer Calculator ( 2K Code Limit)         ************
*******************************************************************************/

#include <intrins.h>
#include <reg51.h>
#include "calc.h"

//Variables
static  data LONG lvalue;
static  data LONG rvalue;
static  data CHAR currtoken;
static  data CHAR lasttoken;
static  data CHAR lastpress;
static  xdata CHAR outputbuffer[MAX_DISPLAY_CHAR];

VOID main (VOID)
//Initialise our variables and call the
//Assembly routine to initialise the LCD display.
 { lvalue    = 0;
   rvalue    = 0;
   currtoken = '=';
   lasttoken = '0';
   initialise();  // Initialize the LCD
   calc_output(OK);
   calc_evaluate();
 }  

VOID calc_evaluate()
 { CHAR data key;
   INT  data i;
   CHAR xdata number[MAX_DISPLAY_CHAR];
   CHAR xdata *bufferptr;
  
   // Clear the buffer before we start.
   for (i = 0; i <= MAX_DISPLAY_CHAR; i++)
      { number[i] = ' ';
   }
   bufferptr = number; 
  
   for (;;)
     { key = calc_getkey();
    if (calc_testkey(key))
       // Key test positive for digit so we read it into the
       // buffer and then write the buffer to the screen/LCD.
    // Size limit the number of digits - allow for termination
    // and possible negative results.
          { if (bufferptr != &number[MAX_DISPLAY_CHAR - 2])
               { *bufferptr = key;
                 calc_display(number);
                 bufferptr++;
               }
          }

       else
       // Key is an operator so pass it to the function handlers.
       // If we are just after startup or cancel then assign to lvalue
       // otherwise assign to rvalue.
          {
      //Assign the value.
            if (lasttoken == '0')
               { lvalue = calc_asciidec (number);}
            else
               { rvalue = calc_asciidec (number);}

            //Clear the number buffer.
            bufferptr = number;
            for (i = 0;i <= MAX_DISPLAY_CHAR; i++)
               { number[i] = ' '; }
  
            //Process the Operator.
            currtoken = key;
   if (currtoken == 'C')
      { calc_opfunctions(currtoken); }
    else
      { calc_opfunctions(lasttoken); }
  
       // Clear the outputbuffer for reuse on next operation.
            for (i = 0;i <= MAX_DISPLAY_CHAR;i++)
               { outputbuffer[i] = ' ';}
       
            bufferptr = number;
   // Handle the equals operation here for brevity.
   // All we need do is preserve the previous operator in
   // lasttoken.
   if (currtoken != 0x3D) lasttoken = currtoken;
           
       }
       lastpress = key;
     }
 }

VOID calc_opfunctions (CHAR token)
// Handle the operations. Lvalue holds the result and we test for
// consecutive operator presses.
 { CHAR data result;
   switch(token)
        // Add.
     {  case '+' : if ((currtoken == '=' ) || ((lastpress >= 0x30) && (lastpress <=0x39)))
               { lvalue += rvalue;
               result = calc_chkerror(lvalue);
       }
          else
            { result =  SLEEP; }  break;
        // Subtract.
  case '-' : if ((currtoken == '=' ) || ((lastpress >= 0x30) && (lastpress <=0x39)))
                      { lvalue -= rvalue;
                        result = calc_chkerror(lvalue);  
       }
                   else
                      { result = SLEEP;}  break;
        // Multiply.
  case '*' : if ((currtoken == '=' ) || ((lastpress >= 0x30) && (lastpress <=0x39)))
                      { lvalue *= rvalue;
                        result =  calc_chkerror(lvalue);
                      }
                   else
                      { result =  SLEEP;}  break;
  // Divide.    
  case '/' : if ((currtoken == '=' ) || ((lastpress >= 0x30) && (lastpress <=0x39)))
                      { if (rvalue)
                           { lvalue /= rvalue;
                             result = calc_chkerror(lvalue);
                           }
                        else
                           { result = ERROR;}    
                      }
                   else
                      { result = SLEEP;}  break;
  // Cancel.
   case 'C' : lvalue = 0;
                   rvalue = 0;
                   currtoken = '0';
                   lasttoken = '0';
                   result = OK;       break;
 
  default :  result = SLEEP; 

      }
   calc_output(result);
 }

 
/************************************************************************
***** Utility Routines *****
***************************/

INT calc_chkerror (LONG num)
// Check upper and lower bounds for the display.
// i.e. 99999999 and -99999999.
 { if ((num >= -9999999) && (num <= 9999999))
      return OK;
   else
      return ERROR;
 }


VOID calc_output (INT status)
// Output according to the status of the operation.
// *Sleep* is used for the first op press after a full cancel
// or on startup. 
 { switch (status)
      { case OK      : calc_display(calc_decascii(lvalue));    break;
        case SLEEP   :                                         break;
  case ERROR   : calc_display("Exception ");      break; 
        default      : calc_display("Exception ");         break;
      }
 }


LONG calc_asciidec (CHAR *buffer)
// Convert the ASCII string into the floating point number.
 { LONG data value;
   LONG data digit;
   value = 0;
   while (*buffer != ' ')
      { digit = *buffer - 48;
     value = value*10 + digit;
        buffer++;
   }
   return value;
 }

CHAR *calc_decascii (LONG num)
// A rather messy function to convert a floating
// point number into an ASCII string.
 { LONG data temp = num;
   CHAR xdata *arrayptr = &outputbuffer[MAX_DISPLAY_CHAR];
   LONG data divisor = 10;
   LONG data result;
   CHAR data remainder,asciival;
   INT  data i;
  
   // If the result of the calculation is zero
   // insert a zero in the buffer and finish.
   if (!temp)
      { *arrayptr = 48;
     goto done;
   }
   // Handle Negative Numbers.
   if (temp < 0)
      { outputbuffer[0] = '-';
     temp -= 2*temp;
   }

   for (i=0 ; i < sizeof(outputbuffer) ; i++)
      { remainder = temp % divisor;  
        result = temp / divisor;
    
  // If we run off the end of the number insert a space into
     // the buffer.
     if ((!remainder) && (!result))
         { *arrayptr = ' ';}
  
     // We're in business - store the digit offsetting
     // by 48 decimal to account for the ascii value.
     else
        { asciival = remainder + 48;
       *arrayptr = asciival;
     }
   
  temp /= 10;
     // Save a place for a negative sign.
     if (arrayptr != &outputbuffer[1]) arrayptr--;
    }
   done: return outputbuffer;
 }


CHAR calc_testkey (CHAR key)
// Test whether the key is a digit or an operator. Return 1 for digit, 0 for op.
 { if ((key >= 0x30) && (key <= 0x39))
      { return 1;}
   else
      { return 0;}
 }

/************************************************************************
***** I/O Routines *****
***********************/

CHAR calc_getkey (VOID)
// Use the input routine from the *Keypad_Read* assembly file to
// Scan for a key and return ASCII value of the Key pressed.
{ CHAR data mykey;
  do mykey = input();
     while (mykey == 0);
  return mykey;
 }

VOID calc_display (CHAR buf[MAX_DISPLAY_CHAR])
// Use the Output and Clearscreen routines from the
// *LCD_Write* assembly file to output ASCII values to the LCD.
 { INT data  i = 0;
   clearscreen();
   for (i ; i <= MAX_DISPLAY_CHAR ; i++)
      { if (buf[i] != ' ')
      { output(buf[i]); }
   } 
 }

 

 

 

 

热心网友 时间:2024-12-05 17:13

假设相加的两个数,原来就存在于40H和41H.

MOV A, 40H
ADD A, 41H
MOV 41H, A
CLR A
MOV ACC.0, C
MOV 40H, A
;完

热心网友 时间:2024-12-05 17:13

假设相加的两个数,原来就存在于40H和41H.
MOV
A,
40H
ADD
A,
41H
MOV
41H,
A
CLR
A
MOV
ACC.0,
C
MOV
40H,
A
;完
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
陌陌发语音出现转码失败怎么办 女孩2010年5月10号阴历3月27早晨9点55分出生的五行缺什么 钟姓男孩名字2023年5月10日出生的 凤眼果有什么营养?凤眼果的这些营养你都知道吗? 专升本成绩多少合格 山东专升本成绩多少合格 山东2022年专升本成绩什么时候出 2024专升本成绩公布时间及入口 2023年山东专升本各专业录取分数线 什么时候出专升本成绩 山东专升本综合素质测评成绩怎么算 从长沙火车南站到月湖公园怎么坐公交车,最快需要多久 长沙汽车南站坐几路公交车到月湖大市场 月湖大市场到火车南站怎么走 C语言中如何实现,在1到6之间产生随机数并存入数组中,数组一共有12个数 ... 湖南月湖大市场离高铁南站多少路,怎么走啊 狗狗生嵬大小不同怎么回事。只能活两三天‘ LGSU660是否支持FM收音机 pl660收音机短波怎么找台湾频道 做紫砂的有个叫什么强的 贫者小人是什么意思 问德生660收音机在福州市短波好不好用 河南大学:学校里都有哪些银行的ATM机? 南瓜能不能和香瓜一起吃? 嘎咯羊是什么植物? 河南大学:学校附近的银行都在哪里? 南瓜嫁接的甜瓜好不好吃 柳州雒容镇征收范围 一位公主用镜子封印了奥特曼叫什么电视 雒容盘古村规划拆迁吗? 关于“倒存”“倒付”的意思,我不理解,请老师赐教,谢谢 成都本科线多少分 请问我在开福区月湖大市场要去长沙火车站 ,有直达的公交车吗 凤亭路口到月湖大市场怎么走 谁能给个用VB做计算器的思路~~~ 湘潭西到长沙月湖大市场怎么走 VB中怎么让别的应用程序作为自己的一个子窗口 you,reIate。翻译中文 胳膊被人咬了一口为什么总是麻木 上茬香瓜下茬可以种南瓜吗 被女朋友在左小臂尺骨侧咬了一口,都两个半月了仍然感觉左手拇指和食指... 昨天咬了一口老公的胳膊,他说现在一直是麻的,怎么办 魔兽争霸3切出去后进不去怎么办a 胳膊被女朋友咬一口,手指变得有点麻木了 魔兽争霸一开始可以玩,我就来回切换了下,就出现进不去的情况,重启也不... 被咬手腕的筋,手麻一直不好怎么办? 玩冰封王座为什么我切出来再切不进去。 我的手被老婆咬了一口手发麻了,这到底是为什么? ...不太会用智能手机查询公交信息,如何做到让老人搭公交更方便?_百度... 为什么我开了魔兽争霸切出来就切不进去了 手腕被女友咬了一口,好像咬到血管了,手掌一直发麻,还肿了,是怎么回事啊...