微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 51单片机用数码管显示适用矩阵键盘做的简易计算器,求大神指点指点

51单片机用数码管显示适用矩阵键盘做的简易计算器,求大神指点指点

时间:10-02 整理:3721RD 点击:
目前只写到这里,只能做简单的数字键入,下来要做+、-、*、/
可是怎么做都做不出来,求大神帮忙指点指点
我是使用下图做的程序和仿真,刚开始学,以前对C印象不深,但是做这个却很有意思
老师没教过位码,所以最好不要使用位码
#include<reg51.h>
unsigned char temp,temp1,temp2,flag;
unsigned char n1,n2,n3,n4,n5,n6,n7,n8;
unsigned long num;
unsigned char table[]=
{
        0x3f,0x06,0x5b,0x4f,0x66,
        0x6d,0x7d,0x07,0x7f,0x6f,0x00       
};
sbit com1=P2^0;
sbit com2=P2^1;
sbit com3=P2^2;
sbit com4=P2^3;
sbit com5=P2^4;
sbit com6=P2^5;
sbit com7=P2^6;
sbit com8=P2^7;
void delay();
void delay10ms();
void display_num1();
void key_scan()
{
        P3=0xf0;
        temp1=P3;
        if(temp1!=0xf0)
        {
                delay10ms();
                if(temp1!=0xf0)
                {
                        P3=0x0f;
                        temp2=P3;
                        temp=temp1|temp2;
                        switch(temp)
                        {
                                case 0xee:temp=0;num=num*10+temp;break;         //
                                case 0xde:temp=1;num=num*10+temp;break;         //
                                case 0xdd:temp=2;num=num*10+temp;break;         //
                                case 0xdb:temp=3;num=num*10+temp;break;         //
                               
                                case 0xbe:temp=4;num=num*10+temp;break;         //  
                                case 0xbd:temp=5;num=num*10+temp;break;         //         
                                case 0xbb:temp=6;num=num*10+temp;break;         //  
                                case 0x7e:temp=7;num=num*10+temp;break;         //         
                               
                                case 0x7d:temp=8;num=num*10+temp;break;         //
                                case 0x7b:temp=9;num=num*10+temp;break;         //
                                case 0xed:temp=10;break; //        .
                                case 0xeb:temp=11;break; //        =
                               
                                case 0x77:temp=12;break; // +
                                case 0xb7:temp=13;break; //        -
                                case 0xd7:temp=14;break; //        *
                                case 0xe7:temp=15;break; //        /
       
                        }
                        while(P3!=0x0f);
                }
        }       
}
void display_num1()
{
        n8=num/10000000;
        n7=num%10000000/1000000;
        n6=num%1000000/100000;
        n5=num%100000/10000;
        n4=num%10000/1000;
        n3=num%1000/100;
        n2=num%100/10;
        n1=num%10;
        if(n8==0)
                n8=10;       
        if((n8==10)&&(n7==0))
                n7=10;
        if((n8==10)&&(n7==10)&&(n6==0))
                n6=10;
        if((n8==10)&&(n7==10)&&(n6==10)&&(n5==0))
                n5=10;
        if((n8==10)&&(n7==10)&&(n6==10)&&(n5==10)&&(n4==0))
                n4=10;
        if((n8==10)&&(n7==10)&&(n6==10)&&(n5==10)&&(n4==10)&&(n3==0))
                n3=10;
        if((n8==10)&&(n7==10)&&(n6==10)&&(n5==10)&&(n4==10)&&(n3==10)&&(n2==0))
                n2=10;
                com8=1;
                P0=~table[n1];
                delay();
                com8=0;
                com7=1;
                P0=~table[n2];
                delay();
                com7=0;
       
                com6=1;
                P0=~table[n3];
                delay();
                com6=0;
       
                com5=1;
                P0=~table[n4];
                delay();
                com5=0;
       
               
                com4=1;
                P0=~table[n5];
                delay();
                com4=0;
       
                com3=1;
                P0=~table[n6];
                delay();
                com3=0;
       
                com2=1;
                P0=~table[n7];
                delay();
                com2=0;
       
                com1=1;
                P0=~table[n8];
                delay();
                com1=0;
       
}  
void main()
{
        while(1)
        {
                key_scan();
                display_num1();
        }
}
void delay()
{
        unsigned char i,j;
        for(i=0;i<50;i++)
                for(j=0;j<10;j++);
}
void delay10ms()
{
        unsigned char i,j;
        for(i=0;i<130;i++)
                for(j=0;j<38;j++);
}



希望是得到帮助自己写出来,谢谢各位前辈了

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top