久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 6570|回復: 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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产欧美一区二区三区日本久久久 | 色综合一区二区 | 国产色婷婷久久99精品91 | 精品乱码一区二区三四区 | 四虎影院新地址 | 欧美日韩午夜精品 | 亚洲精品国产成人 | 欧美中文字幕一区 | 激情欧美一区二区三区 | 日韩精品区 | 久久精品一区二区三区四区 | 国产国产精品久久久久 | 国产欧美视频一区二区三区 | 中文字幕在线国产 | 一级黄色av电影 | 国产三区四区 | 久草色视频 | 久久机热| 日韩精品无码一区二区三区 | 免费国产网站 | 欧美一区不卡 | 国产精品一区二区av | 欧美成人一级 | 人人爽人人爽人人片av | 中国黄色毛片视频 | 在线免费观看a级片 | 亚洲一区二区三区在线播放 | 久久久久久美女 | 一级美国黄色片 | 中文字幕三区 | 欧美黄色一区 | 成人综合伊人 | 国产精品免费一区二区三区四区 | 欧美一区二区三区在线观看视频 | 久久综合av| 欧美一区二区三区,视频 | 亚洲成人自拍 | 中文字幕在线视频网站 | 日日操网站 | 午夜小视频在线播放 | www.嫩草|