找回密码
 立即注册

QQ登录

只需一步,快速开始

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

简易加减法计算器 单片机代码

[复制链接]
跳转到指定楼层
楼主
ID:405840 发表于 2022-6-21 18:21 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
参考了宋雪松老师的教学例程 ,源程序只能计算加法 ,本程序稍作修改后 可进行加法和减法计算
#include <reg52.h>
#include <intrins.h>
#define  uchar unsigned char
#define   uint unsigned int
uchar code table[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};           //共阴字形码
uchar code keycodemap[4][4]={
    { 0x31, 0x32, 0x33, 0x26 }, //数字键1、数字键2、数字键3、向上键
    { 0x34, 0x35, 0x36, 0x25 }, //数字键4、数字键5、数字键6、向左键
    { 0x37, 0x38, 0x39, 0x28 }, //数字键7、数字键8、数字键9、向下键
    { 0x30, 0x1B, 0x0D, 0x27 }}; //数字键0、ESC键、  回车键、 向右键};
uchar keysta[4][4]={{1,1,1,1},{1,1,1,1},{1,1,1,1},{1,1,1,1}};           //全局变量 记录四个键的状态 0按下 1弹起 当keysta反正变化时 说有按键动作 1变0 按下 0变1 弹起
uchar Ledbuf[6]={0X3F,0X00,0X00,0X00,0X00,0X00};                         //数码管显示缓冲区,第0位为最低位(个位) ,第5位为符号位
long result=0;
long adden=0;
sbit keyin0=P1^0;
sbit keyin1=P1^1;
sbit keyin2=P1^2;
sbit keyin3=P1^3;

sbit keyout0=P1^4;
sbit keyout1=P1^5;
sbit keyout2=P1^6;
sbit keyout3=P1^7;

void InitTimer1(void)        //定时1ms
{
    TMOD = 0x10;
    TH1 = 0xFC;
    TL1 = 0x18;
    EA = 1;
    ET1 = 1;
    TR1 = 1;
}

  void shownumber(long num)
  {
     static uchar buf[5]={0,0,0,0,0};
         char i;
         if(num<0)                  //负数为补码 取反加1得到原码
         {   num=~num;
                 num++;
                 Ledbuf[5]=0x40;
         }
          else
          {
           Ledbuf[5]=0x00;
          }
         for(i=0;i<5;i++)
         {buf[ i]=num%10;
         num=num/10; }

            for (i=4; i>=1; i--)  //从最高位起,遇到0转换为空格,遇到非0则退出循环
    {
        if (buf[ i] == 0)
            Ledbuf[ i] = 0x00;
        else
            break;
    }

        for( ;i>=0;i--)
        {Ledbuf[ i]=table[buf[ i]];}

  }
  void keyaction(uchar keycode)
  {
     long temp;
         static uchar yunsuanfuhao=0;
     if((keycode>=0x30)&&(keycode<=0x39))                  //按下数字键
         {
                temp=adden;
            adden=(adden<<3)+(adden<<1)+keycode-0x30;
                if(adden>99999) adden=temp;
                 shownumber(adden);
         }

         else if(keycode==0x26) //加号键
         {
            yunsuanfuhao=1;
            result=result+adden;
                adden=0;
                shownumber(adden);
         }
         else if(keycode==0x25) //减号键
         {
            yunsuanfuhao=2;
            result=result+adden;
                adden=0;
                shownumber(adden);
         }
         else if(keycode==0x0d) // 等号键
         {
            if(yunsuanfuhao==1)           //加法
           {        result=result+adden;
                    adden=0;
           }
            else if(yunsuanfuhao==2) //减法
           {        result=result-adden;
                    adden=0;
           }

                shownumber(result);
        //        result=0;
         }

        else if (keycode==0x1b)                         //清零键
        {
           result=0;
           adden=0;
           shownumber(result);        
        }

  }






  void keydriver()
  {
                    uchar i,j;          //i行 j列
                  static uchar backup[4][4]={{1,1,1,1},{1,1,1,1},{1,1,1,1},{1,1,1,1}};
                    for(i=0;i<4;i++)
           {
              for(j=0;j<4;j++)
                  {
                     if((backup[ i][j])!=(keysta[ i][j]))
                         {
                        
                                   backup[ i][j]=keysta[ i][j]         ;
                                  if(keysta[ i][j]==1)
                                  {
                                    keyaction(keycodemap[ i][j]);
                                  }
                         }
                  }
           }
  }


void keyscan()
{
    static uchar buf[4][4]={{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff}};
        static uchar hang=0;
        uchar i;
         buf[hang][0]=((buf[hang][0])<<1)|((uchar) keyin0);        //按行进行按键值的读取        读该行共4个键的键值 进入buf[hang][0-3]
        buf[hang][1]=((buf[hang][1])<<1)|((uchar) keyin1);
        buf[hang][2]=((buf[hang][2])<<1)|((uchar) keyin2);
        buf[hang][3]=((buf[hang][3])<<1)|((uchar) keyin3);

        for(i=0;i<4;i++)                                                                                                   //判断该按键是否按下 即keysta是否为0 经16ms后读取buf[hang][0-3]的低4位值 观察是否为0X0F 或0X00
        {
          if         (((buf[hang][ i])&0x0f )== 0x0f)   keysta[hang][ i]=1;
          else if         (((buf[hang][ i])&0x0f )== 0x00)   keysta[hang][ i]=0;
         }

        hang++;
        if(hang>=4) hang=0;

        switch(hang)                        //按行扫描,选取第i行,该行线输出低电平
        {
          case 0:keyout3=1;keyout0=0;break; // P1=0B1110 1111;
          case 1:keyout0=1;keyout1=0;break; // P1=0b1101 1111;
          case 2:keyout1=1;keyout2=0;break;//P1=0b1011 1111;
          case 3:keyout2=1;keyout3=0;break;//P1=0b0111 1111;
          default: break;
        }
        

}
void ledscan()
{
     static uchar i=0;
         P2=~(0X01<<i);
         P0=Ledbuf[5-i];
          i++;
         if(i>=6) i=0;

}
  void main()
{
        InitTimer1();
        while(1)
        {
          keydriver();
        }
}
void timer1(void) interrupt 3
{
    TH1 = 0xFC;
    TL1 = 0x18;                                       
    keyscan();
    ledscan();
}


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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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