社区导航

 

搜索
查看: 1751|回复: 0

[讨论] 哪个好心人帮我改下程序不对(程序是转载)~~先谢了~!

[复制链接]

2

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2009-2-27 16:34 | 显示全部楼层 |阅读模式
简单计算器  加减乘除  采用4×4键盘,分别表示0~9、+、-、×、/ 、=和清零键CL
http://b13.photo.store.qq.com/ht ... 37a452545bcbb7a0b86
#include   
#include   
#define led8 XBYTE[0x80ff]      //51外部16位存储器寻址地址,此处用来通过                                 
#define led7 XBYTE[0x40ff]      //锁存器向数码管输出段选和位选数据   
#define led6 XBYTE[0x20ff]   
#define led5 XBYTE[0x10ff]   
#define led4 XBYTE[0x08ff]   
#define led3 XBYTE[0x04ff]
#define led2 XBYTE[0x02ff]   
#define led1 XBYTE[0x01ff]   
   
unsigned char code tab[11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};//段选码表   
    long value1,value2,result;   
    bit s;   
    int keyt;   
int key1;   
/*****************************************************  
函数名称:getkey()  
作用:扫描键盘并获得键值,利用反选法扫描键盘  
*****************************************************/     
void delay()
{
        int i;
        for(i=0;i<10;i++);
}
  
int getkey()   
{        int key=0;   
    P3=0xfe;   
    P1=0xff;   
    while(P1!=0xff)     //行扫描有低电平信号出现   
    {   
        switch(P1)      //则在P1口全输出高电平的情况下进行列扫描   
        {   
            case 0xfe:key=7;break;  //得出键值   
            case 0xfd:key=8;break;   
            case 0xfb:key=9;break;   
            case 0xf7:key=14;break;        
        }     
    }   
    if(key) return(key);   
    P3=0xfd;   
    P1=0xff;   
    while(P1!=0xff)   
    {   
        switch(P1)   
        {   
            case 0xfe:key=4;break;   
            case 0xfd:key=5;break;   
            case 0xfb:key=6;break;   
            case 0xf7:key=13;break;   
        }   
    }   
    if(key) return(key);   
    P3=0xfb;   
    P1=0xff;   
    while(P1!=0xff)   
    {   
        switch(P1)   
        {   
            case 0xfe:key=1;break;   
            case 0xfd:key=2;break;   
            case 0xfb:key=3;break;   
            case 0xf7:key=12;break;   
        }      
    }   
        if(key) return(key);   
    P3=0xf7;   
    P1=0xff;   
    while(P1!=0xff)   
    {   
        switch(P1)   
        {   
            case 0xfe:key=16;break;   
            case 0xfd:key=10;break;   
            case 0xfb:key=15;break;   
            case 0xf7:key=11;break;   
        }   
    }   
    return(key);   
}   
/****************************************************************  
函数名称:display()  
功能:动态显示任意999999以内的十进制整数,同时监测键盘  
****************************************************************/      
void display(long value)   
{   int neg=0,tempkey=0;        //neg代表是否为负值   
    int k[6]={0};      
    if(value<0) {value=-value;neg=1;}   
    k[5]=value/100000;          //分解整数各位   
    k[4]=(value/10000)%10;   
    k[3]=(value/1000)%10;   
    k[2]=(value/100)%10;   
    k[1]=(value/10)%10;   
    k[0]=value%10;   
    while(1)                //分别显示各位   
    {   
    if(value>=100000)   
        led3=tab[k[5]];
                delay();   
    if(value>=10000)   
        led4=tab[k[4]];
                delay();   
    if(value>=1000)   
        led5=tab[k[3]];
                delay();   
    if(value>=100)   
        led6=tab[k[2]];
                delay();   
    if(value>=10)   
        led7=tab[k[1]];
                delay();   
    led8=tab[k[0]];   
    if(neg==1) led1=tab[10];   
    tempkey=getkey();   
    if(tempkey!=0) {key1=tempkey;break;}     //有键按下,则退出循环向下执行   
    }   
    neg=0;   
}   
/***********************************************************  
主函数:main()  
功能:进行接收数据和命令,完成计算器计算流程  
注:key=1~9分别表示按键数字1~8,key=10表示按键数字0,key=11~16  
分别代表计算器功能键"+" "-" "*" "/" "=" "CE"(清零)  
***********************************************************/      
main()   
{   
    key1=0;   
//读入初值   
reset1: s=0;        //s代表是否有"上一次计算结果"   
reset:  value1=result=0;   
           
read:   if(key1<11&&key1>0)           //非功能键,则从低到高依次读入整数的每一位   
    {   
        value1=value1*10+key1;   
        display(value1);   
            if(key1==16)    goto reset1;    //任何情况下有"="按下便得出结果,返回   
        goto read;                 
    }   
    if(key1<16&&key1>10)   
    {   
                if(s==0)   
            {value2=value1;value1=0;keyt=key1;s=1;   
            display(value2);   
            if(key1==16)goto reset1;   
            goto read;}         //把初值给被运算数   
      
            //      else s=0;   
    }   
   
    if(keyt==11) result=value1+value2;   //功能键 +   
    if(keyt==12) result=value2-value1;   //"-"   
    if(keyt==13) result=value2*value1;   //"*"   
    if(keyt==14) result=value2/value1;   //"/"   
//  if(keyt==15)   
    display(result);        //显示结果   
    if(key1==16) goto reset1;      
    value2=result;           //把结果赋给"上次运算结果",以备继续运算   
    goto reset;   
}
此帖出自单片机论坛

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

关闭

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

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

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

GMT+8, 2020-2-17 07:13 , Processed in 0.084533 second(s), 19 queries , Gzip On, MemCache On.

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