专注电子技术学习与研究
当前位置:单片机教程网 >> MCU设计实例 >> 浏览文章

基于单片机控制12864显示矩阵键盘输入的计算器

作者:佚名   来源:本站原创   点击数:  更新时间:2011年10月18日   【字体:
/*-----------------------------------------------------
程序设计:胥学辰-----绝对原创!
设计时间:2011-10-13辰时----2011-10-13午夜。
程序功能:
1:可以对输入的两个数字进行加减剩除运算。
2:可以连续运算。例如:12-2=10,再按减等于8,可以依次减下去。
3:运算完成后显示,再按返回键可以进入最初界面,继续运算。
程序按键:
1:进入运算界面:15.
2:确定输入:14
3:加法:13
4:减法:12
5:乘法:11
6:除法:10
7:返回:9
程序缺点:
1:由于键盘有限,没有设置更改键,必须返回重新输入!
2:暂时不能进行负数运算!

完整版本的程序下载地址:
http://www.51hei.com/f/1286411.rar  
----------------------------------------------------------*/  
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
#define ulint unsigned long int
ulint m=0,m1=0;
ulint m2;
uchar xdata flag=1,flag1=1,flag2=0,flag3=0,flag4=0,flag5=0;
uchar flag6=0,flag7=0,flag8;
uchar data Mi0,Mi,Mi1,Mi2,Mi3,Mi4,Mi5,num,temp,key1,k,j=0,j1=0;
sbit rs=P2^6;
sbit rw=P2^5;
sbit en=P2^7;
sbit psb=P2^2;
uchar dat_Shuru_1[8]={0,0,0,0,0,0,0,0};
uchar dat_Shuru_2[8]={0,0,0,0,0,0,0,0};
uchar data table_Ts_1[]="15:运算输入!14:确定输入!13:重输输入!12:返回输入!输入:结果:";
void delay(uchar z)
{
    uchar x,y;
 for(x=z;x>0;x--)
    for(y=110;y>0;y--);
}
uchar key()
{
   P3=0xfe;
   temp=P3;
   temp=temp&0xf0;
   while(temp!=0xf0)
    {
     delay(10);
     temp=P3;
     temp=temp&0xf0;
     while(temp!=0xf0)
     {
      temp=P3;
     switch(temp)
      {
       case 0xee:num=0;Mi=1;
        break;
       case 0xde:num=1;Mi=1;
        break;
       case 0xbe:num=2;Mi=1;
        break;
       case 0x7e:num=3;Mi=1;
        break;
      }
      
     while(temp!=0xf0)
      {
       temp=P3;
       temp=temp&0xf0;
      // k=0;
      }
     }
    }

   P3=0xfd;
   temp=P3;
   temp=temp&0xf0;
   while(temp!=0xf0)
    {
     delay(10);
     temp=P3;
     temp=temp&0xf0;
     while(temp!=0xf0)
     {
      temp=P3;
     switch(temp)
      {
       case 0xed:num=4;Mi=1;
        break;
       case 0xdd:num=5;Mi=1;
        break;
       case 0xbd:num=6;Mi=1;
        break;
       case 0x7d:num=7;Mi=1;
        break;
      }
     
     while(temp!=0xf0)
      {
       temp=P3;
       temp=temp&0xf0;
      
      }
     }
    }


   P3=0xfb;
   temp=P3;
   temp=temp&0xf0;
   while(temp!=0xf0)
    {
     delay(10);
     temp=P3;
     temp=temp&0xf0;
     while(temp!=0xf0)
     {
      temp=P3;
     switch(temp)
      {
       case 0xeb:num=8;Mi=1;
        break;
       case 0xdb:num=9;Mi1=1;Mi0=1;
        break;
       case 0xbb:num=10;Mi1=1;Mi2=1;
        break;
       case 0x7b:num=11;Mi1=1;Mi3=1;
        break;
      }
     // k=1;
     while(temp!=0xf0)
      {
       temp=P3;
       temp=temp&0xf0;
      
      }
     }
    }


   P3=0xf7;
   temp=P3;
   temp=temp&0xf0;
   while(temp!=0xf0)
    {
     delay(10);
     temp=P3;
     temp=temp&0xf0;
     while(temp!=0xf0)
     {
      temp=P3;
     switch(temp)
      {
       case 0xe7:num=12;Mi1=1;Mi4=1;
        break;
       case 0xd7:num=13;Mi1=1;Mi5=1;
        break;
       case 0xb7:num=14;Mi1=1;
        break;
       case 0x77:num=15;Mi1=1;
        break;
      }
     // k=1;
     while(temp!=0xf0)
      {
       temp=P3;
       temp=temp&0xf0;
      
      }
     }
    }
return num;

}
void write_com(uchar com)
{
   rs=0;
   rw=0;
   P0=com;
   delay(5);
   en=1;
   delay(5);
   en=0;
}
void write_data(uchar dat)
{
   rs=1;
   rw=0;
   P0=dat;
   delay(5);
   en=1;
   delay(5);
   en=0;
}
void write_Yunsuan(uchar add,ulint Jg)
{
   uchar xdata gw,sw,bw,qw,ww,ws,wb,wq;
   {
   gw=Jg%10;
   sw=Jg/10%10;
   bw=Jg/100%10;
   qw=Jg/1000%10;
   ww=Jg/10000%10;
   ws=Jg/100000%10;
   wb=Jg/1000000%10;
   wq=Jg/10000000%10;
   write_com(0x88+add);
   if(wq!=0)
   {
   write_data(0x30+wq);
   }
   if(wq!=0||wb!=0)
   {
   write_data(0x30+wb);
   }
   if(wq!=0||wb!=0||ws!=0)
   {
   write_data(0x30+ws);
   }
   if(wq!=0||wb!=0||ws!=0||ww!=0)
   {
   write_data(0x30+ww);
   }
   if(wq!=0||wb!=0||ws!=0||ww!=0||qw!=0)
   {
   write_data(0x30+qw);
   }
   if(wq!=0||wb!=0||ws!=0||ww!=0||qw!=0||bw!=0)
   {
   write_data(0x30+bw);
   }
   if(wq!=0||wb!=0||ws!=0||ww!=0||qw!=0||bw!=0||sw!=0)
   {
   write_data(0x30+sw);
   } 
   write_data(0x30+gw);
}
}
void Tishi_Huanying(uchar add,uchar i1,uchar i2)
{
    uchar i;
 write_com(add);
 for(i=i1;i<i2;i++)
   {
   write_data(table_Ts_1[i]);
    }
}
void write_Xianshi_Shuru_1(uchar add)
{
    uchar i;
 write_com(0x80+add);
 for(i=0;i<j;i++)
   {
     write_data(0x30+dat_Shuru_1[i]);
   }
}
void write_Xianshi_Shuru_2(uchar add)
{
    uchar i;
 write_com(0x90+add);
 for(i=0;i<j1;i++)
   {
     write_data(0x30+dat_Shuru_2[i]);
   }
}
void enter_Shuru_1()
{
   //key1=key();
   if(key1<9&&Mi==1)
 {
  dat_Shuru_1[j]=key1;
  j++;
     Mi=0;
  m=m*10+dat_Shuru_1[j-1];          
 }
 write_Xianshi_Shuru_1(0x03);
}
void enter_Shuru_2()
{
   //key1=key();
   if(key1<9&&Mi==1)
 {
  dat_Shuru_2[j1]=key1;
  j1++;
     Mi=0;
  m1=m1*10+dat_Shuru_2[j1-1];          
 }
 write_Xianshi_Shuru_2(0x03);
}
void Xianshi_Jiafa()
{
 if(flag3==1&&Mi5==1)
  {
    write_com(0x01);
    Tishi_Huanying(0x80,52,58);
    enter_Shuru_1();
    Tishi_Huanying(0x90,52,58);
    Tishi_Huanying(0x88,58,64);
    m2=m+m1;
    Mi5=0;
    m=m2;
  }
 write_Yunsuan(0x03,m2);
}
void Xianshi_Qianfa()
{
 if(flag4==1&&Mi4==1)
  {   
    write_com(0x01);
    Tishi_Huanying(0x80,52,58);
    enter_Shuru_1();
    Tishi_Huanying(0x90,52,58);
    Tishi_Huanying(0x88,58,64);
    m2=m-m1;
       Mi4=0;
       m=m2;
  }
 write_Yunsuan(0x03,m2);
}
void Xianshi_Shengfa()
{
 if(flag5==1&&Mi3==1)
  {
    write_com(0x01);
    Tishi_Huanying(0x80,52,58);
    enter_Shuru_1();
    Tishi_Huanying(0x90,52,58);
    Tishi_Huanying(0x88,58,64);
    m2=m*m1;
    Mi3=0;
    m=m2;
  }
 write_Yunsuan(0x03,m2);
}
void Xianshi_Chufa()
{
 if(flag6==1&&Mi2==1)
  {
    write_com(0x01);
    enter_Shuru_1();
    Tishi_Huanying(0x80,52,58);
    Tishi_Huanying(0x90,52,58);
    Tishi_Huanying(0x88,58,64);
    m2=m/m1;
    Mi2=0;
    m=m2;
  }
 write_Yunsuan(0x03,m2);
}
void init()
{
   psb=1;
   write_com(0x30);
   write_com(0x0e);
   write_com(0x01);
   write_com(0x80);
}
void Huanyingjiemian()
{
    Tishi_Huanying(0x80,0,13);
 Tishi_Huanying(0x90,13,26);
 Tishi_Huanying(0x88,26,39);
 Tishi_Huanying(0x98,39,52);
}
void Anjian()
{
   key1=key();
   if(key1==15&&Mi1==1)
     {
    flag1=0;
    Mi1=0;
   }
   if(flag1==0)
     {
       if(key1==14&&Mi1==1)
      {
     flag2=1;
     //flag3=1;
     Mi1=0;
    }
       if(key1==13&&Mi1==1)
      {
     flag3=1;
     Mi1=0;
    }
    if(key1==12&&Mi1==1)
      {
     flag4=1;
     Mi1=0;
    }
    if(key1==11&&Mi1==1)
      {
     flag5=1;
     Mi1=0;
    }
  if(key1==10&&Mi1==1)
      {
     flag6=1;
     Mi1=0;
    }
    if(key1==9&&Mi1==1)
      {
     flag8=1;
     Mi1=0;
    }
 }
}
void main()
{
   init();
   while(1)
     {
     Anjian();
  if(flag8==1&&Mi0==1)
    {
      write_com(0x01);
   flag8=0; 
   m=0;
   Mi0=0;
   m1=0;
   m2=0;
   j=0;
   j1=0;
   flag=1;
   flag1=1;
   flag2=0;
   flag3=0;
   flag4=0;
   flag5=0;
   flag6=0;
   flag7=0;
   //flag8=0;
     }
  if(flag==1&&flag1==1)
    {
      Huanyingjiemian();
   }
  if(flag==1&&flag1==0)
    {
   write_com(0x01);
      flag=0;
      }
  if(flag==0&&flag1==0)
     { 
    if(flag7==0)
      {
        Tishi_Huanying(0x80,52,58);   
           enter_Shuru_1();
     }
    if(flag7==1)
      { 
     Tishi_Huanying(0x90,52,58);
           enter_Shuru_2();
     if(flag3==1)
      {
         Xianshi_Jiafa();
       }
      if(flag4==1)
      {
         Xianshi_Qianfa();
       }
      if(flag5==1)
      {
         Xianshi_Shengfa();
       }
      if(flag6==1)
      {
         Xianshi_Chufa();
       }
     }
         }
  if(flag2==1)
     {
       flag2=0;
    flag7=1;   
    //flag4=1;
      }
  

   }          
}
关闭窗口

相关文章