简易计算器设计与实现

用LCD1602和矩阵键盘制作一个正整数计算器,有加减乘除和清屏功能。

1.能实现以下功能:

2.矩阵按键排列如图:

3.仿真电路图和效果展示如下:

4.源程序:

#include<reg51.h>
typedef unsigned int uint;   //¶¨ÓÚÎÞ·ûºÅint
typedef unsigned char uchar;  //¶¨ÒåÎÞ·ûºÅchar
/*****************************¶¨ÒåÒý½Å**********************************/
sbit rw=P2^5;            
sbit rs=P2^6;            
sbit e=P2^7;             
/*****************************¶¨Òå±äÁ¿**********************************/ 
uint fuhao,flag,k,i,j,num;          
long a,b,c,x;
/*****************************ÑÓʱº¯Êý**********************************/ 
void delay(unsigned int xms)//ÑÓʱxºÁÃë 
{
  unsigned int i,j;
  for(i=xms;i>0;i--)
    for(j=1;j>0;j--);
return;
}
/*****************************LCDдÃüÁ¡ª¡ª¡ªÎ»ÖÃ**********************************/ 
void lcdwrc(uint c)
{
 delay(100);
 rs=0;
 rw=0;
 e=0;
 P0=c;
 e=1;
 delay(100);
 e=0;
}
 
/*****************************LCDдÊý¾Ý¡ª¡ª¡ª¡ªÄÚÈÝ**********************************/ 
void lcdwrd(uint dat) //ÉèÖÃLCDдÊý¾Ý
{
 delay(100);
 rs=1;
 rw=0;
 e=0;
 P0=dat;
 e=1;
 delay(100);
 e=0;
 rs=0;
}
/*****************************³õʼ»¯LCD**********************************/ 
void lcdinit()   //³õʼ»¯LCD
{
 delay(150);
 lcdwrc(0x38);//дָÁî38H
 delay(50);
 lcdwrc(0x38);//ÏÔʾģʽÉèÖÃ
 delay(50);
 lcdwrc(0x38);
 delay(50);
 lcdwrc(0x38);//¹¦ÄÜÉ趨ָÁî
 lcdwrc(0x08);
 lcdwrc(0x01);//ÇåÆÁ
 lcdwrc(0x06);//ÏÔʾ¹â±êÒÆ¶¯ÉèÖÃ
 lcdwrc(0x0c); //ÏÔʾ¿ª¹Ø¿ØÖÆÖ¸Áî
 num=0;//ÓÃÓÚÅж¨°´¼üÊÇ·ñΪ¡°=¡±»òÕß¡°¹éÁ㡱ʱµÄ±äÁ¿
 fuhao=0;//ÓÃÓÚÅж¨ÊÇ·ñΪÔËËã·ûºÅ
 flag=0;//ÓÃÓÚÅж¨ÔËË㷽ʽʱµÄ±äÁ¿
 a=0;//¼ÆËãµÄµÚÒ»¸öÊý
 b=0;//¼ÆËãµÄºóÒ»¸öÊý
 c=0;//¼ÆËã½á¹û
}
/*****************************ģʽÅж¨º¯Êý**********************************/

/*****************************¼ÆËãÆ÷º¯Êý**********************************/ 
void KeyDown()//¼ÆËãÆ÷º¯Êý
{
  k=0;     
  P1=0x0f;  //0000 11111£¬Ðж¼ÎªµÍµçƽ0£¬Áж¼Îª¸ßµçƽ
  if(P1!=0x0f)//P1²»Îª0x0f£¬ÔòÅж¨ÎªÓа´¼ü±»°´Ï 
  {
    delay(100);//Ïû¶¶
    if(P1!=0x0f)//ÑÓʱºó£¬ÔÙ´ÎÅÐ¶Ï 
    {
      P1=0x0f;//0000 11111£¬Ðж¼ÎªµÍµçƽ0£¬Áж¼Îª¸ßµçƽ
      switch(P1)//
      {
      /********************µÚÒ»ÁÐÓа´¼ü°´ÏÂ*********************/ 
		  case 0x07://0000 0111 µÚÒ»ÁÐÓа´¼ü±»°´Ï  
	    {
        P1=0xf0;//Áж¼ÎªµÍµçƽ0£¬Ðж¼Îª¸ßµçƽ1 
        switch(P1)//ÅжÏÄÄÒ»Ðеİ´¼ü±»°´Ï 
        {
          case 0xd0: num =9 /*S1*/;k=7;break;    //0111 0000µÚÒ»ÁеÚsÐÐ Êý×Ö7
          case 0xb0: num = 5/*S5*/;k=4;break;    //1011 0000µÚÒ»ÁеڶþÐÐ Êý×Ö4
          case 0x70: num = 1/*S9*/;k=1;break;    //1101 0000µÚÒ»ÁеÚÈýÐÐ Êý×Ö1
          case 0xe0: num = 13/*S13*/;k=0;break;       //1110 0000µÚÒ»ÁеÚËÄÐÐ Áã
        } 
        if(fuhao==0)//fuhao==0£¬±íʾµÚÒ»¸öÊýa£¬fuhao==1£¬±íʾµÚ¶þ¸öÊýb
        a=a*10+k;
        else
        b=b*10+k; 
        lcdwrd(0x30+k);//ÏÔʾ°´ÏµÄÊý£¬0x30ΪASCIIÂëÖÐÊý×Ö×éµÄ¿ªÍ·£¬0x30±íʾ0£ºÏÔʾk£¬¼´°´ÏÂÊý×Ök 
     }	
		 while(P1!=0xf0);break;//µ±Óа´¼ü±»°´ÏÂʱ£¬½áÊø´Ë´ÎÅжϣ¬½øÐÐÏÂÒ»´ÎÅжÏ

      /********************µÚ¶þÁÐÓа´¼ü°´ÏÂ*********************/
     case 0x0b: //0000 1011 µÚ¶þÁÐÓа´¼ü±»°´Ï 
     {
       P1=0xf0;//Ðж¼Îª¸ßµçƽ1£¬Áж¼ÎªµÍµçƽ0
       switch(P1)//ÅжÏÄÄÒ»ÐÐÓа´¼ü±»°´Ï 
       {
         case 0xd0: num = 10;k=8;break;//µÚ¶þÁеÚÒ»ÐÐ Êý×Ö8
         case 0xb0:num = 6; k=5;break;//µÚ¶þÁеڶþÐÐ Êý×Ö5
         case 0x70:num = 2; k=2;break;//µÚ¶þÁеÚÈýÐÐ Êý×Ö2
         case 0xe0: num =14;break;//µÈÓÚ= 
       }  
     if(num!=14)//°´Ïµļü²»Îª¡°=¡±¼ü 
        { 
          if(fuhao==0)//fuhao==0£¬±íʾµÚÒ»¸öÊýa£¬fuhao==1£¬±íʾµÚ¶þ¸öÊýb
            a=a*10+k;
          else
            b=b*10+k; 
          lcdwrd(0x30+k);//ÏÔʾ°´ÏµÄÊý£¬0x30ΪASCIIÂëÖÐÊý×Ö×éµÄ¿ªÍ·£¬0x3k£ºÏÔʾk£¬¼´°´ÏÂÊý×Ök
        }
        
	    /************"="¼ü±»°´ÏÂ************/
		if(num==14)//°´ÏµļüΪ=¼ü 
        {
          switch(flag)//ÅжϽøÐÐÄÄÖÖÔËËã 
          {
            /*******¼Ó·¨ÔËËã*********/
			      case 1://¼Ó·¨ÔËËã
            {
              c=a+b;//¼ÆËã½á¹û 
              lcdwrc(0x4f/*µÚ¶þÐÐĩβλÖÃ*/+0x80);//¹â±êÖÃÓÚµÚ¶þÐÐĩβ 
              lcdwrc(0x04);//ÉèÖÃÏÔʾ·½Ê½£ºÏÔʾºóÖ¸Õë¼õÒ»£¬¼´Ç°ÒÆÒ»Î» 
			        if(c==0)//Èô½á¹ûΪ0 
              lcdwrd(0x30);//ÏÔʾ0 
              while(c!=0)
              {
                lcdwrd(0x30+c%10);//´ÓºóÏòǰÏÔʾ×îºóһλ 
                c=c/10;//È¥µô×îºóһλºóÔÙÑ­»·ÏÔʾ 
              }
              lcdwrd(0x3d);//ÏÔʾÍê¼ÆËã½á¹ûºó£¬ÏÔʾ¡°=¡± 
              }break;
 				 
				    /*******¼õ·¨ÔËËã*********/
            case 2://¼õ·¨ÔËËã
            {
              if(a>b)//´óÊý¼õСÊý
              c=a-b;
              else//СÊý¼õ´óÊý
              c=b-a;//¼ÆËãÁ½ÊýÏà¼õµÄ¾ø¶ÔÖµ 
              lcdwrc(0x4f+0x80);//½«¹â±êÖÃÓÚµÚ¶þÐÐĩβ 
              lcdwrc(0x04);//ÉèÖÃÏÔʾ·½Ê½£ºÏÔʾºóÖ¸Õë¼õÒ» 
              if(c==0)//Èô½á¹ûΪÁã 
              lcdwrd(0x30);//ÏÔʾ0 
              while(c!=0) 
              {
                lcdwrd(0x30+c%10);//´ÓºóÏòǰÏÔʾ×îºóһλ
                c=c/10;//È¥µô×îºóһλºóÔÙÑ­»·ÏÔʾ
              }
              if(a<b)//Èô½á¹ûΪ¸ºÊý 
              lcdwrd(0x2d);//ASCIIÖеġ°-¡±£¬ÏÔʾ¸ººÅ
              lcdwrd(0x3d);//ÏÔʾ= 
            }break;
 				 
				    /*******³Ë·¨ÔËËã*********/
            case 3://³Ë·¨ÔËËã
            {
              c=a*b; //¼ÆËã½á¹û 
              lcdwrc(0x4f+0x80);//¹â±êÖÃÓÚµÚ¶þÐÐĩβ 
              lcdwrc(0x04);//ÏÔʾÉèÖãºÏÔʾºóÖ¸Õë¼õÒ» 
              if(c==0)//Èô½á¹ûΪ0 
              lcdwrd(0x30);//ÏÔʾ0 
              while(c!=0)  
              {                           
                lcdwrd(0x30+c%10);//´ÓºóÏòǰÏÔʾ×îºóһλ
                c=c/10;//È¥µô×îºóһλºóÔÙÑ­»·ÏÔʾ 
              }
              lcdwrd(0x3d);//ÏÔʾ=  
            }break;
 
				    /*******³ý·¨ÔËËã*********/
            case 4: //³ý·¨ÔËËã 
            { 
              if(b==0)//Èô³ýÊýΪ0 
              { 
                lcdwrc(0x01);//ÇåÆÁ 
                lcdinit();//ÖØÐ³õʼ»¯LCD1602         
              }
			        else
              {  
                c=(a/b*1);//ÇóÕû
                x=c;
                lcdwrc(0x4f+0x80);//¹â±êÖÃÓÚµÚ¶þÐÐĩβ
                lcdwrc(0x04);//ÏÔʾÉèÖãºÏÔʾºóÖ¸Õë¼õÒ»
                while(c!=0)//һλһλÏÔʾ
                {
                  lcdwrd(0x30+c%10);//ÏÔʾ½á¹ûµÄ×îºóһλÔÚ0x4fµÄλÖà 
                  c=c/10;//È¡Ç°ÃæµÄ½á¹ûÊý¾Ý
								}
                //if(x<1)//Èô½á¹ûСÓÚ1£¬ÔÚ¸öλ²¹0 
                 // lcdwrd(0x30);//¸öλ²¹0
                lcdwrd(0x3d);//ÏÔʾ=
				        k=0;//½«k¶¨»Ø0ÓÃÓÚÏ´μÆËã   
              }} break;
             }}}
      while(P1!=0xf0);break;//µ±Óа´¼ü±»°´ÏÂʱ£¬½áÊø´Ë´ÎÅжϣ¬½øÐÐÏÂÒ»´ÎÅжÏ

	  /********************µÚÈýÁÐÓа´¼ü°´ÏÂ*********************/
      case 0x0d: //0000 1101 µÚÈýÁÐÓа´¼ü±»°´Ï 
      {
        P1=0xf0;//Ðж¼Îª¸ßµçƽ1£¬Áж¼ÎªµÍµçƽ0
        switch(P1)//ÅжÏÄÄÒ»ÐÐÓа´¼ü±»°´ÏÂ
        {
          case 0xd0: num=3;k=9;break;//µÚÈýÁеÚÒ»ÐÐ Êý×Ö9 
          case 0xb0: num=7;k=6;break;//µÚÈýÁеڶþÐÐ Êý×Ö6 
          case 0x70: num=11;k=3;break;//µÚÈýÁеÚÈýÐÐ Êý×Ö3
          case 0xe0: num=15;break;//µÚÈýÁеÚËÄÐÐ ¡°=¡±¼ü 
        } 
				if(num!=15)//±»°´Ïµİ´¼ü²»ÊǹéÁã¼ü 
        {
          if(fuhao==0)//fuhao==0£¬±íʾµÚÒ»¸öÊýa£¬fuhao==1£¬±íʾµÚ¶þ¸öÊýb 
          a=a*10+k;
          else
          b=b*10+k;
          }
          lcdwrd(0x30+k);//ÏÔʾ°´ÏµÄÊý£¬0x30ΪASCIIÂëÖÐÊý×Ö×éµÄ¿ªÍ·£¬0x3k£ºÏÔʾk£¬¼´°´ÏÂÊý×Ök 
		      if(num==15)//°´Ïµİ´¼üÊÇÇåÁã¼ü
          {  
            lcdwrc(0x01); //ÇåÆÁÖ¸Áî   
            lcdinit();//ÖØÐ³õʼ»¯LCD1602 
          }      
       }while(P1!=0xf0);break;//µ±Óа´¼ü±»°´ÏÂʱ£¬½áÊø´Ë´ÎÅжϣ¬½øÐÐÏÂÒ»´ÎÅÐ¶Ï 

	  /********************µÚËÄÁÐÓа´¼ü°´ÏÂ*********************/
      case 0x0e://0000 1110 µÚËÄÁÐÓа´¼ü±»°´ÏÂ
      { 
        fuhao=1;//ÓзûºÅ¼ü±»°´Ï 
        P1=0xf0;//1111 0000
        switch(P1)
        {
          case 0xe0:/*0111 0000*/flag=4;lcdwrd(0xfd);break;//¡°/¡±µÚËÄÁеÚÒ»ÐÐ 
          case 0xd0:/*1011 0000*/flag=3;lcdwrd(0x2a);break;//¡°*¡±µÚËÄÁеڶþÐÐ 
          case 0xb0:/*1101 0000*/flag=2;lcdwrd(0x2d);break;//¡°-¡±µÚËÄÁеÚÈýÐÐ 
          case 0x70:/*1110 0000*/flag=1;lcdwrd(0x2b);break;//¡°+¡±µÚËÄÁеÚËÄÐÐ 
        }}  
      while(P1!=0xf0);break;
      }}}}
/*****************************Ö÷º¯Êý**********************************/      
void main()
{ 
  lcdinit();//LCD1602³õʼ»¯ 
  lcdwrc(0x01);//LCd1602ÇåÆÁ 
  while(1)
  {  
    KeyDown();//°´¼üÅжϺ¯Êý 
  }}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值