登录  | 立即注册

游客您好!登录后享受更多精彩

扫一扫,访问微社区

QQ登录

只需一步,快速开始

开启左侧

[寒假笔记] 计算器的加减乘除应用

[复制链接]
发表于 2022-2-22 22:44:01 | 显示全部楼层 |阅读模式
学习笔记
学习科目: 计算器(加减乘除)
学习安排: 将简易计算器的加法功能拓展到加减乘除
开始时间: 2022-02-22
结束时间:
#include<reg52.h>

sbit ENLED=P1^1;

sbit P20=P2^0;
sbit P21=P2^1;
sbit P22=P2^2;
sbit P23=P2^3;
sbit kout1=P2^4;
sbit kout2=P2^5;
sbit kout3=P2^6;
sbit kout4=P2^7;

unsigned char ledchar[]={
        0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
        0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,
};
unsigned char keysta[4][4]={
        {1,1,1,1},{1,1,1,1},{1,1,1,1},{1,1,1,1}
};
unsigned char ledbuff[6]={
        0xFF,0xFF,0xFF,0xFF,0xFF,0xFF
};
unsigned char keycodeMap[4][4]={
  {0x31,0x32,0x33,0x26},             //êy×&#214;&#188;ü1£&#187;êy×&#214;&#188;ü2£&#187;êy×&#214;&#188;ü3£&#187;&#207;òé&#207; &#188;ó
        {0x34,0x35,0x36,0x25},             //êy×&#214;&#188;ü4£&#187;êy×&#214;&#188;ü5£&#187;êy×&#214;&#188;ü6£&#187;&#207;ò×ó &#188;&#245;
        {0x37,0x38,0x39,0x28},             //êy×&#214;&#188;ü7£&#187;êy×&#214;&#188;ü8£&#187;êy×&#214;&#188;ü9£&#187;&#207;ò&#207;&#194; 3&#203;
        {0x30,0x1B,0x0D,0x27}              //êy×&#214;&#188;ü0£&#187;ESC&#188;ü£&#187;&#187;&#216;3μ&#188;ü£&#187;   &#207;òóò 3y
};

void keydrive();
void keyaction(unsigned char keycode);
void shownumber(unsigned long num);

void main ()
{
       
        ENLED=0;
  EA=1;
  TMOD=0x01;
  TH0=0xFE;
  TL0=0xEF;
  TR0=1;               //′ò&#191;a&#182;¨ê±&#198;÷
  ET0=1;               //′ò&#191;a&#214;D&#182;&#207;
        ledbuff[0]=ledchar[0];
       
        while(1)
        {
                keydrive();
        }
}
void shownumber(unsigned long num)
{
        unsigned char buf[6];
        signed int i;
        for(i=0;i<6;i++)
        {
                buf[i]=num%10;
                num=num/10;
        }
        for(i=5;i>=1;i--)
        {
                if(buf[i]==0)
                {
                        ledbuff[i]=0xFF;
                }
                else
                        break;
        }
        for(;i>=0;i--)
        {
                ledbuff[i]=ledchar[buf[i]];
        }
}

void keyaction(unsigned char keycode)
{
        static signed long result=0;
        static signed long addend=0;
        static unsigned char i=0;//ó&#195;óú&#197;D&#182;&#207;o&#206;&#214;&#214;&#212;&#203;&#203;&#227;
       
        if((keycode>=0x30)&&(keycode<=0x39))//ê&#228;è&#235;êy×&#214;
        {
                addend=(addend*10)+(keycode-0x30);
                shownumber(addend);
        }
        else if(keycode==0x26)//&#188;ó·¨&#188;ü
        { i=1;
                result+=addend;
                addend=0;
                shownumber(addend);
               
        }
        else if(keycode==0x25)//&#188;&#245;·¨&#188;ü
        {        i=2;
          result-=addend;
                addend=0;
                shownumber(addend);
  }
  else if(keycode==0x28)//3&#203;·¨&#188;ü
        { i=3;
        if(result==0)         //&#212;ú&#189;&#248;DDá&#172;D&#248;&#212;&#203;&#203;&#227;ê±&#197;D&#182;&#207;&#212;&#203;&#203;&#227;D&#206;ê&#189;
        {result=addend;       //è&#231;1&#251;result£&#161;=0£&#172;3D&#189;óé&#207;′&#206;&#212;&#203;&#203;&#227;&#189;á1&#251;
                addend=0;
                shownumber(addend);
        }
        else
        {shownumber(addend);}
        }
        else if(keycode==0x27)//3y·¨&#188;ü
        { i=4;
                if(result==0)    //&#212;ú&#189;&#248;DDá&#172;D&#248;&#212;&#203;&#203;&#227;ê±&#197;D&#182;&#207;&#212;&#203;&#203;&#227;D&#206;ê&#189;
        { result=addend;   //í&#172;é&#207;
                addend=0;
                shownumber(addend);
        }
        else
        {shownumber(addend);}
        }
        else if(keycode==0x0D)//&#187;&#216;3μ&#188;ü
        { switch(i)
                {
                case 1: result+=addend;addend=0;shownumber(result);break;
                case 2: result-=addend;addend=0;shownumber(result);break;
                case 3: result*=addend;addend=0;shownumber(result);break;
                case 4: result/=addend;addend=0;shownumber(result);break;
                default:break;
                }
       
        }
        else if(keycode==0x1B)//ESC&#188;ü
        {
                addend=0;
                result=0;
                shownumber(result);
        }
}

void keydrive()
{
        unsigned int i,j;                           //iê&#199;DD£&#172;jê&#199;áD
        static unsigned char 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(keysta[i][j]!=backup[i][j])
                                {
                                        if(backup[i][j]==0)
                                        {
                                                keyaction(keycodeMap[i][j]);
                                        }
                                        backup[i][j]=keysta[i][j];
                                }
                        }
                }
}

void ledscan()
{
        static unsigned int i=0;
        P0=0xFF;
        if(i==0)
        {P20=121=022=1;i++0=ledbuff[0];}
        else if(i==1)
        {P20=021=022=1;i++0=ledbuff[1];}
        else if(i==2)
        {P20=121=122=0;i++0=ledbuff[2];}
        else if(i==3)
        {P20=021=1;P22=0;i++;P0=ledbuff[3];}
        else if(i==4)
        {P20=1;P21=0;P22=0;i++;P0=ledbuff[4];}
        else if(i==5)
        {P20=0;P21=0;P22=0;i=0;P0=ledbuff[5];}
}

void keyscan()
{
        static unsigned int a=0;
        static unsigned char keyout=0;
        unsigned char i=0;
        static unsigned char keybuf[4][4]={
                0xFF,0xFF,0xFF,0xFF,
          0xFF,0xFF,0xFF,0xFF,
          0xFF,0xFF,0xFF,0xFF,
          0xFF,0xFF,0xFF,0xFF
        };
        P20=1;P21=1;P22=1;P23=1;
       
        keybuf[keyout][0]=(keybuf[keyout][0]<<1)|P20;
        keybuf[keyout][1]=(keybuf[keyout][1]<<1)|P21;
        keybuf[keyout][2]=(keybuf[keyout][2]<<1)|P22;
        keybuf[keyout][3]=(keybuf[keyout][3]<<1)|P23;
       
        for(i=0;i<4;i++)
        {
                if((keybuf[keyout][i]&0x0F)==0x00)
                {
                        keysta[keyout][i]=0;
                }
                else if((keybuf[keyout][i]&0x0F)==0x0F)
                {
                        keysta[keyout][i]=1;
                }
                else{}
        }
       
        keyout++;
        if(keyout>=4)
        {
                keyout=0;
        }
//        keyout=keyout&0x03;
        switch(keyout)
        {
                case 0:kout1=1;kout2=1;kout3=1;kout4=0;break;
                case 1:kout1=1;kout2=1;kout3=0;kout4=1;break;
                case 2:kout1=1;kout2=0;kout3=1;kout4=1;break;
                case 3:kout1=0;kout2=1;kout3=1;kout4=1;break;
    default :break;
        }
        //P20=0;P21=0;P22=0;  
       
        P0=0xFF;
        if(a==0)
        {P20=1;P21=0;P22=1;a++;P0=ledbuff[0];}
        else if(a==1)
        {P20=0;P21=0;P22=1;a++;P0=ledbuff[1];}
        else if(a==2)
        {P20=1;P21=1;P22=0;a++;P0=ledbuff[2];}
        else if(a==3)
        {P20=0;P21=1;P22=0;a++;P0=ledbuff[3];}
        else if(a==4)
        {P20=1;P21=0;P22=0;a++;P0=ledbuff[4];}
        else if(a==5)
        {P20=0;P21=0;P22=0;a=0;P0=ledbuff[5];}
}
void interruptTime() interrupt 1
{
        TH0=0xFE;
  TL0=0xEF;
        ledscan();
        keyscan();
}


好懒~~不想说~~~
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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