不正常的計算器

在這裏插入圖片描述

#include <reg51.h>
#include <stdio.h>
#define uchar unsigned char

unsigned char code table[]= {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};	//共陰極數碼管

unsigned char keynum,flag;
unsigned char num1,num2,flag1,flag2,flag3,flag4;
uchar keyscan(void);
void display();
void keyfind();
void keyprocess(void);

void delay(unsigned int z)	 
{
    unsigned int x,y;
    for(x=110; x>0; x--)
        for(y=z; y>0; y--);
}
void main(void)
{
    while(1)
    {
        keyfind();
        keyprocess();
        display();
    }
}

uchar keyscan(void)
{
    unsigned char cord_l,cord_h;
    P1=0xf0;
    if ((P1&0xf0)!=0xf0) 
    {
        delay(50);
        if ((P1&0xf0)!=0xf0)
        {
            cord_l = P1 & 0xf0;
            P1 = cord_l | 0x0f;
            cord_h = P1 & 0x0f;
            flag++;	  
            while( (P1 & 0x0f) != 0x0f );
            return (cord_l + cord_h);
        }
    }
}
void keyfind()
{
    switch( keyscan() )
    {
    //第一行鍵值碼
    case 0xee:
        keynum=1;
        break;
    case 0xde:
        keynum=2;
        break;
    case 0xbe:
        keynum=3;
        break;
    case 0x7e:
        keynum=4;
        break;

    //第二行鍵值碼
    case 0xed:
        keynum=5;
        break;
    case 0xdd:
        keynum=6;
        break;
    case 0xbd:
        keynum=7;
        break;
    case 0x7d:
        keynum=8;
        break;

    //第三行鍵值碼
    case 0xeb:
        keynum=9;
        break;
    case 0xdb:
        keynum=10;
        break;
    case 0xbb:
        keynum=11;
        break;
    case 0x7b:
        keynum=12;
        break;

    //第四行鍵值碼
    case 0xe7:
        keynum=13;
        break;
    case 0xd7:
        keynum=14;
        break;
    case 0xb7:
        keynum=15;
        break;
    case 0x77:
        keynum=16;
        break;
    }
}
void keyprocess(void)
{
    switch(keynum)
    {

    case 1:
        if(flag==1) 
            num1=7;	  
        if(flag==3) 
            num2=7;
        break;
    case 2:
        if(flag==1)
            num1=4;
        if(flag==3)
            num2=4;
        break;
    case 3:
        if(flag==1)
            num1=1;
        if(flag==3)
            num2=1;
        break;

    case 5:
        if(flag==1)
            num1=8;
        if(flag==3)
            num2=8;
        break;
    case 6:
        if(flag==1)
            num1=5;
        if(flag==3)
            num2=5;
        break;
    case 7:
        if(flag==1)
            num1=2;
        if(flag==3)
            num2=2;
        break;
    case 8:
        if(flag==1)
            num1=0;
        if(flag==3)
            num2=0;
        break;
    case 9:
        if(flag==1)
            num1=9;
        if(flag==3)
            num2=9;
        break;
    case 10:
        if(flag==1)
            num1=6;
        if(flag==3)
            num2=6;
        break;
    case 11:
        if(flag==1)
            num1=3;
        if(flag==3)
            num2=3;
        break;
    case 4:
        flag1=1;
        break;
    case 12:
        flag1=2;
        break;
    case 13:
        flag2=1;
        break;
    case 14:
        flag2=2;
        break;
    case 15:
        flag2=3;
        break;
    case 16:
        flag2=4;
        break;
    }
    keynum=0;	 
}
void display()
{
    unsigned char num,num_shi,num_ge;
    if(flag1==1)	  
    {
        num1=0;
        num2=0;
        num=0;
        flag=0;
        flag1=0;
        flag2=0;
        flag3=0;
        flag4=0;
        P2=0xff;
    }
    if(flag==1|flag3==1) 
    {
        flag3=1;
        P2=0xfe;
        P0=table[num1];
        delay(10);
    }
    if(flag==3|flag4==1)
    {
        flag4=1;
        P2=0xfd;
        P0=table[num2];
        delay(10);
    }
    if(flag2==1&&flag1==2) 
    {
        num=num1/num2;
    }
    if(flag2==2&&flag1==2) 
    {
        num=num1*num2;
    }
    if(flag2==3&&flag1==2)
    {
        num=num1-num2;
    }
    if(flag2==4&&flag1==2) 
    {
        num=num1+num2;
    }

    num_shi=num/10;	
    num_ge=num%10;
    if(flag==4)		 
    {
        P2=0xfb;
        P0=table[num_shi];  
        delay(10);

        P2=0xf7;
        P0=table[num_ge];  
        delay(10);
    }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章