找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1745|回复: 0
收起左侧

基于C51单片机计算器

[复制链接]
ID:893195 发表于 2021-3-17 19:36 | 显示全部楼层 |阅读模式
功能:
可以对两个整数进行加减乘除运算。

proteus图

proteus图


程序:
  1. #include<reg51.h>

  2. #define uchar unsigned char

  3. #define uint unsigned int



  4. uchar dis[]="0123456789+-*/=",K;

  5. uint AA,BB;

  6. long int CC;

  7. uchar FH=0;

  8. bit end=0;

  9. sbit EN=P1^2;

  10. sbit RS=P1^0;

  11. sbit RW=P1^1;



  12. void  delay(uchar t)

  13. {

  14.     uchar  i;

  15.     while(t--)

  16.     for(i=0;i<123;i++);

  17. }



  18. void  wcmd(uchar  cmd)

  19. {

  20.     RS=0;

  21.     RW=0;

  22.     P0=cmd;

  23.     delay(5);

  24.     EN=1;

  25.     delay(5);

  26.     EN=0;

  27.     delay(5);

  28. }



  29. void  wdat(uchar  dat)

  30. {

  31.     RS=1;

  32.     RW=0;

  33.     P0=dat;

  34.     delay(5);

  35.     EN=1;

  36.     delay(5);

  37.     EN=0;

  38.     delay(5);

  39. }



  40. void  init()

  41. {

  42.     EN=0;

  43.     wcmd(0x06);

  44.     delay(5);

  45.     wcmd(0x38);

  46.     delay(5);

  47.     wcmd(0x0e);

  48.     delay(5);

  49.     wcmd(0x01);

  50.     delay(5);

  51. }



  52. void cal() //计算

  53. {   long int temp;char a[12],i,j;

  54.     switch(FH)

  55.     {

  56.      case 1:CC=AA+BB;break;

  57.      case 2:if(AA>=BB)CC=AA-BB;else {wdat('-');CC=BB-AA;}break;

  58.      case 3:CC=AA*BB;break;

  59.      case 4:CC=AA/BB;break;

  60.     }

  61.   temp=CC;

  62.   for(j=0;temp!=0;j++)

  63.   {

  64.      a[j]=temp%10;

  65.      temp=temp/10;

  66.   }

  67.      for(i=j-1;i>=0;i--)

  68.      wdat(a[i]+'0');

  69.      AA=BB=CC=FH=0;

  70.      end=1;

  71. }

  72. uchar select()

  73. {

  74.     uchar ccode,rcode;

  75.     P3=0xf0;

  76.     if((P3&0xf0)!=0xf0)

  77.     {

  78.         delay(10);

  79.         if((P3&0xf0)!=0xf0) //去抖动误触后再次检测

  80.         {

  81.       

  82.            rcode=0xfe;     //逐行扫描,从1.0开始

  83.            while((rcode&0x10)!=0)

  84.            {

  85.                P3=rcode;

  86.                if((P3&0xf0)!=0xf0)

  87.                {

  88.                    ccode=(P3&0xf0|0x0f);  

  89.                    while((P3&0xf0)!=0xf0);//等待按键放开

  90.                    return ((~rcode)+(~ccode)); //返回键

  91.                }

  92.                else

  93.                rcode=(rcode<<1)|0x01;

  94.            }

  95.         }

  96.     }

  97.     return 0;

  98. }

  99. void  key_deal(unsigned  char  key)

  100. {

  101.     if(key!=0)

  102.     {   if(end==1)

  103.         {wcmd(0x01);end=0;}

  104.     switch(key)

  105.         {  

  106.             case  0x11:  K=7;  break;

  107.            case  0x21:  K=8;  break;

  108.            case  0x41:  K=9;  break;

  109.            case  0x81:  K=15;FH=0;AA=BB=CC=0;wcmd(0x01);break;//

  110.            case  0x12:  K=4;  break;

  111.            case  0x22:  K=5;  break;

  112.            case  0x42:  K=6;  break;

  113.            case  0x82:  K=12;FH=3;  break;// *

  114.            case  0x14:  K=1;  break;

  115.            case  0x24:  K=2;  break;

  116.            case  0x44:  K=3;  break;

  117.            case  0x84:  K=13;FH=4;  break;// /

  118.            case  0x18:  K=10;FH=1; break;// +

  119.            case  0x28:  K=0;  break;

  120.            case  0x48:  K=11;FH=2;break;// -

  121.            case  0x88:  K=14;wdat(dis[K]);cal();break;//=

  122.            default:  break;      //不是以上数据时,跳出

  123.         }

  124.         if(K<14)

  125.         {

  126.            wdat(dis[K]);

  127.         }

  128.         if(K<10)

  129.         {

  130.            if(FH==0)

  131.            {

  132.                AA=AA*10+K;

  133.            }

  134.            else

  135.            {               

  136.            BB=BB*10+K;

  137.            }

  138.         }

  139.     }

  140. }

  141. void  main()

  142. {

  143.     uchar  key;

  144.     init();

  145.     wcmd(0x80);

  146.     while(1)

  147.     {

  148.         key=select();

  149.         key_deal(key);

  150.     }

  151. }

复制代码



回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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