集成电路技术分享

 找回密码
 我要注册

QQ登录

只需一步,快速开始

搜索
查看: 867|回复: 0

自制简易计算器

[复制链接]
羽蒙 发表于 2014-7-17 15:03:53 | 显示全部楼层 |阅读模式
  #include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit dula=P2^6;
sbit wela=P2^7;
sbit key1=P3^4;
sbit key2=P3^5;
sbit key3=P3^6;
sbit key4=P3^7;
uchar code table[]=
{0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
uchar code list[]=
{0xfe,0xfd,0xfb,0xf7,
0xef,0xdf,0xbf,0x7f};
uchar num,temp[8],b;
uint cc;
void delay(uint x);
void display();
void keyma();
void show(uchar P);
uint output();
void jieguo();
void main()
{
        cc=0;
        TMOD=0x01;
        TH0=(65535-50000)/256;
        TL0=(65535-50000)%256;
        EA=1;
        ET0=1;
        TR0=1;
        while(1)
        {
                if(num==4)
                {
                        num=0;
                        keyma();        
                }
                display();
        }
}
void delay(uint x)
{
        uint i,j;
        for(i=x;i>0;i--)
                for(j=220;j>0;j--);
}
void T0_time() interrupt 1
{
        TH0=(65535-50000)/256;
        TL0=(65535-50000)%256;
        num++;
}
void display()
{
        uint i;
        for(i=0;i<8;i++)
        {
                wela=1;
                P0=list[i];
                wela=0;
                dula=1;
                P0=temp[i];
                dula=0;
                delay(1);
        }
}
void keyma()
{
    uchar a;
        P3=0xfe;
        a=P3;
        a=a&0xf0;
        if(a!=0xf0)
        {
        delay(5);
                a=P3;
                a=a&0xf0;
                if(a!=0xf0)
                {
                        a=P3;
                        switch(a)
                        {
                                case 0xee:
                                b=0;break;
                                case 0xde:
                                b=1;break;
                                case 0xbe:
                                b=2;break;
                                case 0x7e:
                                b=3;break;
                        }
                      while(a!=0xf0)
                         {
                           a=P3;
                           a=a&0xf0;
                         }
                show(b);}
               
        }
        P3=0xfd;
        a=P3;
        a=a&0xf0;
        if(a!=0xf0)
        {         
                delay(5);
                a=P3;
                a=a&0xf0;
                if(a!=0xf0)
                {
                        a=P3;
                        switch(a)
                        {
                                case 0xed:
                                b=4;break;
                                case 0xdd:
                                b=5;break;
                                case 0xbd:
                                b=6;break;
                                case 0x7d:
                                b=7;break;
                        }
                      while(a!=0xf0)
                         {
                           a=P3;
                           a=a&0xf0;
                         }
                show(b);}
               
                }
        P3=0xfb;
        a=P3;
        a=a&0xf0;
        if(a!=0xf0)
        {
                delay(5);
                a=P3;
                a=a&0xf0;
                if(a!=0xf0)
                {
                        a=P3;
                        switch(a)
                        {
                                case 0xeb:
                                b=8;break;
                                case 0xdb:
                                b=9;break;
                                case 0xbb:
                                b=10;break;
                                case 0x7b:
                                jieguo();break;
                        }
                      while(a!=0xf0)
                         {
                           a=P3;
                           a=a&0xf0;
                         }
                show(b);}
               
                }
        P3=0xf7;
        a=P3;
        a=a&0xf0;
        if(a!=0xf0)
        {
        delay(5);
                a=P3;
                a=a&0xf0;
                if(a!=0xf0)
                {
                        a=P3;
                        cc=output();
                        switch(a)
                        {
                                case 0xe7:
                                b=11;break;
                                case 0xd7:
                                b=12;break;
                                case 0xb7:
                                b=13;break;
                                case 0x77:
                                b=14;break;
                        }
                      while(a!=0xf0)
                         {
                           a=P3;
                           a=a&0xf0;
                         }
         }         }
}
void show(uchar p)
{
                uint i;
                for(i=0;i<8;i++)
                temp[i]=temp[i+1];
                temp[7]=table[p];
}
//****************************************************************************************************************************************//
uint output()
{
        uint aa,i;
        for(i=0;i<8;i++)
        {
                aa=aa*10+temp[i];
        }
        for(i=0;i<8;i++)
        {
                temp[i]=0;
        }
        return aa;
}
void jieguo()
{
        uint sum,dd,i,ge[8];
        dd=output();
        if(b==11)
        {
                sum=dd+cc;
        }
        if(b==12)
        {
                sum=dd-cc;
        }
        if(b==13)
        {
                sum=dd*cc;
        }
        if(b==14)
        {
                sum=dd/cc;
        }
        ge[7]=sum%10;
        ge[6]=sum%100/10;
        ge[5]=sum%1000/100;
        ge[4]=sum%10000/1000;
        ge[3]=sum%100000/10000;
        ge[2]=sum%1000000/100000;
        ge[1]=sum%10000000/1000000;
        ge[0]=sum%100000000/10000000;
        for(i=0;i<8;i++)
                temp[i]=table[ge[i]];
        display();
}
这是自制的简易计算器,1、输入时时间摁长时系统就会卡住,必须等一会才能继续按。
2、计算结果有误,结果显示是最后一次输入的最后一位。
求大神指教。。。。。。
您需要登录后才可以回帖 登录 | 我要注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

QQ|小黑屋|手机版|Archiver|fpga论坛|fpga设计论坛 ( 京ICP备20003123号-1 )

GMT+8, 2024-12-26 01:29 , Processed in 0.064463 second(s), 20 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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