找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1804|回复: 2
收起左侧

51单片机计算器程序求注释

[复制链接]
ID:951513 发表于 2021-7-10 14:48 | 显示全部楼层 |阅读模式
#include <reg52.h>
#include <intrins.h>
typedef unsigned int uint;
typedef unsigned char uchar;
sbit DU=P2^6;
sbit WE=P2^7;
uchar code SMGduan[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
uchar code LED[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};

int num;
int n1=0,n2=0;//数据传递的中间变量
uchar flag;//运算符号标志位
uchar F,T;//输入负数的标志位
uchar j=0;//计算器开关标志位
uchar A=0;//储存结果数组变量
uchar C=0;//读取结果数组变量
int tabel5[20]={0};//计算器计算结果储存数组
void delay(uint z)//延时函数
{
        uint x,y;
        for(x=z;x>0;x--)
                for(y=114;y>0;y--);
}

void display(int i)//显示函数
{
        if(i>=0)
        {
                if(i<10)
                {
                        P0=0XFF;//数码管清零,避免程序执行时混乱
                        WE=1;//打开位选
                        P0=0XFE;//点亮第二位数码管
                        WE=0;关闭位选
                        DU=1;打开段选
                        P0=SMGduan[ i];//从P0口输出数字i的段码
                        DU=0;//关闭段选
                        delay(8);//去抖动
                }
                if(i>=10&&i<99)
                {
                        P0=0XFF;
                        WE=1;
                        P0=0XFE;
                        WE=0;
                        DU=1;
                        P0=SMGduan[i/10];
                        DU=0;
                        delay(8);
                        P0=0XFF;
                        WE=1;
                        P0=0XFd;
                        WE=0;
                        DU=1;
                        P0=SMGduan[i%10];
                        DU=0;
                        delay(8);
                }
                if(i>=100&&i<999)
                {
                        P0=0XFF;
                        WE=1;
                        P0=0XFE;
                        WE=0;
                        DU=1;
                        P0=SMGduan[i/100];
                        DU=0;
                        delay(8);
                        P0=0XFF;
                        WE=1;
                        P0=0XFd;
                        WE=0;
                        DU=1;
                        P0=SMGduan[i%100/10];
                        DU=0;
                        delay(8);
                        P0=0XFF;
                        WE=1;
                        P0=0XFb;
                        WE=0;
                        DU=1;
                        P0=SMGduan[i%10];
                        DU=0;
                        delay(8);
                }
        }
        else
        {
                i=-i;
                if(i<9)
                {
                        P0=0XFF;
                        WE=1;
                        P0=0XFE;
                        WE=0;
                        DU=1;
                        P0=0x40;
                        DU=0;
                        delay(8);
                        P0=0XFF;
                        WE=1;
                        P0=0XFd;
                        WE=0;
                        DU=1;
                        P0=SMGduan[ i];
                        DU=0;
                        delay(8);
                }
                if(i>=10&&i<99)
                {
                        P0=0XFF;
                        WE=1;
                        P0=0XFe;
                        WE=0;
                        DU=1;
                        P0=0x40;
                        DU=0;
                        delay(8);
                        P0=0XFF;
                        WE=1;
                        P0=0XFd;
                        WE=0;
                        DU=1;
                        P0=SMGduan[i/10];
                        DU=0;
                        delay(8);
                        P0=0XFF;
                        WE=1;
                        P0=0XFb;
                        WE=0;
                        DU=1;
                        P0=SMGduan[i%10];
                        DU=0;
                        delay(8);
                }
                if(i>=100&&i<999)
                {
                        P0=0XFF;
                        WE=1;
                        P0=0XFe;
                        WE=0;
                        DU=1;
                        P0=0x40;
                        DU=0;
                        delay(8);
                        P0=0XFF;
                        WE=1;
                        P0=0XFd;
                        WE=0;
                        DU=1;
                        P0=SMGduan[i/100];
                        DU=0;
                        delay(8);
                        P0=0XFF;
                        WE=1;
                        P0=0XFb;
                        WE=0;
                        DU=1;
                        P0=SMGduan[i%100/10];
                        DU=0;
                        delay(8);
                        P0=0XFF;
                        WE=1;
                        P0=0XF7;
                        WE=0;
                        DU=1;
                        P0=SMGduan[i%10];
                        DU=0;
                        delay(8);
                }
        }
}
//也可以用中断来实现

//矩阵键盘的扫描
void keyscan()
{
        uchar temp;
        P3=0XFF;
        P3=0XFE;
        temp=P3&0XF0;
        if(temp!=0xf0)
        {
                delay(20);
                P3=0XFE;
                temp=P3&0xf0;
                if(temp!=0xf0)
                {
                        temp=P3;
                        switch(temp)
                        {
                                case 0xee:
                                                        delay(20);
                                                
                                                        if(T==0)
                                                        {
                                                                n1=10*n1+7;num=n1;F=1;i++;break;
                                                        }
                                                        if(T==1)
                                                        {
                                                                n1=10*n1-7;num=n1;F=1;i++;break;
                                                        }        
                                case 0xde:         
                                                        delay(20);
                                                
                                                        if(T==0)
                                                        {
                                                                n1=10*n1+8;num=n1;F=1;i++;break;
                                                        }
                                                        if(T==1)
                                                        {
                                                                n1=10*n1-8;num=n1;F=1;i++;break;
                                                        }
                                case 0xbe:         
                                                        delay(20);
                                                
                                                        if(T==0)
                                                        {
                                                                n1=10*n1+9;num=n1;F=1;i++;break;
                                                        }
                                                        if(T==1)
                                                        {
                                                                n1=10*n1-9;num=n1;F=1;i++;break;
                                                        }
                                case 0x7e:
                                                        delay(20);
                                                
                                                        n2=n1;
                                                        n1=0;
                                                        flag=1;
                                                        WE=1;
                                                        P0=0XFF;
                                                        WE=0;
                                                        T=0;
                                                        F=0;
                                                        i++;
                                                        break;
                        }//+
                        while(temp!=0xf0)
                        {
                                temp=P3;
                                temp=temp&0xf0;
                        }
                        P3=0XFF;
                }
        }
        P3=0XFF;
        P3=0XFD;
        temp=P3&0xf0;
        if(temp!=0xf0)
        {
                delay(20);
                P3=0XFD;
                temp=P3&0xf0;
                if(temp!=0xf0)
                {
                        temp=P3;
                        switch(temp)
                        {
                                case 0xed:        
                                                        delay(20);
                                                
                                                        if(T==0)
                                                        {
                                                                n1=10*n1+4;num=n1;F=1;i++;break;
                                                        }
                                                        if(T==1)
                                                        {
                                                                n1=10*n1-4;num=n1;F=1;i++;break;
                                                        }
                                case 0xdd:         
                                                        delay(10);
                                                
                                                        if(T==0)
                                                        {
                                                                n1=10*n1+5;num=n1;F=1;i++;break;
                                                        }
                                                        if(T==1)
                                                        {
                                                                n1=10*n1-5;num=n1;F=1;i++;break;
                                                        }
                                case 0xbd:         
                                                        delay(20);
                                                        
                                                        if(T==0)
                                                        {
                                                                n1=10*n1+6;num=n1;F=1;i++;break;
                                                        }
                                                        if(T==1)
                                                        {
                                                                n1=10*n1-6;num=n1;F=1;i++;break;
                                                        }
                                case 0x7d:
                                                        delay(20);
                                                        
                                                    if(F==1)
                                                   {
                                                                n2=n1;
                                                                n1=0;
                                                                flag=2;
                                                                WE=1;
                                                                P0=0XFF;
                                                                WE=0;
                                                                T=0;
                                                                F=0;
                                                                i++;
                                                                break;
                                                        }//-
                                                        if(F==0)
                                                        {
                                                                T=1;
                                                                break;
                                                        }//负号                                       
                        }
                        while(temp!=0xf0)
                        {
                                temp=P3;
                                temp=temp&0xf0;
                        }
                        P3=0XFF;
                }
        }
        P3=0XFF;
        P3=0XFB;
        temp=P3&0xf0;
        if(temp!=0xf0)
        {
                delay(20);
                P3=0XFB;
                temp=P3&0XF0;
                if(temp!=0xf0)
                {
                        temp=P3;
                        switch(temp)
                        {
                                case 0xeb:
                                                        delay(20);
                                                
                                                        if(T==0)
                                                        {
                                                                n1=10*n1+1;num=n1;F=1;i++;break;
                                                        }
                                                        if(T==1)
                                                        {
                                                                n1=10*n1-1;num=n1;F=1;i++;break;
                                                        }
                                case 0xdb:
                                                        delay(20);
                                                
                                                        if(T==0)
                                                        {
                                                                n1=10*n1+2;num=n1;F=1;i++;break;
                                                        }
                                                        if(T==1)
                                                        {
                                                                n1=10*n1-2;num=n1;F=1;i++;break;
                                                        }
                                case 0xbb:         
                                                        delay(20);
                                                
                                                        if(T==0)
                                                        {
                                                                n1=10*n1+3;num=n1;F=1;i++;break;
                                                        }
                                                        if(T==1)
                                                        {
                                                                n1=10*n1-3;num=n1;F=1;i++;break;
                                                        }
                                case 0x7b:
                                                        delay(20);
                                                
                                                        n2=n1;
                                                        n1=0;
                                                        flag=3;
                                                        WE=1;
                                                        P0=0XFF;
                                                        WE=0;
                                                        T=0;
                                                        F=0;
                                                        i++;
                                                        break;
                        }//  X
                        while(temp!=0xf0)
                        {
                                temp=P3;
                                temp=temp&0xf0;
                        }
                        P3=0XFF;
                }
        }
        P3=0XFF;
        P3=0XF7;
        temp=P3&0xf0;
        if(temp!=0xf0)
        {
                delay(20);
                P3=0XF7;
                temp=P3&0xf7;
                if(temp!=0xf0)
                {
                        temp=P3;
                        switch(temp)
                        {
                                case 0xe7:         
                                                        delay(20);
                                                
                                                        i++;
                                                        n1=n1/10;
                                                        num=n1;
                                                        break;
                                case 0xd7:         
                                                        delay(20);
                                                
                                                        if(T==0)
                                                        {
                                                                n1=10*n1;num=n1;F=1;i++;break;
                                                        }
                                                        if(T==1)                                       
                                                        {
                                                                n1=10*n1;num=n1;F=1;i++;break;
                                                        }
                                case 0xb7:
                                                        delay(20);
                                                
                                                        if(flag==1) num=n2+n1;        
                                                           if(flag==2) num=n2-n1;
                                                           if(flag==3) num=n2*n1;
                                                           if(flag==4) num=n2/n1;
                                                          n1=0;
                                                           WE=1;
                                                           P0=0XFF;
                                                          WE=0;
                                                           F=0;//一次计算完成后重置标志位
                                                           i++;
                                                           break;//=
                                case 0x77:
                                                        delay(20);
                                                
                                                        n2=n1;
                                                        n1=0;
                                                        flag=4;
                                                        WE=1;
                                                        P0=0XFF;
                                                        WE=0;
                                                        T=0;
                                                        F=0;
                                                        i++;
                                                        break;//÷
                        }
                        while(temp!=0xf0)
                        {
                                temp=P3;
                                temp=temp&0xf0;
                        }
                        P3=0XFF;
                }
        }
        P3=0XFF;
        if(P3==0XFB)
        {
                delay(20);
                if(P3==0XFB)
                {
                        tabel5[A]=num;
                        C=A;//将数组变量赋给读取数组的变量
                        A++;
                        n1=0;
                        num=0;
                        if(A>9)
                        {
                                for(A=9;A>-1;A--)
                                {
                                        tabel5[A]=0;
                                }
                                A=0;
                        }//存满后自动清零
                        while(P3==0XFB);
                }
        }
        if(P3==0XF7)
        {
                delay(20);
                if(P3==0XF7)
                {
                        num=tabel5[C];
                        C--;
                        while(P3==0XF7);
                }
        }                                
}
void keyscan1()//部分独立键盘判断
{
        if(P3==0XFE)
        {
                delay(10);
                if(P3==0XFE)
                {
                        j=1;
                        WE=1;
                        P0=0xFF;
                        WE=0;
                        num=0;
                        n1=0;
               
                        delay(20);
               
                        P1=0XFF;
                        while(P3==0XFE);
                }
        }
        P3=0XFF;
        if(P3==0XFD)
        {
                delay(20);
                if(P3==0XFD)
                {
                        j=0;
               
                        delay(20);
               
                        while(P3==0XFD);
                }
        }
}
void main()
{
        while(1)
        {
                if(j==1)
                {
                        keyscan1();
                }
                if(j==0)
                {        
                        keyscan();
                        display(num);
                        P1=LED[ i];
                        if(i>7)
                        {
                                i=0;
                        }
                        keyscan1();
                }
        }
}

回复

使用道具 举报

ID:584814 发表于 2021-7-12 08:08 | 显示全部楼层
原理上这个得找原作者,或者悬赏
回复

使用道具 举报

ID:798631 发表于 2021-7-12 08:35 | 显示全部楼层
我一直认为看别人的程序不如自己编  尤其是应用程序
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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