找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 7641|回复: 0
收起左侧

AT89S52单片机实现简易计算器(C语言程序)

[复制链接]
ID:82781 发表于 2015-6-13 19:45 | 显示全部楼层 |阅读模式
本帖最后由 xuwei 于 2015-6-13 19:50 编辑

硬件要求,矩阵键盘(4*4)、数码管、52单片机最小系统及其连接。
鄙人不才,这个是BATE1.0测试版。(无法计算小数、负数、爆表数)

#include<reg52.h>
#include<intrins.h>
//sbit led=P2^0;
sbit duan=P2^1;
sbit wei=P2^2;
unsigned char code duanma[]={
        0xc0,//0
        0xf9,//1
        0xa4,//2
        0xb0,//3
        0x99,//4
        0x92,//5
        0x82,//6
        0xf8,//7
        0x80,//8
        0x90,//9
};
unsigned char dqxs[8]={0xc0,0xff,0xff,0xff,0xff,0xff,0xff,0xff};
unsigned char num1[8],num2[8],dq=1,ysf=0,zt=0;//num1是被操作数,num为原操作数,dq是当前操作数,ysf是运算符保存,zt按键状态;
unsigned char error=0;
void xianshishu()
{
        char i;
        if(dq==1)
        {
                for(i=7;i>0;i--)
                {
                if(num1[ i])
                break;
                dqxs[ i]=0xff;
                }
                while(i>=0)
                {        
                        dqxs[ i]=duanma[num1[ i]];
                        i--;
                }
        }
        if(dq==2)
        {
                for(i=7;i>0;i--)
                {
                if(num2[ i])
                break;
                dqxs[ i]=0xff;
                }
                while(i>=0)
                {        
                        dqxs[ i]=duanma[num2[ i]];
                        i--;
                }
        }
}
void xieshu(unsigned char a)
{
        int i;
        if(dq==1)
        {for(i=7;i>0;i--)
        num1[ i]=num1[i-1];
        num1[0]=a;
        }
        else if(dq==2)
        {
        for(i=7;i>0;i--)
        num2[ i]=num2[i-1];
        num2[0]=a;
        }
        xianshishu();
}
void delay()
{
        unsigned char a=255;
        while(a--);
}
void display()
{
        unsigned char x=0x01,i;
        for(i=0;i<8;i++)
        {
                P0=x;
                wei=1;
                wei=0;
                P0=dqxs[ i];
                duan=1;
                delay();
                P0=0xff;
                duan=0;
                x=_crol_(x,1);

        }
}
void yunsuan()
{
        unsigned char fs=0x7f;
        int i;
        long int a=0,b=0;
        if(ysf==0)
        return;        
        for(i=7;i>=0;i--)
        {
                a=a*10+num1[ i];
                b=b*10+num2[ i];
        }
        switch(ysf)
        {
                case 1:a+=b;break;
                case 2:a-=b;break;
                case 3:a*=b;break;
                case 4:a/=b;break;
        }
        /*P0=0x00;
        wei=1;
        wei=0;
        led=1;
        for(i=0;i<8;i++)
        {
                P0=fs;
            delay();delay();delay();delay();delay();delay();delay();delay();delay();delay();delay();
                   fs=_cror_(fs,1);
        }
        P0=0xff;
        led=0;
        */
        if(a>=100000000||a<0)
        {
                dqxs[0]=0x84;
                for(i=1;i<8;i++)
                dqxs[ i]=0xff;
                error=1;
        }
        else
        {
                for(i=0;i<8;i++)
                {
                        num1[ i]=a%10;
                        a/=10;
                }
                dq=1;
                xianshishu();
        }
}
main()//主函数除了显示啥都不用干,Jibs程序就是这么牛逼
{
        //led=0;
        EA=1;
        ET0=1;
        TMOD=0x02;
        TH0=0;
        TL0=0;
        TR0=1;
        while(1)
        display();
}
void t0() interrupt 1
{
        unsigned char h=0,l=0,i;
        P1=0x0f;
        if(zt)
        {
                if(P1==0x0f)
                zt=0;
                return;
        }
        else
        {
                if(P1!=0x0f)
                {
                        zt=1;
                        switch(P1)
                        {
                                case 0x0e:h=1;break;
                                case 0x0d:h=2;break;
                                case 0x0b:h=3;break;
                                case 0x07:h=4;break;                                
                        }
                        P1=0xf0;
                        switch(P1)
                        {
                                case 0xe0:l=1;break;
                                case 0xd0:l=2;break;
                                case 0xb0:l=3;break;
                                case 0x70:l=4;break;
                        }
                        if(h==1)
                        {
                                switch(l)
                                {
                                        case 1:if(error)break;xieshu(1);break;
                                        case 2:if(error)break;xieshu(2);break;
                                        case 3:if(error)break;xieshu(3);break;
                                        case 4:if(error)break;ysf=1;dq=2;for(i=0;i<8;i++)num2[ i]=0;break;
                                }
                        }
                        else if(h==2)
                        {
                                switch(l)
                                {
                                        case 1:if(error)break;xieshu(4);break;
                                        case 2:if(error)break;xieshu(5);break;
                                        case 3:if(error)break;xieshu(6);break;
                                        case 4:if(error)break;ysf=2;dq=2;for(i=0;i<8;i++)num2[ i]=0;break;
                                }
                        }
                        else if(h==3)
                        {
                                switch(l)
                                {
                                        case 1:if(error)break;xieshu(7);break;
                                        case 2:if(error)break;xieshu(8);break;
                                        case 3:if(error)break;xieshu(9);break;
                                        case 4:if(error)break;ysf=3;dq=2;for(i=0;i<8;i++)num2[ i]=0;break;
                                }
                        }
                        else if(h==4)
                        {
                                switch(l)
                                {
                                        case 1:ysf=0;dq=1;error=0;
                                                for(i=0;i<8;i++)
                                                {        num1[ i]=0;
                                                        num2[ i]=0;
                                                }
                                                xianshishu();
                                                        break;
                                        case 2:if(error)break;xieshu(0);break;
                                        case 3:if(error)break;yunsuan();break;
                                        case 4:if(error)break;ysf=4;dq=2;for(i=0;i<8;i++)num2[ i]=0;break;
                                }
                        }
                }
               
        }

        
}
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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