找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机+1602+矩阵按键 简易计算器 原理图 仿真 代码

[复制链接]
跳转到指定楼层
楼主
51+1602+矩阵按键  简易计算器 实现乘 加 减 除 共算
有程序 基于普中单片机
就是/算法 有点问题


单片机源程序:

  1. #include<reg51.h>   //头文件
  2. #define uint unsigned int //
  3. #define uchar unsigned char

  4. sbit e=P2^3; //定义引脚
  5. sbit rs=P2^4;
  6. sbit rw=P2^0;
  7. sbit busy=P0^7;

  8. char i,j,temp,num,num_1;
  9. long a,b,c;     //a,第一个数 b,第二个数 c,得数
  10. float a_c,b_c;
  11. uchar flag,fuhao;//flag表示是否有符号键按下,fuhao表征按下的是哪个符号

  12. uchar code table[]={
  13. 7,8,9,0,
  14. 4,5,6,0,
  15. 1,2,3,0,
  16. 0,0,0,0};
  17. uchar code table1[]={
  18. 7,8,9,0x2f-0x30,
  19. 4,5,6,0x2a-0x30,
  20. 1,2,3,0x2d-0x30,
  21. 0x01-0x30,0,0x3d-0x30,0x2b-0x30};

  22. void delay(uchar z) // 延迟函数
  23. {
  24. uchar y;
  25. for(z;z>0;z--)
  26.    for(y=0;y<110;y++);
  27. }

  28. void check() // 判断忙或空闲
  29. {
  30. do{
  31.     P0=0xFF;
  32.     rs=0;     //指令
  33.     rw=1;     //读
  34.     e=0;     //禁止读写
  35.     delay(1); //等待,液晶显示器处理数据
  36.     e=1;     //允许读写
  37.     }while(busy==1); //判断是否为空闲,1为忙,0为空闲
  38. }
  39. void write_com(uchar com) // 写指令函数
  40. {
  41. P0=com;    //com指令付给P0口
  42. rs=0;
  43. rw=0;
  44. e=0;
  45. check();
  46. e=1;
  47. }

  48. void write_date(uchar date) // 写数据函数
  49. {
  50.     P0=date;
  51. rs=1;
  52. rw=0;
  53. e=0;
  54. check();
  55. e=1;
  56. }

  57. void init() //初始化
  58. {
  59.     num=-1;
  60. e=1; //使能信号为高电平
  61. write_com(0X01);//清屏
  62. delay(1);
  63. write_com(0x38); //8位,2行
  64. delay(1);
  65. write_com(0x0c); //显示开,光标关,不闪烁*/
  66. delay(1);
  67. write_com(0x06); //增量方式不移位
  68. delay(1);
  69. write_com(0x80); //检测忙信号
  70. delay(1);
  71. write_com(0x01); //显示开,光标关,不闪烁
  72. delay(1);
  73. num_1=0;
  74. i=0;
  75. j=0;
  76. a=0;     //第一个参与运算的数
  77. b=0;     //第二个参与运算的数
  78. c=0;
  79. flag=0; //flag表示是否有符号键按下,
  80. fuhao=0; // fuhao表征按下的是哪个符号
  81. }
  82. void keyscan() // 键盘扫描程序

  83. {

  84. P3=0xfe;

  85. if(P3!=0xfe)

  86. {

  87.    delay(20); //延迟20ms

  88.    if(P3!=0xfe)

  89.    {

  90.     temp=P3&0xf0;

  91.     switch(temp)

  92.     {

  93.      case 0xe0:num=0;

  94.        break;

  95.      case 0xd0:num=1;

  96.        break;

  97.      case 0xb0:num=2;

  98.        break;

  99.      case 0x70:num=3;

  100.        break;

  101.     }

  102.    }

  103.    while(P3!=0xfe);

  104.    if(num==0||num==1||num==2)//如果按下的是'7','8'或'9

  105.    {

  106.        if(j!=0)

  107.         {

  108.           write_com(0x01);

  109.           j=0;

  110.          }

  111.        if(flag==0)//没有按过符号键

  112.     {

  113.      a=a*10+table[num];

  114.     }

  115.     else//如果按过符号键

  116.     {

  117.      b=b*10+table[num];

  118.     }

  119.    }

  120.    else//如果按下的是'/'

  121.    {

  122.     flag=1;

  123.     fuhao=4;//4表示除号已按

  124.    }

  125.    i=table1[num];

  126.    write_date(0x30+i);

  127. }

  128. P3=0xfd;

  129. if(P3!=0xfd)

  130. {

  131.    delay(5);

  132.    if(P3!=0xfd)

  133.    {

  134.     temp=P3&0xf0;

  135.     switch(temp)

  136.     {

  137.      case 0xe0:num=4;

  138.          break;

  139.       

  140.      case 0xd0:num=5;

  141.          break;

  142.       

  143.      case 0xb0:num=6;

  144.          break;

  145.       

  146.      case 0x70:num=7;

  147.          break;

  148.     }

  149.    }

  150.    while(P3!=0xfd);

  151.    if(num==4||num==5||num==6&&num!=7)//如果按下的是'4','5'或'6'

  152.    {

  153.     if(j!=0)

  154.         {

  155.           write_com(0x01);

  156.           j=0;

  157.          }

  158.        if(flag==0)//没有按过符号键

  159.     {

  160.      a=a*10+table[num];

  161.     }

  162.     else//如果按过符号键

  163.     {

  164.      b=b*10+table[num];

  165.     }

  166.    }

  167.    else//如果按下的是'/'

  168.    {

  169.     flag=1;

  170.     fuhao=3;//3表示乘号已按

  171.    }

  172.    i=table1[num];

  173.    write_date(0x30+i);

  174. }

  175. P3=0xfb;

  176. if(P3!=0xfb)

  177. {

  178.    delay(5);

  179.    if(P3!=0xfb)

  180.    {

  181.     temp=P3&0xf0;

  182.     switch(temp)

  183.     {

  184.      case 0xe0:num=8;

  185.          break;

  186.       

  187.      case 0xd0:num=9;

  188.          break;

  189.       

  190.      case 0xb0:num=10;

  191.          break;

  192.       

  193.      case 0x70:num=11;

  194.          break;

  195.     }

  196.    }

  197.    while(P3!=0xfb);

  198.    if(num==8||num==9||num==10)//如果按下的是'1','2'或'3'

  199.    {

  200.     if(j!=0)

  201.         {

  202.           write_com(0x01);

  203.           j=0;

  204.          }

  205.       if(flag==0)//没有按过符号键

  206.     {

  207.      a=a*10+table[num];

  208.     }

  209.     else//如果按过符号键

  210.     {

  211.      b=b*10+table[num];

  212.     }

  213.    }

  214.    else if(num==11)//如果按下的是'-'

  215.    {

  216.     flag=1;

  217.     fuhao=2;//2表示减号已按

  218.    }

  219.    i=table1[num];

  220.    write_date(0x30+i);

  221. }

  222. P3=0xf7;

  223. if(P3!=0xf7)

  224. {

  225.    delay(5);

  226.    if(P3!=0xf7)

  227.    {

  228.     temp=P3&0xf0;

  229.     switch(temp)

  230.     {

  231.      case 0xe0:num=12;

  232.          break;

  233.       

  234.      case 0xd0:num=13;

  235.          break;

  236.       

  237.      case 0xb0:num=14;

  238.          break;

  239.       

  240.      case 0x70:num=15;

  241.          break;

  242.     }

  243.    }

  244.    while(P3!=0xf7);

  245.    switch(num)

  246.    {

  247.     case 12:{write_com(0x01);a=0;b=0;flag=0;fuhao=0;}//按下的是"清零"

  248.      break;

  249.     case 13:{                //按下的是"0"

  250.        if(flag==0)//没有按过符号键

  251.        {

  252.         a=a*10;

  253.         write_date(0x30);

  254.         P1=0;

  255.        }

  256.        else if(flag==1)//如果按过符号键

  257.        {

  258.         b=b*10;

  259.         write_date(0x30);

  260.         }

  261.       }

  262.      break;

  263.     case 14:{j=1;

  264.            if(fuhao==1){write_com(0x80+0x4f);//按下等于键,光标前进至第二行最后一个显示处

  265.            write_com(0x04);     //设置从后住前写数据,每写完一个数据,光标后退一格

  266.            c=a+b;

  267.            while(c!=0)

  268.            {

  269.              write_date(0x30+c%10);

  270.              c=c/10;

  271.            }

  272.            write_date(0x3d);     //再写"="

  273.            a=0;b=0;flag=0;fuhao=0;

  274.            }

  275.       else if(fuhao==2){write_com(0x80+0x4f);//光标前进至第二行最后一个显示处

  276.             write_com(0x04);     //设置从后住前写数据,每写完一个数据,光标后退一格(这个照理说顺序不对,可显示和上段一样)

  277.            if(a-b>0)

  278.              c=a-b;

  279.            else

  280.              c=b-a;

  281.            while(c!=0)

  282.            {

  283.              write_date(0x30+c%10);

  284.              c=c/10;

  285.            }

  286.            if(a-b<0)

  287.              write_date(0x2d);

  288.            write_date(0x3d);     //再写"="           

  289.            a=0;b=0;flag=0;fuhao=0;

  290.           }

  291.       else if(fuhao==3){write_com(0x80+0x4f);

  292.             write_com(0x04);

  293.              c=a*b;

  294.              while(c!=0)

  295.              {

  296.              write_date(0x30+c%10);

  297.              c=c/10;

  298.              }

  299.              write_date(0x3d);     

  300.           a=0;b=0;flag=0;fuhao=0;

  301.              }

  302.       else if(fuhao==4){write_com(0x80+0x4f);

  303.             write_com(0x04);

  304.             i=0;

  305.             c=(long)(((float)a/b)*1000);

  306.             while(c!=0)

  307.              {

  308.                write_date(0x30+c%10);

  309.                c=c/10;

  310.            i++;

  311.            if(i==3)

  312.                write_date(0x2e);

  313.              }

  314.             if(a/b<=0)

  315.               write_date(0x30);

  316.             write_date(0x3d);                              

  317.             a=0;b=0;flag=0;fuhao=0;

  318.                     }

  319.       }

  320.      break;


  321. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

下载:
51计算器.7z (267.31 KB, 下载次数: 81)

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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