找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1106|回复: 2
打印 上一主题 下一主题
收起左侧

单片机计算器代码Proteus仿真 可实现加减乘除运算 lcd1602显示

[复制链接]
跳转到指定楼层
楼主


单片机源程序如下:
  1. /****************************************
  2.         计算器五位数以内+,-,*,/                  
  3.         c:删除一个数或一个运算符
  4.         lcd1602显示


  5. *****************************************/
  6. #include<reg52.h>
  7. #define uchar unsigned char
  8. #define uint unsigned int
  9. sbit rs=P2^0;//指令0,数据1
  10. sbit rw=P2^1;//读0,写1,引脚
  11. sbit lcden=P2^2;//使能端
  12. uchar temp,num,flag,i,j,k,n,m,aa[10]={0},bb[11]={0};
  13. uint sum[20]={0},count;
  14. /**********************************************
  15.     延时函数  ms
  16. *********************************************/        
  17. void delayms(uint t)
  18. {
  19.     uint x,y;
  20.         for(x=t;x>0;x--)
  21.         for(y=110;y>0;y--);
  22. }
  23. /**********************************************
  24.     1602指令,数据,初始化
  25. *********************************************/
  26. void write_1602com(uchar com)
  27. {
  28.     P0=com;
  29.         rs=0;//指令
  30.         rw=0;//写
  31.         lcden=0;
  32.         delayms(20);
  33.         lcden=1;
  34.         delayms(20);
  35.         lcden=0;
  36. }
  37. void write_1602date(uchar date)
  38. {
  39.     P0=date;
  40.         rs=1;//数据
  41.         rw=0;//写
  42.         lcden=0;
  43.         delayms(20);
  44.         lcden=1;
  45.         delayms(20);
  46.         lcden=0;
  47. }
  48. void init_lcd1602()
  49. {
  50.         write_1602com(0x38);//选择16x2显示,5x7点阵
  51.         delayms(20);
  52.         write_1602com(0x0f);//开显示,开光标,光标闪烁
  53.         delayms(20);
  54.         write_1602com(0x06);//读或写后,指针加一,光标加一
  55.         delayms(20);
  56.         write_1602com(0x01);//清屏
  57.         delayms(20);
  58. }
  59. /*****************************************
  60.         检测按键并输出
  61. ******************************************/
  62. uchar keyscan()                           
  63. {
  64.         P3=0xfe;
  65.         temp=P3;
  66.         while(temp!=0xfe)
  67.         {
  68.                 delayms(5);
  69.                 temp=P3;
  70.                 while(temp!=0xfe)
  71.                 {
  72.                         switch(temp)
  73.                         {
  74.                                 case 0xee:num=7;
  75.                                         break;
  76.                                 case 0xde:num=8;
  77.                                         break;
  78.                                 case 0xbe:num=9;
  79.                                         break;
  80.                                 case 0x7e:num='/';
  81.                                         break;
  82.                         }
  83.                         while(temp!=0xfe)
  84.                         {
  85.                                 flag=1;
  86.                                 temp=P3;
  87.                         }
  88.                 }
  89.         }
  90.         P3=0xfd;
  91.         temp=P3;
  92.         while(temp!=0xfd)
  93.         {
  94.                 delayms(5);
  95.                 temp=P3;
  96.                 while(temp!=0xfd)
  97.                 {
  98.                         switch(temp)
  99.                         {
  100.                                 case 0xed:num=4;
  101.                                         break;
  102.                                 case 0xdd:num=5;
  103.                                         break;
  104.                                 case 0xbd:num=6;
  105.                                         break;
  106.                                 case 0x7d:num='*';
  107.                                         break;
  108.                         }
  109.                         while(temp!=0xfd)
  110.                         {
  111.                                 flag=1;
  112.                                 temp=P3;
  113.                         }
  114.                 }
  115.         }
  116.         
  117.         P3=0xfb;
  118.         temp=P3;
  119.         while(temp!=0xfb)
  120.         {
  121.                 delayms(5);
  122.                 temp=P3;
  123.                 while(temp!=0xfb)
  124.                 {
  125.                         switch(temp)
  126.                         {
  127.                                 case 0xeb:num=1;
  128.                                         break;
  129.                                 case 0xdb:num=2;
  130.                                         break;
  131.                                 case 0xbb:num=3;
  132.                                         break;
  133.                                 case 0x7b:num='-';
  134.                                         break;
  135.                         }
  136.                         while(temp!=0xfb)
  137.                         {
  138.                                 flag=1;
  139.                                 temp=P3;
  140.                         }
  141.                 }
  142.         }
  143.         P3=0xf7;
  144.         temp=P3;
  145.         while(temp!=0xf7)
  146.         {
  147.                 delayms(5);
  148.                 temp=P3;
  149.                 while(temp!=0xf7)
  150.                 {
  151.                         switch(temp)
  152.                         {
  153.                                 case 0xe7:num='c';
  154.                                         break;
  155.                                 case 0xd7:num=0;
  156.                                         break;
  157.                                 case 0xb7:num='=';
  158.                                         break;
  159.                                 case 0x77:num='+';
  160.                                         break;
  161.                         }
  162.                         while(temp!=0xf7)
  163.                         {
  164.                                 flag=1;
  165.                                 temp=P3;
  166.                         }
  167.                 }
  168.         }
  169.         return num;
  170. }
  171. /*********************************************
  172.         将逐个输入数 aa[] 转化为整数
  173. *********************************************/
  174. void zuan_shu()                                   
  175. {
  176.          switch(n)
  177.         {
  178.                 case 0:sum[j++]=0;break;
  179.                 case 1:sum[j++]=aa[0];break;
  180.                 case 2:sum[j++]=aa[0]*10+aa[1];break;
  181.                 case 3:sum[j++]=aa[0]*100+aa[1]*10+aa[2];break;
  182.                 case 4:sum[j++]=aa[0]*1000+aa[1]*100+aa[2]*10+aa[3];break;
  183. /*                case 5:sum[j++]=aa[0]*10000+aa[1]*1000+aa[2]*100+aa[3]*10+aa[4];break;
  184.                 case 6:sum[j++]=aa[0]*100000+aa[1]*10000+aa[2]*1000+aa[3]*100+aa[4]*10+aa[5];break;
  185.                 case 7:sum[j++]=aa[0]*1000000+aa[1]*100000+aa[2]*10000+aa[3]*1000+aa[4]*100+aa[5]*10+aa[6];break;
  186.                 case 8:sum[j++]=aa[0]*10000000+aa[1]*1000000+aa[2]*100000+aa[3]*10000+aa[4]*1000+aa[5]*100+aa[6]*10+aa[7];break;
  187. */               
  188.         }                                
  189. }
  190. /****************************************************
  191.         液晶显示函数
  192. ******************************************************/
  193. void lcd1602_display(uint count)                                   
  194. {
  195.          uchar a,b,c,d,e;  //f,g,h;
  196.         a=count%10;
  197.         b=count/10%10;
  198.         c=count/100%10;
  199.         d=count/1000%10;
  200.         e=count/10000%10;
  201. /*        f=count/100000%10;
  202.         g=count/1000000%10;
  203.         h=count/10000000%10;

  204.         write_date(0x30+h);
  205.         write_date(0x30+g);
  206.         write_date(0x30+f);
  207. */
  208.         if(e!=0)
  209.         write_1602date(0x30+e);
  210.         if((e==0&&d!=0)||e!=0)
  211.         write_1602date(0x30+d);
  212.         if((e==0&&d==0&&c!=0)||e!=0||d!=0)
  213.         write_1602date(0x30+c);
  214.         if((e==0&&d==0&&c==0&&b!=0)||e!=0||d!=0||c!=0)
  215.         write_1602date(0x30+b);
  216.         write_1602date(0x30+a);        
  217. }
  218. /*************************************************
  219.         运算结果函数并保存至   sum[k]
  220. **************************************************/
  221. void yunsuan()                                                   
  222. {
  223.          uchar m;
  224.         for(k=0;bb[k]!=0&&k<10;k++)                                  //先找出高级运算符运算
  225.         {
  226.                 if(bb[k]=='*')
  227.                 {
  228.                         sum[k+1]=sum[k]*sum[k+1];
  229.                         sum[k]='N';
  230.                 }
  231.                 if(bb[k]=='/')
  232.                 {
  233.                         sum[k+1]=sum[k]/sum[k+1];
  234.                         sum[k]='N';
  235.                 }
  236.         }
  237.         for(k=0;bb[k]!=0&&k<10;k++)
  238.         {
  239.                  if(bb[k]=='+')
  240.                 {
  241.                         for(m=1;sum[k+m]=='N';)
  242.                         {
  243.                                  m++;        
  244.                         }
  245.                         sum[k+m]=sum[k]+sum[k+m];
  246.                 }
  247.                 if(bb[k]=='-')
  248.                 {
  249.                         for(m=1;sum[k+m]=='N';)
  250.                         {
  251.                                  m++;        
  252.                         }
  253.                         sum[k+m]=sum[k]-sum[k+m];
  254.                 }
  255.         }
  256. }
  257. /*************************************************  
  258.         main函数
  259. ***************************************************/
  260. void main()
  261. {
  262.     init_lcd1602();
  263.         while(1)
  264.         {         
  265.             flag=0;
  266.                  keyscan();
  267.                 if(flag!=0)
  268.                 {
  269.                         if(num>=0&&num<=9)
  270.                         {
  271.                                  aa[i++]=num;
  272.                                 write_1602date(0x30+num);
  273.                                 n++;
  274.                         }
  275.                         if(num=='+')
  276.                         {
  277.                                 write_1602date(0x20+11);//1602   '+'符
  278.                                 bb[k++]=num;
  279.                                 zuan_shu();
  280.                                 for(i=0;i<n;i++)
  281.                                 aa[i]=0;
  282.                                 i=0;
  283.                                 n=0;
  284.                         }
  285.                         if(num=='-')
  286.                         {
  287.                                 write_1602date(0x20+13);//1602   '-'符
  288.                                 bb[k++]=num;
  289.                                 zuan_shu();
  290.                                 for(i=0;i<n;i++)
  291.                                 aa[i]=0;
  292.                                 i=0;
  293.                                 n=0;
  294.                         }
  295.                         if(num=='*')
  296.                         {
  297.                                 write_1602date(0x20+10);//1602   '*'符
  298.                                 bb[k++]=num;
  299.                                 zuan_shu();
  300.                                 for(i=0;i<n;i++)
  301.                                 aa[i]=0;
  302.                                 i=0;
  303.                                 n=0;
  304.                         }
  305.                         if(num=='/')
  306.                         {
  307.                                 write_1602date(0xf0+13);//1602   '/'符
  308.                                 bb[k++]=num;
  309.                                 zuan_shu();
  310.                                 for(i=0;i<n;i++)
  311.                                 aa[i]=0;
  312.                                 i=0;
  313.                                 n=0;
  314.                         }
  315.                         if(num=='c'&&m==0)                                 //删除一个数或一个运算符
  316.                         {
  317.                                 write_1602com(0x04);//读或写后,指针减一,光标减一
  318.                                 write_1602date(' ');//1602   空符                        
  319.                                 write_1602com(0x06);//读或写后,指针加一,光标加一
  320.                                 if(n!=0)
  321.                                 {
  322.                                          n--;
  323.                                         aa[--i]=0;
  324.                                 }
  325.                                 else
  326.                                 {
  327.                                          bb[--k]=0;
  328.                                 }
  329.                         }
  330.                         if(num=='=')
  331.                         {
  332.                                 m=1;
  333.                                 write_1602com(0xc0);
  334.                                 write_1602date(0x30+13);//1602   '='符
  335.                                 zuan_shu();
  336.                                 yunsuan();
  337.                                 count=sum[k];
  338.                                 lcd1602_display(count);
  339.                                 write_1602com(0x0c);
  340.                         }        
  341.                 }        
  342.         }
  343. }
复制代码

Keil代码与Proteus8.13仿真下载:
源文件.zip (111.39 KB, 下载次数: 49)


评分

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

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:934951 发表于 2023-6-20 19:16 | 只看该作者
怎么清屏?
回复

使用道具 举报

板凳
ID:95059 发表于 2023-7-13 19:13 | 只看该作者
怎么清屏?
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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