找回密码
 立即注册

QQ登录

只需一步,快速开始

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

怎么把这个单片机代码改成具有加减乘除的计算器

[复制链接]
跳转到指定楼层
楼主
ID:1102085 发表于 2023-12-1 20:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. #include <REG52.H>
  2. sbit ADDR0=P2^2;
  3. sbit ADDR1=P2^3;
  4. sbit ADDR2=P2^4;
  5. sbit ADDR3=P2^5;
  6. sbit ENLED=P2^6;
  7. sbit KEY_IN_1=P1^3;
  8. sbit KEY_IN_2=P1^2;
  9. sbit KEY_IN_3=P1^1;
  10. sbit KEY_IN_4=P1^0;
  11. sbit KEY_OUT_1=P1^7;
  12. sbit KEY_OUT_2=P1^6;
  13. sbit KEY_OUT_3=P1^5;
  14. sbit KEY_OUT_4=P1^4;
  15. unsigned char code LedChar[]={
  16.                                 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
  17.                                 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x40        
  18.         };
  19. unsigned char LedBuff[6]={
  20.         0xFF,0xFF,0xFF,0xFF,0xFF,0xFF
  21. };
  22. unsigned char code KeyCodeMap[4][4]={
  23.         {0x31,0x32,0x33,0x26},
  24.         {0x34,0x35,0x36,0x35},
  25.         {0x37,0x38,0x39,0x28},
  26.         {0x30,0x1B,0x0D,0x27}
  27.         };
  28. unsigned char KeySta[4][4]={
  29. {1,1,1,1},{1,1,1,1},{1,1,1,1},{1,1,1,1}
  30. };

  31. void KeyDriver();

  32. void main()
  33. {        
  34.         ENLED=0;
  35.         ADDR3=1;
  36.         TMOD=0x01;
  37.         TH0=0xFC;
  38.         TL0=0x67;
  39.         EA=1;
  40.         ET0=1;
  41.         TR0=1;
  42.         LedBuff[0]=LedChar[0];
  43. while(1)
  44. {
  45.         KeyDriver();
  46.         }
  47. }

  48. void ShowNumber(unsigned long num)
  49. {
  50.         signed char i;
  51.         unsigned char buf[6];
  52.         for(i=0;i<6;i++)
  53.         {
  54.         buf[i]=num%10;
  55.                 num=num/10;
  56.         }
  57.         for(i=5;i>=1;i--)
  58.         {
  59.                 if(buf[i]==0)
  60.                         LedBuff[i]=0xFF;
  61.                 else
  62.                         break;
  63.         }
  64.         for(;i>=0;i--)
  65.         {
  66.                 LedBuff[i]=LedChar[buf[i]];
  67.         }
  68. }

  69. void KeyAction(unsigned char keycode)
  70. {
  71. static unsigned long result=0;
  72.         static unsigned long addend=0;
  73.         
  74.         if((keycode>=0x30)&&(keycode<=0x39))
  75.         {
  76.                 addend=(addend*10)+(keycode-0x30);
  77.                 ShowNumber(addend);
  78.         }
  79.         else if(keycode==0x26)
  80.         {
  81.                 result += addend;
  82.                 addend=0;
  83.                 ShowNumber(result);
  84.         }
  85.         else if(keycode==0x0D)
  86.         {
  87.                 result += addend;
  88.                 addend=0;
  89.                 ShowNumber(result);
  90.         }
  91.                 else if(keycode==0x1B)
  92.         {
  93.                 addend=0;
  94.                 result=0;
  95.                 ShowNumber(addend);
  96.         
  97.         
  98. }
  99. }
  100. void KeyDriver()
  101. {
  102. unsigned char i,j;
  103.         static unsigned char backup[4][4]={
  104.         {1,1,1,1},{1,1,1,1},{1,1,1,1},{1,1,1,1}
  105. };
  106.         for(i=0;i<4;i++)
  107.         {
  108.                 for(j=0;j<4;j++)
  109.                 {
  110.                         if(backup[i][j] != KeySta[i][j])
  111.                         {
  112.                                 if(backup[i][j] !=0)
  113.                                 {
  114.                                         KeyAction(KeyCodeMap[i][j]);
  115.                                         }
  116.                                         backup[i][j]=KeySta[i][j];
  117.                                 }
  118.                         }
  119.                 }                        
  120.         }
  121.         
  122. void KeyScan()
  123. {
  124.         unsigned char i;
  125.         static unsigned char keyout=0;
  126.         static unsigned char keybuf[4][4]={
  127.                 {0xFF,0xFF,0xFF,0xFF},{0xFF,0xFF,0xFF,0xFF},{0xFF,0xFF,0xFF,0xFF},{0xFF,0xFF,0xFF,0xFF}
  128.                 };
  129.         
  130.                 keybuf[keyout][0]=(keybuf[keyout][0]<<1)|KEY_IN_1;
  131.                 keybuf[keyout][1]=(keybuf[keyout][1]<<1)|KEY_IN_2;
  132.                 keybuf[keyout][2]=(keybuf[keyout][2]<<1)|KEY_IN_3;
  133.                 keybuf[keyout][3]=(keybuf[keyout][3]<<1)|KEY_IN_4;
  134.                
  135.                 for(i=0;i<4;i++)
  136.                 {
  137.                         if((keybuf[keyout][i]&0x0F)==0x00)
  138.                         {
  139.                                 KeySta[keyout][i] = 0;
  140.                                 }
  141.                         else if((keybuf[keyout][i]&0x0F)==0xFF)
  142.                         {
  143.                                 KeySta[keyout][i] = 1;
  144.                                 }
  145.                         }
  146.                   keyout++;
  147.                         keyout=keyout&0x03;
  148.                         switch(keyout)
  149.                         {
  150.                                 case 0:KEY_OUT_4=1;KEY_OUT_1=0;break;
  151.                                 case 1:KEY_OUT_1=1;KEY_OUT_2=0;break;
  152.                                 case 2:KEY_OUT_2=1;KEY_OUT_3=0;break;
  153.                                 case 3:KEY_OUT_3=1;KEY_OUT_4=0;break;
  154.                                 default:break;
  155.                                 }
  156. }

  157. void LedScan()
  158. {
  159.                                  static unsigned char i=0;
  160.                                 P0=0xFF;
  161.                                 switch(i)
  162.                                 {
  163.                                 case 0:ADDR2=0;ADDR1=0;ADDR0=0;i++;P0=LedBuff[0];break;
  164.                                 case 1:ADDR2=0;ADDR1=0;ADDR0=1;i++;P0=LedBuff[1];break;
  165.                                 case 2:ADDR2=0;ADDR1=1;ADDR0=0;i++;P0=LedBuff[2];break;
  166.                                 case 3:ADDR2=0;ADDR1=1;ADDR0=1;i++;P0=LedBuff[3];break;
  167.                                 case 4:ADDR2=1;ADDR1=0;ADDR0=0;i++;P0=LedBuff[4];break;
  168.                                 case 5:ADDR2=1;ADDR1=0;ADDR0=1;i=0;P0=LedBuff[5];break;
  169.                                 default:break;
  170.                                 }
  171. }

  172.         void InterruptTimer0() interrupt 1
  173.         {
  174.                 TH0=0xFC;
  175.                 TL0=0x67;
  176.                 LedScan();
  177.                 KeyScan();
  178.         }
复制代码


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

使用道具 举报

沙发
ID:1085081 发表于 2023-12-11 19:53 | 只看该作者
oid KeyAction(unsigned char keycode)
{
    static unsigned long operand1 = 0;  // 第一个操作数
    static unsigned long operand2 = 0;  // 第二个操作数
    static unsigned char operator = 0;   // 操作符,1代表加法,2代表减法,3代表乘法,4代表除法
    static bit inputSecondOperand = 0;   // 标记是否输入第二个操作数

    if (keycode >= 0x30 && keycode <= 0x39)  // 数字键
    {
        if (!inputSecondOperand)
        {
            operand1 = operand1 * 10 + (keycode - 0x30);
            ShowNumber(operand1);
        }
        else
        {
            operand2 = operand2 * 10 + (keycode - 0x30);
            ShowNumber(operand2);
        }
    }
    else if (keycode == 0x26)  // 加法
    {
        operator = 1;
        inputSecondOperand = 1;
    }
    else if (keycode == 0x35)  // 减法
    {
        operator = 2;
        inputSecondOperand = 1;
    }
    else if (keycode == 0x28)  // 乘法
    {
        operator = 3;
        inputSecondOperand = 1;
    }
    else if (keycode == 0x27)  // 除法
    {
        operator = 4;
        inputSecondOperand = 1;
    }
    else if (keycode == 0x0D)  // 等号
    {
        unsigned long result = 0;
        switch (operator)
        {
            case 1:  // 加法
                result = operand1 + operand2;
                break;
            case 2:  // 减法
                result = operand1 - operand2;
                break;
            case 3:  // 乘法
                result = operand1 * operand2;
                break;
            case 4:  // 除法
                if (operand2 != 0)
                {
                    result = operand1 / operand2;
                }
                else
                {
                    // 处理除数为0的情况
                }
                break;
            default:
                break;
        }

        operand1 = result;
        operand2 = 0;
        inputSecondOperand = 0;
        ShowNumber(result);
    }
    else if (keycode == 0x1B)  // 清零
    {
        operand1 = 0;
        operand2 = 0;
        operator = 0;
        inputSecondOperand = 0;
        ShowNumber(0);
    }
}

需要修改KeyAction函数,以便能够实现加、减、乘、除等操作。试试,不知道能否成功
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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