修改单片机程序

꧁꫞꯭层出不穷꫞꧂ 2020-12-28 11:06:56
现在这个程序只能进行两个无符号十进制的加减乘除运算 怎么改成可以进行两个有符号的十进制的运算 并且结果为负数是在最高位显示负数
#include<reg51.h>
#define uint unsigned int
#define uchar unsigned char
sbit dula=P2^6; //段选引脚
sbit wela=P2^7; //位选引脚
uint flag,inputnum1,inputnum2,displaynum,mathsign,outputnum,keynum;
uchar address[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf}; //6位数码管地址数组


uchar table[]={0x3f,0x06,0x5b,0x4f, //0-F共阴型数码管字形码
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,0x40 };


void delayms(uint xms) //延时函数
{
uint x,y;
for(x=xms;x>0;x--)
for(y=110;y>0;y--);
}




void keyscan()
{
uchar temp,temph,templ,k;
P3=0xf0;
temp=P3;
temph=temp&0xf0;
if(temph!=0xf0)
{
delayms(10);
temp=P3;
temph=temp&0xf0;
if(temph!=0xf0)
{
P3=0x0f;
temp=P3;
templ=temp&0x0f;
k=temph^templ;
switch(k)
{
case 0xee: keynum=0;break; //数字0
case 0xde: keynum=1;break; //数字1
case 0xbe: keynum=2;break; //数字2
case 0x7e: keynum=3;break; //数字3


case 0xed: keynum=4;break; //数字4
case 0xdd: keynum=5;break; //数字5
case 0xbd: keynum=6;break; //数字6
case 0x7d: keynum=7;break; //数字7


case 0xeb: keynum=8;break; //数字8
case 0xdb: keynum=9;break; //数字9
case 0xbb: keynum=10;break; // =
case 0x7b: keynum=11;break; // 清零


case 0xe7: keynum=12;break; // +
case 0xd7: keynum=13;break; // -
case 0xb7: keynum=14;break; // *
case 0x77: keynum=15;break; // /
}
while(temph!=0xf0)
{
P3=0xf0;
temp=P3;
temph=temp&0xf0;
}
}
}
}


void display()
{
if(displaynum<10) //显示1位数,0~9
{
P0=0xff;
wela=1;
P0=address[5];
wela=0;


P0=0x00;
dula=1;
P0=table[displaynum];
dula=0;
delayms(1);
}
else if
(displaynum<100) //显示2位数,10~99
{
P0=0xff;
wela=1;
P0=address[5];
wela=0;


P0=0x00;
dula=1;
P0=table[displaynum%10];
dula=0;
delayms(1);


P0=0xff;
wela=1;
P0=address[4];
wela=0;


P0=0x00;
dula=1;
P0=table[displaynum/10];
dula=0;
delayms(1);
}
else //显示3位数,100~999
{
P0=0xff;
wela=1;
P0=address[5];
wela=0;


P0=0x00;
dula=1;
P0=table[displaynum%10];
dula=0;
delayms(1);


P0=0xff;
wela=1;
P0=address[4];
wela=0;


P0=0x00;
dula=1;
P0=table[displaynum%100/10];
dula=0;
delayms(1);


P0=0xff;
wela=1;
P0=address[3];
wela=0;


P0=0x00;
dula=1;
P0=table[displaynum/100];
dula=0;


wela=1;
P0=address[3];
wela=0;


P0=0x00;
dula=1;
P0=0x40;
dula=0;


delayms(1);
}
}








void main()
{
while(1)
{
keyscan();
if(keynum<10)
{
if(flag==0)
{
inputnum1=keynum;
displaynum=inputnum1;
}
if(flag==1)
{
inputnum2=keynum;
displaynum=inputnum2;
}
}


if(keynum==10)
{
switch(mathsign)
{
case 12: outputnum=inputnum1+inputnum2;break;
case 13: outputnum=inputnum1-inputnum2;break;
case 14: outputnum=inputnum1*inputnum2;break;
case 15: outputnum=inputnum1/inputnum2;break;
}
displaynum=outputnum;
}


if(keynum==11)
{
displaynum=0;
inputnum1=0;
inputnum2=0;
outputnum=0;
flag=0;
keynum=16;
mathsign=0;
}


if((keynum>=12)&&(keynum<=15))
{
flag=1;
mathsign=keynum;
displaynum=0;
}
display();
}
}
...全文
349 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2020-12-29
  • 打赏
  • 举报
回复
//现在这个程序只能进行两个无符号十进制的加减乘除运算
//怎么改成可以进行两个有符号的十进制的运算
//并且结果为负数是在最高位显示负数
#include<reg51.h>
#define uint unsigned int
#define uchar unsigned char
sbit dula=P2^6;        //段选引脚
sbit wela=P2^7;        //位选引脚
int flag,inputnum1,inputnum2,displaynum,mathsign,outputnum,keynum;
int sign1,sign2,state,displaysign;
uchar address[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf}; //6位数码管地址数组

uchar table[]={        //0-F共阴型数码管字形码
    0x3f,0x06,0x5b,0x4f,
    0x66,0x6d,0x7d,0x07,
    0x7f,0x6f,0x77,0x7c,
    0x39,0x5e,0x79,0x71,0x40 };

void delayms(uint xms) //延时函数
{
    uint x,y;
    for(x=xms;x>0;x--)
    for(y=110;y>0;y--);
}

void keyscan()
{
  uchar temp,temph,templ,k;
  P3=0xf0;
  temp=P3;
  temph=temp&0xf0;
  if(temph!=0xf0)
  {
    delayms(10);
    temp=P3;
    temph=temp&0xf0;
    if(temph!=0xf0)
    {
      P3=0x0f;
      temp=P3;
      templ=temp&0x0f;
      k=temph^templ;
      switch(k)
      {
        case 0xee: keynum=0;break;  //数字'0'
        case 0xde: keynum=1;break;  //数字'1'
        case 0xbe: keynum=2;break;  //数字'2'
        case 0x7e: keynum=3;break;  //数字'3'
        case 0xed: keynum=4;break;  //数字'4'
        case 0xdd: keynum=5;break;  //数字'5'
        case 0xbd: keynum=6;break;  //数字'6'
        case 0x7d: keynum=7;break;  //数字'7'
        case 0xeb: keynum=8;break;  //数字'8'
        case 0xdb: keynum=9;break;  //数字'9'
        case 0xbb: keynum=10;break; // '='
        case 0x7b: keynum=11;break; // 清零'C'
        case 0xe7: keynum=12;break; // '+'
        case 0xd7: keynum=13;break; // '-'
        case 0xb7: keynum=14;break; // '*'
        case 0x77: keynum=15;break; // '/'
      }
      while(temph!=0xf0)
      {
        P3=0xf0;
        temp=P3;
        temph=temp&0xf0;
      }
    }
  }
}

void display()
{
  int a;
  a=5;
  if(displaysign==-1) //显示'-'
  {
    P0=0xff; wela=1; P0=address[a--]; wela=0;  P0=0x00; dula=1; P0=table[16];                dula=0; delayms(1);
  }
  if(displaynum<10)        //显示1位数,0~9
  {
    P0=0xff; wela=1; P0=address[a--]; wela=0;  P0=0x00; dula=1; P0=table[displaynum];        dula=0; delayms(1);
  }
  else if (displaynum<100)        //显示2位数,10~99
  {
    P0=0xff; wela=1; P0=address[a--]; wela=0;  P0=0x00; dula=1; P0=table[displaynum%10];     dula=0; delayms(1);
    P0=0xff; wela=1; P0=address[a--]; wela=0;  P0=0x00; dula=1; P0=table[displaynum/10];     dula=0; delayms(1);
  }
  else         //显示3位数,100~999
  {
    P0=0xff; wela=1; P0=address[a--]; wela=0;  P0=0x00; dula=1; P0=table[displaynum%10];     dula=0; delayms(1);
    P0=0xff; wela=1; P0=address[a--]; wela=0;  P0=0x00; dula=1; P0=table[displaynum%100/10]; dula=0; delayms(1);
    P0=0xff; wela=1; P0=address[a--]; wela=0;  P0=0x00; dula=1; P0=table[displaynum/100];    dula=0; delayms(1);
//           wela=1; P0=address[a  ]; wela=0;  P0=0x00; dula=1; P0=0x40;                       dula=0; delayms(1);
  }
}

void main()
{
  while(1)
  {
    keyscan();
    if(keynum<10) //'0'..'9'
    {
      if(flag==0)
      {
        inputnum1=keynum;
        displaynum=inputnum1;
      }
      if(flag==1)
      {
        inputnum2=keynum;
        displaynum=inputnum2;
      }
    }

    if(keynum==10) //'='
    {
      switch(mathsign)
      {
        case 12: outputnum=sign1*inputnum1 + sign2*inputnum2 ;break;
        case 13: outputnum=sign1*inputnum1 - sign2*inputnum2 ;break;
        case 14: outputnum=sign1*inputnum1 * sign2*inputnum2 ;break;
        case 15: outputnum=sign1*inputnum1 /(sign2*inputnum2);break;
      }
      if (outputnum>=0) {
        displaysign=0;
        displaynum=outputnum;
      } else {
        displaysign=-1;
        displaynum=-outputnum;
      }
    }

    if(keynum==11) //'C'
    {
      displaynum=0;
      inputnum1=0;
      inputnum2=0;
      outputnum=0;
      flag=0;
      keynum=16;
      mathsign=0;
      sign1=1;
      sign2=1;
      state=0;
      displaysign=0;
    }

    if((keynum>=12)&&(keynum<=15)) //'+','-','*','/'
    {
      if (state==0) {
        if (keyname==13) {//'-'
            if (flag==0) {
                sign1=-1;
                displaysign=-1;
            } else {
                sign2=-1;
                displaysign=-1;
            }
            state=1;
        }
      } else {
        flag=1;
        mathsign=keynum;
        displaynum=0;
        state=0;
      }
    }
    display();
  }
}
  • 打赏
  • 举报
回复
不对呀 基本的运算都不能了

64,653

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧