找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 12067|回复: 22
收起左侧

51单片机计算器程序+仿真文件+电路图下载 采用1602液晶显示

  [复制链接]
ID:70650 发表于 2014-12-18 00:33 | 显示全部楼层 |阅读模式
感谢51hei论坛提供这么好的交流平台,这是一个用51单片机做的计算机程序 带仿真文件,大家可以下载本帖的附件。
181042qpvm5zmf3xd5pxx0.jpg.thumb.jpg

181043eypnnufbkue7kic3.jpg.thumb.jpg


181044jg6w6lnnkkvhye8y.jpg.thumb.jpg






初级计算器仿真文件.rar

19.49 KB, 下载次数: 233, 下载积分: 黑币 -5

初级计算器程序.zip

48.46 KB, 下载次数: 321, 下载积分: 黑币 -5

Last Loaded 初级计算器 电路图.rar

19.5 KB, 下载次数: 169, 下载积分: 黑币 -5

评分

参与人数 2黑币 +9 收起 理由
小甜甜-L + 4 很给力!
jhhw + 5

查看全部评分

回复

使用道具 举报

ID:70650 发表于 2014-12-18 00:34 | 显示全部楼层
本帖最后由 jiujiu 于 2014-12-18 00:35 编辑

main.c文件:
  1. #include "keyscan.h"
  2. #include "LCD1602.h"
  3. #include<stdio.h>

  4. uchar dis_table0[16]="                ";  //第一行        a+b=
  5. uchar dis_table1[16]="                ";  //第二行         c
  6. uchar temp[8]="        ";//数据b输入存储
  7. uchar code Hello_0[]="   Yin Shilong  ";
  8. uchar code Hello_1[]="   2012-12-31   ";
  9. int a,b,c;//EG:a+b=c
  10. uchar num;   //按键值
  11. uchar dis,dis_temp;   //显示索引
  12. uchar sign;  //符号记录
  13. uchar first;
  14. uchar qing;

  15. int Dis_ab(int a,int b,uchar sign)
  16. {
  17.      int c;
  18.      if(sign=='+') c=a+b;
  19.      if(sign=='-') c=a-b;
  20.      if(sign=='x') c=a*b;
  21.      if(sign=='/') c=a/b;
  22.      return c;
  23. }

  24. void main()
  25. {
  26.         LCD_init();
  27.         showstring(0,0,Hello_0);
  28.         showstring(0,1,Hello_1);
  29.         delayms(500);
  30.           while(1)
  31.           {
  32.                     num=KeyPro();//键盘扫描
  33.           if(num!=0xff) //按键按下
  34.               {          
  35.                
  36.               if(('+'==num) || ('-'==num) || ('x'==num)|| ('/'==num) || ('='==num))//输入数字最大值8,输入符号表示输入结束
  37.                       {    //符号键
  38.                    if(first==0)
  39.                    {  if((num=='+')||(num=='-')||(num=='x')||(num=='/')) first=1;//第一个数输入结束
  40.                       if(num=='+')
  41.                        {   sign='+';  //记录
  42.                            dis_table0[dis]='+'; //先显示出来
  43.                            sscanf(dis_table0,"%d[^+]",&a); //把第一个数取出赋值给a,详情参考本函数用法
  44.                         
  45.                        }
  46.                        if(num=='-')
  47.                        {   sign='-';
  48.                            dis_table0[dis]='-'; //显示
  49.                            sscanf(dis_table0,"%d[^-]",&a);
  50.                        }
  51.                        if(num=='x')
  52.                        {   sign='x';
  53.                            dis_table0[dis]='x'; //显示
  54.                            sscanf(dis_table0,"%d[^x]",&a);
  55.                        }
  56.                        if(num=='/')
  57.                        {   sign='/';
  58.                            dis_table0[dis]='/'; //显示
  59.                            sscanf(dis_table0,"%d[^/]",&a);
  60.                        }
  61.                        dis++;dis%=16;
  62.          
  63.                    }

  64.                    if(first==1)
  65.                    {
  66.                         if(num=='=')
  67.                         {
  68.                             dis_table0[dis]='='; //显示
  69.                             dis++;dis%=16;
  70.                             sscanf(temp,"%d",&b); //取b
  71.                             c=Dis_ab(a,b,sign);
  72.                             sprintf(dis_table1,"%d",c);
  73.                         }
  74.                    }
  75.                   
  76.                       }
  77.                       else
  78.                       {    //数字键
  79.                       
  80.                   if(num==10)   //清除键
  81.                   {
  82.                       first=0;sign=0; //清标志
  83.                       dis=0;dis_temp=0;
  84.                       a=b=c=0;
  85.                       for(qing=0;qing<16;qing++)
  86.                       {
  87.                          dis_table0[qing]=' ';    //清显示
  88.                          dis_table1[qing]=' ';
  89.                       }
  90.                   
  91.                   }
  92.                   else
  93.                   {
  94.                        dis_table0[dis]=num+'0';  //供显示用
  95.                        dis++;dis%=16;         
  96.                        if(first==1)
  97.                        {
  98.                            temp[dis_temp]=num+'0';  //存下b的值
  99.                            dis_temp++;dis_temp%=8;
  100.                        }
  101.                   }


  102.                                              
  103.                       }
  104.               
  105.                 
  106.               
  107.           }

  108.           showstring(0,0,dis_table0);
  109.           showstring(0,1,dis_table1);


  110.           }


  111. }






















复制代码



回复

使用道具 举报

ID:70650 发表于 2014-12-18 00:36 | 显示全部楼层
keyscan.c文件:
  1.    /*-----------------------------------------------
  2.   名称:矩阵键盘
  3.   编写:殷士龙
  4.   日期:2012.12.31
  5. ------------------------------------------------*/
  6. //#include <reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
  7. #include "keyscan.h"
  8. #include "LCD1602.h"

  9. //#define KeyPort P1

  10. /*------------------------------------------------
  11. 按键扫描函数,返回扫描键值
  12. ------------------------------------------------*/
  13. unsigned char KeyScan(void)  //键盘扫描函数,使用行列反转扫描法
  14. {
  15. unsigned char cord_h,cord_l;//行列值中间变量
  16. KeyPort=0x0f;            //行线输出全为1
  17. cord_h=KeyPort&0x0f;     //读入行线值
  18. if(cord_h!=0x0f)    //先检测有无按键按下
  19. {
  20.    delayms(10);        //去抖
  21.    if((KeyPort&0x0f)!=0x0f)
  22.    {
  23.     cord_h=KeyPort&0x0f;  //读入行线值
  24.     KeyPort=cord_h|0xf0;  //输出当前列线值
  25.     cord_l=KeyPort&0xf0;  //读入列线值

  26.     while((KeyPort&0xf0)!=0xf0);//等待松开并输出

  27.     return(cord_h+cord_l);//键盘最后组合码值
  28.    }
  29.   }
  30.   return(0xff);     //返回该值
  31. }
  32. /*------------------------------------------------
  33.           按键值处理函数,返回扫键值
  34.            可以根据需要改变返回值

  35.                           | 7 | 8 | 9 | / |  
  36.                           | 4 | 5 | 6 | X |  
  37.                           | 1 | 2 | 3 | - |  
  38.                           | C | 0 | = | + |
  39. ------------------------------------------------*/
  40. unsigned char KeyPro(void)
  41. {
  42. switch(KeyScan())
  43. {
  44.   case 0xee:return 7  ;break;//0 按下相应的键显示相对应的码值
  45.   case 0xde:return 8  ;break;//1
  46.   case 0xbe:return 9  ;break;//2
  47.   case 0x7e:return '/';break;//3

  48.   case 0xed:return 4  ;break;//4
  49.   case 0xdd:return 5  ;break;//5
  50.   case 0xbd:return 6  ;break;//6
  51.   case 0x7d:return 'x';break;//7

  52.   case 0xeb:return 1  ;break;//8
  53.   case 0xdb:return 2  ;break;//9
  54.   case 0xbb:return 3  ;break;//a
  55.   case 0x7b:return '-';break;//b

  56.   case 0xe7:return 10 ;break;//c         清除键
  57.   case 0xd7:return 0  ;break;//d
  58.   case 0xb7:return '=';break;//e
  59.   case 0x77:return '+';break;//f
  60.   default:return 0xff;break;
  61. }
  62. }
复制代码
回复

使用道具 举报

ID:70614 发表于 2014-12-19 10:10 | 显示全部楼层
我也要制作一个
回复

使用道具 举报

ID:71725 发表于 2015-1-6 16:25 | 显示全部楼层
多谢啦
回复

使用道具 举报

ID:83915 发表于 2015-6-27 14:18 | 显示全部楼层
为什么我下载到 单片机上 结果后面会显示一个奇怪的符号
回复

使用道具 举报

ID:150573 发表于 2016-12-6 21:03 | 显示全部楼层
我想学习学习
回复

使用道具 举报

ID:152867 发表于 2016-12-7 12:43 | 显示全部楼层
感谢分享啊
回复

使用道具 举报

ID:158779 发表于 2016-12-30 15:36 | 显示全部楼层
hao aaaaaaaaaaaaaaaaaaaaaaaaaa
回复

使用道具 举报

ID:161466 发表于 2017-1-12 14:39 | 显示全部楼层
哎哟,感觉不错,学习学习,
回复

使用道具 举报

ID:162997 发表于 2017-1-27 03:05 | 显示全部楼层
这个可以实现小数吗?
回复

使用道具 举报

ID:122366 发表于 2017-3-31 21:01 | 显示全部楼层

感谢分享
回复

使用道具 举报

ID:118238 发表于 2017-6-27 13:24 | 显示全部楼层
谢谢楼主的分享
回复

使用道具 举报

ID:118238 发表于 2017-6-27 13:37 | 显示全部楼层
谢谢分享
回复

使用道具 举报

ID:263260 发表于 2017-12-18 18:11 | 显示全部楼层
。。。。。大佬们  厉害了
回复

使用道具 举报

ID:316073 发表于 2018-6-28 19:01 | 显示全部楼层
谢谢你,正准备做这个
回复

使用道具 举报

ID:414974 发表于 2018-10-24 23:12 | 显示全部楼层
大佬,好像要剩下的代码
回复

使用道具 举报

ID:440997 发表于 2018-12-7 15:20 | 显示全部楼层
可以实现连续运算嘛
回复

使用道具 举报

ID:428761 发表于 2018-12-7 18:00 | 显示全部楼层
大佬们,为什么我改了串口还是没用呀。。。
回复

使用道具 举报

ID:471463 发表于 2019-2-20 22:23 | 显示全部楼层
为什么我按符号键没有反应,哭辽
回复

使用道具 举报

ID:492496 发表于 2019-3-24 17:58 | 显示全部楼层
楼主,你这个D0到D7怎么仿真时出现了问题啊,你做的时候仿真成功了吗?
回复

使用道具 举报

ID:503014 发表于 2019-4-2 10:17 | 显示全部楼层
对我有用谢谢啦
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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