找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 9567|回复: 14
收起左侧

计算器的51单片机程序和电路图,完善好的、LCD1602显示屏

  [复制链接]
ID:108701 发表于 2016-6-8 22:23 | 显示全部楼层 |阅读模式
这个是计算器的程序,完善好的、、LCD1602显示屏、、、大家多多指教、、谢谢、

下面是计算器的仿真电路图:

仿真图

仿真图


计算器程序:
  1. #include <reg52.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. sbit rs=P2^2;
  5. sbit rw=P2^1;
  6. sbit e=P2^0;
  7. void write_dat(uchar dat);
  8. void write_com(uchar com);
  9. void process(void);
  10. void keyscan();

  11. /*按键功能*/
  12. uchar code table1[]=
  13. {
  14. 1,2,3,0x2b-0x30,                       // 1,   2,   3,    +
  15. 4,5,6,0x2d-0x30,                                   // 4,   5,   6,    -
  16. 7,8,9,0x2a-0x30,                                   // 7,   8,   9,    x
  17. 0,0x3d-0x30,0x01-0x30,0x2f-0x30           // 0,   =,   清零, /
  18. };

  19. uchar k=0,flag=0,num,fuhao[6],i,temp1=0,flag1=0;

  20. long a,b,c,d;


  21. void delay(uint z)
  22. {
  23.     uint x,y;
  24.     for(x=z;x>0;x--)
  25.         for(y=110;y>0;y--);
  26. }
  27. /********按键处理***********/
  28. void keyscan()
  29. {
  30.     uchar temp;
  31.     P3=0xfe;
  32.     temp=P3;
  33.     temp=temp&0xf0;
  34.     while(temp!=0xf0)
  35.     {
  36.        delay(5);
  37.        temp=P3;
  38.        temp=temp&0xf0;
  39.        while(temp!=0xf0)
  40.        {
  41.            temp=P3;
  42.            switch(temp)
  43.            {
  44.               case 0xee:num=0;
  45.                 break;                        
  46.               case 0xde:num=1;
  47.                     break;
  48.               case 0xbe:num=2;
  49.                     break;
  50.               case 0x7e:num=3;
  51.                     break;
  52.             }                        
  53.              while(temp!=0xf0)                 // 松手检测
  54.                 { temp=P3;
  55.                   temp=temp&0xf0;
  56.                          }
  57.            }
  58.        if(num==0||num==1||num==2)
  59.        {
  60.             
  61.             if(flag==0)
  62.                a=a*10+table1[num]; //如果没有按符号键,符号前的数值为a
  63.             else if(flag==1)
  64.                b=b*10+table1[num];  //如果按了符号键,符号后的数值为b
  65.                  
  66.                         else if(temp1>=2&&flag1==1)
  67.                    {
  68.                      flag=1;
  69.                          flag1=0;         
  70.                      process();         
  71.                           
  72.                      a=c;
  73.                          b=table1[num];
  74.                            }
  75.                                                                                              
  76.             if(k==1)  
  77.                        {
  78.                     k=0;
  79.                 write_com(0x01);
  80.                        }
  81.             }        
  82.         else if(num==3)   
  83.                 {
  84.              flag++;
  85.                          flag1=1;
  86.                          temp1++;
  87.                    fuhao[temp1-1]=1;         
  88.                   
  89.             }        
  90.                                                                            
  91.       i=table1[num];    //显示按下的键
  92.       write_dat(0x30+i);
  93.    
  94.    }
  95.     P3=0xfd;
  96.     temp=P3;
  97.     temp=temp&0xf0;
  98.     while(temp!=0xf0)
  99.     {
  100.        delay(5);
  101.        temp=P3;
  102.        temp=temp&0xf0;
  103.        while(temp!=0xf0)
  104.        {
  105.            temp=P3;
  106.            switch(temp)
  107.            {
  108.               case 0xed:num=4;
  109.                 break;                        
  110.               case 0xdd:num=5;
  111.                     break;
  112.               case 0xbd:num=6;
  113.                     break;
  114.               case 0x7d:num=7;
  115.                     break;
  116.             }                        
  117.              while(temp!=0xf0)
  118.                 { temp=P3;
  119.                  temp=temp&0xf0;
  120.                          }
  121.            }
  122.          if(num==4||num==5||num==6)
  123.              {
  124.                  if(k==1)
  125.                            {
  126.                         k=0;
  127.                     write_com(0x01);
  128.                            }
  129.              if(flag==0)
  130.                 a=a*10+table1[num];
  131.              else if(flag==1)
  132.                 b=b*10+table1[num];
  133.                          else if(temp1>=2&&flag1==1)
  134.                            {
  135.                              flag=1;
  136.                                  flag1=0;
  137.                              process();
  138.                                  
  139.                                     a=c;
  140.                                  b=table1[num];
  141.                                    }                                                                                    
  142.              }
  143.          else if(num==7)
  144.              {
  145.              flag++;
  146.                          temp1++;
  147.                          flag1=1;
  148.                          fuhao[temp1-1]=2;
  149.                
  150.                               
  151.              }
  152.          i=table1[num];   
  153.          write_dat(0x30+i);           

  154.        }
  155.     P3=0xfb;
  156.     temp=P3;
  157.     temp=temp&0xf0;
  158.     while(temp!=0xf0)
  159.     {
  160.        delay(5);
  161.        temp=P3;
  162.        temp=temp&0xf0;
  163.        while(temp!=0xf0)
  164.        {
  165.            temp=P3;
  166.            switch(temp)               
  167.            {
  168.               case 0xeb:num=8;
  169.                 break;                        
  170.               case 0xdb:num=9;         
  171.                     break;
  172.               case 0xbb:num=10;
  173.                     break;
  174.               case 0x7b:num=11;
  175.                 break;                           
  176.             }                        
  177.              while(temp!=0xf0)
  178.                 { temp=P3;
  179.                  temp=temp&0xf0;
  180.                          }
  181.            }
  182.            if(num==8||num==9||num==10)  
  183.            {
  184.                if(k==1)
  185.                            {
  186.                         k=0;
  187.                     write_com(0x01);
  188.                            }
  189.                if(flag==0)
  190.                   a=a*10+table1[num];
  191.                else if(flag==1)
  192.                   b=b*10+table1[num];
  193.                            else if(temp1>=2&&flag1==1)
  194.                            {
  195.                              flag=1;
  196.                                  flag1=0;
  197.                              process();
  198.                                  
  199.                                     a=c;
  200.                                  b=table1[num];
  201.                                    }                                          
  202.            
  203.            }
  204.            else if(num==11)   
  205.            {
  206.                 flag++;
  207.                     temp1++;
  208.                                 flag1=1;
  209.                                 fuhao[temp1-1]=3;
  210.                         
  211.                                    
  212.                 }                                                            
  213.            i=table1[num];
  214.            write_dat(0x30+i);
  215.       
  216.        }
  217.        P3=0xf7;
  218.     temp=P3;
  219.     temp=temp&0xf0;
  220.     while(temp!=0xf0)
  221.     {
  222.        delay(5);
  223.        temp=P3;
  224.        temp=temp&0xf0;
  225.        while(temp!=0xf0)
  226.        {
  227.            temp=P3;
  228.            switch(temp)
  229.            {
  230.               case 0xe7:num=12;    // 0键
  231.                 break;                        
  232.               case 0xd7:num=13;     // '='
  233.                     break;
  234.               case 0xb7:num=14;         //清零键
  235.                     break;
  236.               case 0x77:num=15;                //除号键
  237.                 break;                           
  238.             }                        
  239.              while(temp!=0xf0)
  240.                 { temp=P3;
  241.                  temp=temp&0xf0;
  242.                       }                                
  243.            }
  244.           switch(num)
  245.           {
  246.              case 12:
  247.                     {
  248.                   if(k==1)
  249.                            {
  250.                         k=0;
  251.                     write_com(0x01);
  252.                            }
  253.                  if(flag==0)
  254.                    a=a*10;
  255.                  else if(flag==1)
  256.                    b=b*10;
  257.                                  else if(temp1>=2&&flag1==1)
  258.                            {
  259.                              flag=1;
  260.                                  flag1=0;
  261.                              process();
  262.                                  
  263.                                     a=c;
  264.                                  b=table1[num];
  265.                                    }                                          

  266.                    write_dat(0x30);
  267.                            }
  268.                    break;
  269.              case 13:     
  270.                   {
  271.                   k=1;
  272.                                   if(temp1>=2)
  273.                                      fuhao[0]=fuhao[temp1-1];
  274.                  if(fuhao[0]==1)   
  275.                          {
  276.                         
  277.                      write_com(0x80+0x4f);
  278.                      write_com(0x04);
  279.                              c=a+b;
  280.                                          d=c;
  281.                      while(c!=0)                                       
  282.                                  {
  283.                         write_dat(0x30+c%10);
  284.                                 c=c/10;                                                                        
  285.                                  }
  286.                     write_dat(0x3d);
  287.                          fuhao[0]=0;fuhao[1]=0;fuhao[2]=0;
  288.                                         fuhao[3]=0;fuhao[4]=0;fuhao[5]=0;
  289.                     a=0;b=0;flag=0;flag1=0;temp1=0;           
  290.                          }
  291.                  if(fuhao[0]==2)
  292.                          {
  293.                     write_com(0x80+0x4f);
  294.                     write_com(0x04);
  295.                          if(a>=b)
  296.                                 {
  297.                           c=a-b;
  298.                                           d=c;
  299.                       while(c!=0)
  300.                                   {
  301.                          write_dat(0x30+c%10);
  302.                                  c=c/10;
  303.                       }                                                                                    
  304.                                  
  305.                                 }
  306.                     else if(a<b)
  307.                                 {
  308.                            c=b-a;
  309.                                            d=c;
  310.                        while(c!=0)
  311.                                {
  312.                            write_dat(0x30+c%10);
  313.                                    c=c/10;
  314.                                }
  315.                       write_dat(0x2d);
  316.                                 }
  317.                         
  318.                     write_dat(0x3d);
  319.                     fuhao[0]=0;fuhao[1]=0;fuhao[2]=0;
  320.                                         fuhao[3]=0;fuhao[4]=0;fuhao[5]=0;
  321.                     a=0;b=0;flag=0;flag1=0;temp1=0;
  322.                         
  323.                          }
  324.                  if(fuhao[0]==3)  
  325.                          {
  326.                     write_com(0x80+0x4f);
  327.                     write_com(0x04);
  328.                     c=a*b;
  329.                                         d=c;
  330.                         while(c!=0)
  331.                                 {
  332.                        write_dat(0x30+c%10);
  333.                            c=c/10;
  334.                                 }
  335.                     write_dat(0x3d);                                                                                
  336.                     fuhao[0]=0;fuhao[1]=0;fuhao[2]=0;
  337.                                         fuhao[3]=0;fuhao[4]=0;fuhao[5]=0;
  338.                     a=0;b=0;flag=0;flag1=0;temp1=0;
  339.                         
  340.                          }
  341.                  if(fuhao[0]==4)      
  342.                          {         
  343.                      i=0;
  344.                      write_com(0x80+0x4f);
  345.                      write_com(0x04);
  346.                     c=(long)(((float)a/b)*1000000);
  347.                         d=c;
  348.                                         while(c!=0)
  349.                                 {
  350.                        write_dat(0x30+c%10);
  351.                            c=c/10;
  352.                                i++;

  353.                            if(i==6)
  354.                                             write_dat(0x2e);                                       
  355.                                 }
  356.                         if(a/b<=0)
  357.                      write_dat(0x30);
  358.                      write_dat(0x3d);
  359.                      fuhao[0]=0;fuhao[1]=0;fuhao[2]=0;
  360.                                         fuhao[3]=0;fuhao[4]=0;fuhao[5]=0;
  361.                     a=0;b=0;flag=0;flag1=0;temp1=0;
  362.                          }
  363.                          }
  364.               break;
  365.            
  366.                     case 14:
  367.                 { write_com(0x01);
  368.                  a=0;b=0;flag=0;temp1=0;flag1=0;
  369.                                  fuhao[0]=0;fuhao[1]=0;fuhao[2]=0;
  370.                                  fuhao[3]=0;fuhao[4]=0;fuhao[5]=0;
  371.                            }
  372.                  break;

  373.              case 15:
  374.                   {
  375.                     flag++;
  376.                         temp1++;
  377.                                         flag1=1;
  378.                                     fuhao[temp1-1]=4;        
  379.                                          write_dat(0x30+table1[num]);                    
  380.                    }
  381.                    break;            
  382.           }                     
  383.        }               
  384. }
  385. /*******led1602显示*******/
  386. void write_com(uchar com)
  387. {
  388.    rs=0;
  389.    rw=0;
  390.    P0=com;
  391.    e=1;
  392.    delay(5);
  393.    e=0;
  394. }
  395. void write_dat(uchar dat)
  396. {
  397.    rs=1;
  398.    rw=0;
  399.    P0=dat;
  400.    e=1;
  401.    delay(5);
  402.    e=0;
  403. }

  404. void process(void)
  405. {
  406.    
  407.          if(fuhao[temp1-2]==1)    //如果符号键是+,执行加法运算
  408.                  {
  409.                    c=a+b;
  410.                    b=0;
  411.                   }                                            // 如果符号键是-,执行减法运算
  412.          if(fuhao[temp1-2]==2)
  413.                   {
  414.                     c=a-b;
  415.                         b=0;  
  416.                  }                                                                                                            
  417.           if(fuhao[temp1-2]==3)   //如果符号键是*执行乘法运算
  418.                   {        
  419.                     c=a*b;
  420.                         b=0;  
  421.                   }
  422.           if(fuhao[temp1-2]==4)      //如果符号键是/ 执行除法运算               
  423.                   {
  424.                     c=(long)((float)a/b);                    
  425.             b=0;                                                                                                                                                                                                      
  426.            }                                    
  427. }

  428. /*液晶的初始化*/
  429. void init()  //初始化
  430. {
  431.    delay(15);
  432.    write_com(0x38);
  433.    delay(6);
  434.    write_com(0x38);
  435.    delay(6);
  436.    write_com(0x38);
  437.    write_com(0x38);
  438.    write_com(0x0c);  //开显示,关光标
  439.    write_com(0x06);  //光标移动
  440.    write_com(0x01);  //清屏  
  441. }
  442.                                    
  443. void main()
  444. {        
  445.     init();
  446.     while(1)
  447.     {     
  448.       keyscan();            
  449.     }
  450. }
复制代码
QQ图片20160608222816.png

评分

参与人数 2黑币 +55 收起 理由
l1050742394 + 5 共享资料的黑币奖励!
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:108701 发表于 2016-6-8 22:23 | 显示全部楼层
很好的、、
回复

使用道具 举报

ID:108701 发表于 2016-6-8 22:29 | 显示全部楼层
第一次,有些不会,多多包涵、、回复中有仿真图、、、谢谢了
QQ图片20160608222816.png
回复

使用道具 举报

ID:126485 发表于 2016-6-13 23:15 | 显示全部楼层
感谢楼主分享谢谢
回复

使用道具 举报

ID:108701 发表于 2016-6-22 21:55 | 显示全部楼层
tgyh 发表于 2016-6-13 23:15
感谢楼主分享谢谢

不客气
回复

使用道具 举报

ID:156133 发表于 2016-12-20 09:13 | 显示全部楼层
楼主,为啥KEIL显示目标木有生成
回复

使用道具 举报

ID:157238 发表于 2017-2-26 21:48 | 显示全部楼层
shenqiang 发表于 2016-12-20 09:13
楼主,为啥KEIL显示目标木有生成

将程序随意找个符号什么的删去再添上再执行程序生成hex文件就行了
回复

使用道具 举报

ID:303506 发表于 2018-4-9 15:43 | 显示全部楼层
le51 发表于 2017-2-26 21:48
将程序随意找个符号什么的删去再添上再执行程序生成hex文件就行了

还是生成不了怎么办
回复

使用道具 举报

ID:305259 发表于 2018-4-10 16:38 来自手机 | 显示全部楼层
楼主威武霸气谢谢
回复

使用道具 举报

ID:325062 发表于 2018-5-9 11:26 | 显示全部楼层
楼主有没有元器件清单
回复

使用道具 举报

ID:325062 发表于 2018-5-12 09:25 | 显示全部楼层
程序确定是正确的吗?
回复

使用道具 举报

ID:187483 发表于 2018-5-12 13:44 | 显示全部楼层
谢谢分享
回复

使用道具 举报

ID:354888 发表于 2018-6-20 12:37 | 显示全部楼层
谢谢分享
回复

使用道具 举报

ID:388379 发表于 2018-8-22 14:10 | 显示全部楼层
看不懂
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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