社区导航

 
快捷导航
  • 首页
  • 论坛
  • 查看新帖
  • 最新回复
  • 社区活动
  • 联系管理员
  • 消灭零回复
  • E金币兑换
  • 干货
搜索
查看: 1242|回复: 0

[讨论] 基于STC12C5608AD设计简易计算器问题求助

[复制链接]

29

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2014-1-4 11:25:58 | 显示全部楼层 |阅读模式
程序烧进板子去了后,,10个数字键能正常显示,功能键按下的时候会乱码,帮忙看下程序有什么问题,感激不尽!
源程序如下
#include <STC12C5608AD.H>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar e,f,temp,fu=0;
uint a=50,flag=0,key,dyh,bru,cru,i,fuhao=0;

long c=0,d=0,b=0;
uint code bite[]={0x04,0x08,0x10,0x20};
uint code DSY_CODE[]=
{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e        };

void delay(uint x)
{
        uchar t;
        while(x--)
        {
                 for(t=120;t>0;t--);
        }
}

uint kescan()
{
                                                uint com;
                                                 P1=0xf0;
                                                e=P1;
                                                P1=0x0f;
                                                f=P1;
                                                temp=e|f;
                                                while(P1!=0x0f);
                                          if(temp==0xb7)com=0;
                                                if(temp==0x7e)com=1;          
                                                if(temp==0xbe)com=2;          
                                                if(temp==0xde)com=3;      
                                            if(temp==0x7d)com=4;
                                                if(temp==0xbd)com=5;
                                                if(temp==0xdd)com=6;
                                                if(temp==0x7b)com=7;
                                                if(temp==0xbb)com=8;
                                                if(temp==0xdb)com=9;
                                                if(temp==0x77)com=10;
                                                if(temp==0xd7)com=11;
                                                if(temp==0xe7)com=12;
                                                if(temp==0xeb)com=13;
                                                if(temp==0xed)com=14;
                                                if(temp==0xee)com=15;
                                                return(com);
                                          
}

                        
         void dis(uint n)
{               
        if(n/10000)
                {
                 for(i=0;i<4;i++)
                        {                if(fu==1)
                         P2=~(DSY_CODE[15]&&0x7f);
                                        if(fu==0)
                                        P2=~DSY_CODE[15];
                                 P3=bite[3-i];
                                 n=n/10;
                                 delay(4);
                                 P3=0x00;
                        }
        }
                else if(n/1000)
       {
                     for(i=0;i<4;i++)
                   {                if(fu==1)
                        P2=~(DSY_CODE[n%10]&0x7f);
                                        if(fu==0)
                                P2=~DSY_CODE[n%10];       
                                P3=bite[3-i];
                                n=n/10;
                                delay(4);
                                P3=0x00;
                   }
                }
        else        if(n/100)
                {
                        for(i=0;i<3;i++)
                        {                if(fu==1)
                         P2=~(DSY_CODE[n%10]&0x7f);
                                        if(fu==0)
                                P2=~DSY_CODE[n%10];
                                 P3=bite[3-i];
                                 n=n/10;
                                 delay(4);
                                 P3=0x00;
                        }

                }
        else        if(n/10)
                {
                        for(i=0;i<2;i++)
                        {                if(fu==1)
                                P2=~(DSY_CODE[n%10]&0x7f);
                                        if(fu==0)
                                        P2=~DSY_CODE[n%10];
                            P3=bite[3-i];
                            n=n/10;
                            delay(4);
                            P3=0x00;
                        }
                }
        else        if(n%10)
                                {if(fu==1)
                                  P2=~(DSY_CODE[n]&0x7f);
                                if(fu==0)
                                P2=~DSY_CODE[n];
                                  P3=0x20;
                                  delay(4);
                                }
       
}
void caculate(uint z)

  { if(z==10)
        {
                P2=0x76;
                P3=0x20;                 
        }
        if(z==11)
        {
      P2=0x40;
          P3=0x20;       
    }
    if(z==12)
        {
      P2=0x80;
          P3=0x20;
    }           
    if(z==13)
    {
                P2=0x49;
                P3=0x20;
               
        }

  }



void div(void)
        {
                        d=b/c;
         
                 if(d/1000)
       {
                     for(i=0;i<4;i++)
                   {       
                                P2=~DSY_CODE[d%10];       
                                P3=bite[3-i];
                                d=d/10;
                                delay(4);
                                P3=0x00;
                   }
                }
        else        if(d/100)
                {  d=10*b/c;
                        for(i=0;i<4;i++)
                        {                if(i==1)
                         P2=~(DSY_CODE[d%10]&0x7f);
                                        if(i!=1)
                                 P2=~DSY_CODE[d%10];
                                 P3=bite[3-i];
                                 d=d/10;
                                 delay(4);
                                 P3=0x00;
                        }

                }
        else        if(d/10)
                {        d=100*b/c;
                        for(i=0;i<4;i++)
                        {                if(i==2)
                                P2=~(DSY_CODE[d%10]&0x7f);
                                        if(i!=2)
                                        P2=~DSY_CODE[d%10];
                            P3=bite[3-i];
                            d=d/10;
                            delay(4);
                            P3=0x00;
                        }
                }
        else        if(d%10)
                                {          d=1000*b/c;
                                        for(i=0;i<4;i++)       
                                        {       
                                                        if(i==3)
                                                P2=~(DSY_CODE[d%10]&0x7f);
                                                        if(i!=3)
                                                        P2=~DSY_CODE[d%10];
                                            P3=bite[3-i];
                                            d=d/10;
                                            delay(4);
                                            P3=0x00;
       
                                        }
                                }
          else
                                {
                                        d=(1000*b)/c;
                                for(i=0;i<4;i++)       
                                {        if(i==3)
                                P2=~(DSY_CODE[0]&0x7f);
                                        if(i!=3)
                                        P2=~DSY_CODE[d%10];
                                    P3=bite[3-i];
                                    d=d/10;
                                    delay(4);
                                    P3=0x00;

                                }

                                }




        }





void main()
{  
P3M1=0xff;
P2M1=0xff;
P2M0=0x00;
P3M0=0x00;
P1M0=0x00;
P1M1=0x00;
          
        flag=0;cru=0;bru=0;dyh=0;
                while(1)
                {
                      P1=0xf0;
                        if(P1!=0xf0)
                  {
                                        delay(30);
                                        if(P1!=0xf0)
                                        a=kescan();       
                               
                      }               
                                              if(a>9&&a<14)
                                    {flag=1;key=a;fuhao=1;}

                                if(a>=0&&a<10)
                                {        if(flag==1)
                                        {
                     c=10*c+a;
                                        if(c/10000)
                                           c=0;
                                cru=1;bru=1;
                      }
                                        if(flag==0)
                                        {
                                        b=10*b+a;
                                        if(b/10000)
                                          b=0;
                                    bru=1;
                                    }
                                }       
                           if(a==14)
                                {
                                        if(flag==0)
                                         b=b/10;
                                        if(flag==1)
                                         c=c/10;       
                                }

                if(a==15)
                {   dyh=1;
                        if(flag==1&&bru==1&&cru==1)
                        {  switch(key)
                                {
                                case 10:d=b+c;break;
                                case 11:if(b>=c)
                                d=b-c;        if(b<c){d=c-b;fu=1;}break;
                                case 12:d=b*c;break;
                                case 13:d=b/c;break;

               
                }
                        }
                }
                               
           

                 
                       
                if(bru==1)
                {
                            P1=0x0f;
                        while(P1==0x0f)
                        {       
                                P1=0x0f;
                                if(cru!=1&&dyh!=1&&fuhao==0)
                                {if(b==0){ P2=~DSY_CODE[0];P3=0x20;}        if(b!=0)dis(b);}
                                if(cru!=1&&dyh!=1&&fuhao==1)
                                        caculate(key);
                                if(cru==1&&dyh!=1&&fuhao==1)
                            {if(c==0){ P2=~DSY_CODE[0];P3=0x20;}        if(c!=0)dis(c);}
                                if(cru==1&&dyh==1&&key!=13&&fuhao==1)
                                        dis(d);
                                if(cru==1&&dyh==1&&key==13&&fuhao==1)
                            {        if(b==b/c*c)dis(d);if(b!=b/c*c)div();d=b/c;}
                        }       
                        if(flag==1&&cru==1&&bru==1&&dyh==1)
                   {flag=0;cru=0;bru=0;b=d;c=0;dyh=0;fu=0;}
                               
                }
               
                       
        }
}
此帖出自51单片机论坛


回复

使用道具 举报

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

本版积分规则

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

小黑屋|手机版|Archiver|电子工程世界 ( 京ICP证 060456

GMT+8, 2018-6-19 20:05 , Processed in 0.083948 second(s), 16 queries , Gzip On, Redis On.

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