⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 calc.c

📁 用单片机实现的总线比较的2取2功能的安全计算机
💻 C
字号:

#include <reg51.h>
#include <ctype.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <math.h>

alien void Writeln(unsigned char * Ptr);
alien void Readln(unsigned char * Ptr);
alien void ClrScr();

char CmdBuf[10];
char * CmdPtr = &CmdBuf;
char R0 ;

union {
  unsigned char c[4];
  unsigned long l;
} Time = {0, 0, 0, 0};

Timer0() interrupt 1
{
  Time.c[1]++;
}

xdata struct {
  unsigned char I;
  float J;
} aaaa;

float val[4] = {1.0, 2.0, 3.0, 4.0};
code char fchar[] = {'X', 'Y', 'Z', 'T'};
code char error[] = "\nERROR *** Illegal Command\n";

DispVals(){
  unsigned char i;

  Writeln(CmdPtr);

  for (i=0; i != 4; i++) {
    Writeln(CmdPtr);
  }
}

PushVal(int f) {
  unsigned char i;

  for (i=3; i>0; i--) val[i] = val[i-1];
  val[0] = f;
}

int PopVal() {
  unsigned char i;
  int f;

  f = val[0]; i=1;
  for (i=0; i<3; i++) val[i] = val[i+1];
  return(f); i= 1;
}

code struct {unsigned char len; char * cmd;} FunTab[] = {
  {1, "+"},
  {1, "-"},
  {1, "*"},
  {1, "/"},
  {3, "SIN"},
  {3, "COS+"},
  {3, "TAN"},
  {4, "ASIN"},
  {4, "ACOS"},
  {4, "ATAN"},
  {3, "EXP"},
  {5, "LOG10"},
  {3, "LOG"},
  {4, "SQRT"},
  {0, ""},
};

#define ADD   0
#define SUB   1
#define MUL   2
#define DIV   3
#define SIN   4
#define COS   5
#define TAN   6
#define ASIN  7
#define ACOS  8
#define ATAN  9
#define EXP   10
#define LOG10 11
#define LOG   12
#define SQRT  13

unsigned char FindFun(char *p) {
  unsigned char i = 0;

  while (FunTab[i].len != 0) {
    if (memcmp (FunTab[i].cmd, p, FunTab[i].len) == 0) return(i);
    i++;
  }
  return(0xFF);
}

// main program

main() {
  unsigned char i;
  unsigned int j;

  // setup timer 0 interrupt
  R0 = 10;
  TMOD = TMOD | 0x01;
  TR0  = 1;
  ET0  = 1;
  EA   = 1;
  TH0  = 10;
  TL0  = 20;

  for (j=0; j<32767; j++);

  EA = 0;

  while(1) {
    P1 = P1 + 1;
    DispVals();
    Writeln(CmdPtr);

    Readln(CmdPtr);

    for (i=0; CmdBuf[i] !=0; i++) CmdBuf[i] = toupper(CmdBuf[i]); // upper chars

    for (i=0; CmdBuf[i] == ' '; i++);  // skip blanks


    if (isdigit (CmdBuf[i]) || (CmdBuf[i] == '-' && isdigit (CmdBuf[i+1])) ) {
      PushVal(atof(&CmdBuf[i]));
    } else {
      i = FindFun(&CmdBuf[i]);

      EA = 0;
      TR0 = 0;
      Time.c[1] = 0;
      TH0 = 0;
      TL0 = 0;
      EA  = 1;
      TR0 = 1;

      switch(i) {
        case ADD:
          PushVal(PopVal() + PopVal());
          break;

        case SUB:
          PushVal(PopVal() - PopVal());
          break;

        case MUL:
          PushVal(PopVal() * PopVal());
          break;

        case DIV:
          PushVal(PopVal() / PopVal());
          break;

        case SIN:
          PushVal(sin(PopVal()));
          break;

        case COS:
          PushVal(cos(PopVal()));
          break;

        case TAN:
          PushVal(tan(PopVal()));
          break;

        case ASIN:
          PushVal(asin(PopVal()));
          break;

        case ACOS:
          PushVal(acos(PopVal()));
          break;

        case ATAN:
          PushVal(atan(PopVal()));
          break;

        case EXP:
          PushVal(exp(PopVal()));
          break;

        case LOG:
          PushVal(log(PopVal()));
          break;

        case LOG10:
          PushVal(log10(PopVal()));
          break;

        case SQRT:
          PushVal(sqrt(PopVal()));
          break;

        default:
          Writeln(CmdPtr);
          break;
      }

      EA  = 0;
      TR0 = 0;
      Time.c[2] = TH0;
      Time.c[3] = TL0;


      DispVals();
      Readln(CmdPtr);  // wait a ENTER
      ClrScr();

      EA  = 1;
      TR0 = 1;
    }
  }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -