找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3173|回复: 1
收起左侧

Proteus仿真单片机开发板计算器(矩阵键盘)试验

[复制链接]
ID:223055 发表于 2017-8-2 02:33 | 显示全部楼层 |阅读模式
自己做的一个仿真的单片机开发板,有完整的试验步骤和仿真工程文件提供
板子上带扩展ROM空间(i^2c 24c02)、adc(数字电压表)、dac(信号发生器)、矩阵按键(计算器),四个任务通过独立按键进行切换

下面是计算器(矩阵键盘)部分的的单片机源程序
完整代码和仿真工程文件请下载http://www.51hei.com/bbs/dpj-91558-1.html

  1. #include <reg52.h>
  2. #define uint unsigned int
  3. #define uchar unsigned char
  4. sbit leden=P2^7;
  5. sbit rs=P2^6;
  6. sbit wr=P2^5;
  7. sbit key=P3^2;
  8. //sbit busy=P0^7;
  9. uchar i,j,num,num_1,temp;
  10. long a1,b, c;
  11. float a_c,b_c;
  12. uchar flag,fuhao;
  13. uchar code table[]={7,8,9,0,
  14.                     4,5,6,0,
  15.                                         1,2,3,0};
  16. uchar code table1[]={7,8,9,0x2f-0x30,
  17.                      4,5,6,0x2a-0x30,
  18.                                          1,2,3,0x2d-0x30,
  19.                      0x01-0x30,0,0x3d-0x30,0x2b-0x30};
  20. void delay(uchar n)
  21. {
  22.     uchar i,j;
  23.     for(i=n;i>0;i--)
  24.         for(j=200;j>0;j--) ;
  25. }

  26. void write(uint w)
  27. {
  28.    rs=0;
  29.    wr=0;
  30.    leden=0;
  31.    P0=w;
  32.    leden=1;
  33.    delay(10);//check();
  34.    leden=0;
  35.    
  36. }
  37. void write_data(uint q)
  38. {
  39.    rs=1;
  40.    wr=0;
  41.    leden=0;
  42.    P0=q;
  43.    leden=1;
  44.    delay(10);
  45.    leden=0;
  46.    
  47. }
  48. void init()
  49. {
  50.    num=1;
  51.    leden=1;
  52.    write(0x38);
  53.    write(0x08);
  54.    write(0x01);
  55.    write(0x06);
  56.    write(0x0f);
  57.    num_1=0;
  58.    i=0;j=0;a1=0;b=0;c=0;flag=0;fuhao=0;

  59. }

  60. void keyscan()
  61. {
  62.    P1=0Xfe;
  63.    if(P1!=0xfe)
  64.    {
  65.     delay(10);
  66.         if(P1!=0xfe)
  67.         {
  68.           temp=P1&0xf0;
  69.           switch(temp)
  70.             {
  71.                 case 0xe0:num=0;break;
  72.                 case 0xd0:num=1;break;
  73.                 case 0xb0:num=2;break;
  74.                 case 0x70:num=3;break;
  75.                 }
  76.          }
  77.         while(P1!=0xfe);
  78.         if(num==0||num==2||num==1)         
  79.         {
  80.             if(j!=0)
  81.             {
  82.                 write(0x01);
  83.                 j=0;
  84.             }
  85.             if(flag==0)
  86.             {
  87.                 a1=a1*10+table[num];
  88.             }
  89.             else
  90.             {
  91.                 b=b*10+table[num];
  92.             }
  93.         }
  94.         else
  95.         {
  96.            flag=1;
  97.            fuhao=4;//除号以按;
  98.         }
  99.         i=table1[num];
  100.         write_data(0x30+i);
  101.         }
  102.         P1=0xfd;
  103.         if(P1!=0xfd)
  104.         {
  105.             delay(10);
  106.             if(P1!=0xfd)
  107.             {
  108.                 temp=P1&0xf0;
  109.                 switch(temp)
  110.                 {
  111.                     case 0xe0:num=4;break;
  112.                     case 0xd0:num=5;break;
  113.                     case 0xb0:num=6;break;
  114.                     case 0x70:num=7;break;
  115.                 }
  116.             }
  117.             while(P1!=0xfd);
  118.             if(num==4||num==5||num==6)
  119.             {
  120.             if(j!=0)
  121.             {
  122.                 write(0x01);
  123.                 j=0;
  124.             }
  125.             if(flag==0)
  126.             {
  127.                 a1=a1*10+table[num];
  128.             }
  129.             else
  130.             {
  131.                 b=b*10+table[num];
  132.             }
  133.         }
  134.         else
  135.         {
  136.            flag=1;
  137.            fuhao=3;//乘号以按;
  138.         }
  139.         i=table1[num];
  140.         write_data(0x30+i);
  141.    }

  142.    P1=0xfb;
  143.    if(P1!=0xfb)
  144.    {
  145.     delay(10);
  146.         if(P1!=0xfb)
  147.         {
  148.           temp=P1&0xf0;
  149.           switch(temp)
  150.             {
  151.                 case 0xe0:num=8;break;
  152.                 case 0xd0:num=9;break;
  153.                 case 0xb0:num=10;break;
  154.                 case 0x70:num=11;break;
  155.                 }
  156.          }
  157.         while(P1!=0xfb);
  158.         if(num==8||num==9||num==10)
  159.         {
  160.          if(j!=0)
  161.           {
  162.             write(0x01);
  163.                 j=0;
  164.           }
  165.           if(flag==0)
  166.           {
  167.             a1=a1*10+table[num];
  168.           }
  169.           else
  170.            {
  171.              b=b*10+table[num];
  172.            }
  173.          }
  174.          else if(num==11)
  175.           {
  176.            flag=1;
  177.            fuhao=2;//jian号以按;
  178.            }
  179.          i=table1[num];
  180.          write_data(0x30+i);
  181.    }

  182.         P1=0xf7;
  183.     if(P1!=0xf7)
  184.    {
  185.     delay(10);
  186.         if(P1!=0xf7)
  187.         {
  188.           temp=P1&0xf0;
  189.           switch(temp)
  190.             {
  191.                 case 0xe0:num=12;break;
  192.                 case 0xd0:num=13;break;
  193.                 case 0xb0:num=14;break;
  194.                 case 0x70:num=15;break;
  195.                 }
  196.          }
  197.         while(P1!=0xf7);
  198.         
  199.    switch(num)
  200.    {
  201.      case 12:{write(0x01);a1=0;b=0;flag=0;fuhao=0;}break;
  202.      case 13:{
  203.                  if(flag==0)
  204.                  {
  205.                                      a1=a1*10;
  206.                                          write_data(0x30);
  207.                                  }
  208.                  else if(flag==1)
  209.                  {
  210.                                      b=b*10;
  211.                                          write_data(0x30);
  212.                                  }
  213.              } break;
  214.      case 14:{
  215.                      j=1;
  216.                  if(fuhao==1)
  217.                  {
  218.                                      write(0x80+0x4f);
  219.                                          write(0x04);
  220.                                          c=a1+b;
  221.                      while(c!=0)
  222.                      {
  223.                          write_data(0x30+c%10);
  224.                          c=c/10;
  225.                      }
  226.                      write_data(0x3d);
  227.                                          a1=0;b=0;
  228.                                          flag=0;
  229.                                          fuhao=0;
  230.                                   }
  231.                   else if(fuhao==2)
  232.                   {
  233.                                       write(0x80+0x4f);
  234.                                           write(0x04);
  235.                       if(a1-b>0)
  236.                       {
  237.                                               c=a1-b;
  238.                                           }
  239.                       else
  240.                                           {
  241.                                               c=b-a1;
  242.                                   }
  243.                       while(c!=0)
  244.                       {
  245.                           write_data(0x30+c%10);
  246.                           c=c/10;
  247.                       }
  248.                       if(a1-b<0)
  249.                       write_data(0x2d);
  250.                                           write_data(0x3d);
  251.                                           a1=0;b=0;flag=0;
  252.                                           fuhao=0;
  253.                                           }
  254.                       else if(fuhao==3)
  255.                       {
  256.                                               write(0x80+0x4f);
  257.                                                   write(0x04);
  258.                                                   c=a1*b;
  259.                           while(c!=0)
  260.                           {
  261.                                write_data(0x30+c%10);
  262.                                c=c/10;
  263.                           }
  264.                           write_data(0x3d);
  265.                                                   a1=0;
  266.                                                   b=0;
  267.                                                   flag=0;
  268.                                                   fuhao=0;
  269.                                           }
  270.                       else if(fuhao==4)
  271.                       {
  272.                           write(0x80+0x4f);
  273.                                                   write(0x04);
  274.                                           i=0;
  275.                           c=a1/b;        
  276.                           while(c!=0)
  277.                           {
  278.                               write_data(0x30+c%10);
  279.                               c=c/10;
  280.                               i++;
  281.                               if(i==3)
  282.                               write(0x2e);
  283.                           }
  284.                           if(a1/b<=0)
  285.                           write_data(0x30);
  286.                                                   write_data(0x3d);
  287.                                                   a1=0;
  288.                                                   b=0;
  289.                                                   flag=0;
  290.                                                   fuhao=0;
  291.                       }                  
  292.                 } break;
  293.         case 15:
  294.                 {
  295.                     write_data(0x30+table1[num]);
  296.                         flag=1;
  297.                         fuhao=1;
  298.                 }    break;
  299.    }
  300.    }
  301.    P1=0xf0;
  302. }

  303. void jisuanqi()
  304. {
  305.    init();
  306.    while(key)
  307.    {
  308.        keyscan();
  309.    }
  310. }
复制代码



回复

使用道具 举报

ID:222834 发表于 2017-8-2 09:31 | 显示全部楼层
已下载
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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