找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机4*4矩阵键盘简易计算器Proteus仿真代码

  [复制链接]
跳转到指定楼层
楼主
在设计4*4矩阵键盘基础上,完成两个数的加、减、乘、除运算,结果通过数码管或液晶显示。

仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)


单片机源程序如下:
  1. #include"reg52.h"
  2. #include"math.h"

  3. #define uchar unsigned char
  4. #define uint unsigned int

  5. #define key P1
  6. #define duan P2
  7. #define wei P3

  8. sbit led=P0^0;
  9. sbit buzzer=P0^1;

  10. uchar num,temp,num1,i=0;
  11. long bczs=0,czs=0,jiguo=0,jiguo1=0;
  12. uchar czs12=1;          //输入数的选择标志位,1为第一个数,2为第二个数
  13. uchar yiweiflag,qinflag;  //移位标志

  14. uchar code shuzi[12]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf};         //0~9,-,
  15. uchar code weizi[9]={0x00,0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};
  16. uchar code error[10]={0xff,0xaf,0xc0,0xaf,0xaf,0x86,0xff,0xff,0xff};//error
  17. uchar playshuzu[9],fuhao;
  18. uchar temp1[8],mm[4],temp2[8];
  19. uchar zhi,weishu=0;

  20. void init();                  //函数申明
  21. uchar keyscan();
  22. uchar scanzhi();
  23. void display();
  24. void duzhichuli();
  25. void zhuandisplayjiguo();
  26. void jiafa();
  27. void jianfa();
  28. void chengfa();
  29. void chufa();
  30. void qin();
  31. void displayerror();
  32. //======================================
  33. void main()                          //主函数
  34. {
  35.         init();
  36.         display();
  37.         while(1)
  38.         {
  39.                 duzhichuli();
  40.         }
  41. }
  42. //===============================================================================
  43. void init()
  44. {
  45.         uchar i;
  46.         czs12=1;
  47.         yiweiflag=1;  //1不移
  48.         qinflag=0;    //不清除
  49.         duan=shuzi[8];
  50.         wei=weizi[5];
  51.         playshuzu[1]=shuzi[0];
  52.         for(i=2;i<9;i++)
  53.                 playshuzu[i]=shuzi[10];
  54.                
  55.         bczs=0;czs=0;jiguo=0,jiguo1=0;               
  56. }
  57. //===============================================================================
  58. void delay(uint x)
  59. {
  60.         uchar y;
  61.         for(x;x>0;x--)
  62.                 for(y=112;y>0;y--);
  63. }

  64. //====================================
  65. uchar keyscan()
  66. {
  67. unsigned char recode,i,j;
  68.         for(i=0;i<4;i++)
  69.                 {
  70.                         P1=~(0x01<<i);
  71.                         recode=P1>>4;
  72.                         if(recode<0x0f)
  73.                         {
  74.                         for(j=0;j<4;j++)
  75.                         {if(!(recode&0x01<<j))break;}
  76.                         return (i<<2)+(j+1); //返回键值 1-16
  77.                         }
  78.                         delay(5); //延时5ms
  79.                 }
  80.    return 0; //无按键返回
  81. }
  82. //========================================
  83. uchar scanzhi()
  84. {
  85.         uchar zhi,k;
  86.         k=keyscan();
  87.         switch(k)
  88.         {
  89.                 case 0: zhi=27;break;
  90.                 case 1: zhi=7;break;
  91.                 case 2: zhi=8;break;
  92.                 case 3: zhi=9;break;
  93.                 case 4: zhi=24;break;   // /

  94.                 case 5: zhi=4;break;
  95.                 case 6: zhi=5;break;
  96.                 case 7: zhi=6;break;
  97.                 case 8: zhi=23;break;   //*

  98.                 case 9: zhi=1;break;
  99.                 case 10: zhi=2;break;
  100.                 case 11: zhi=3;break;
  101.                 case 12: zhi=22;break;   //-

  102.                 case 13: zhi=26;break;        //nc
  103.                 case 14: zhi=0;break;
  104.                 case 15: zhi=25;break;  //=
  105.                 case 16: zhi=21;break;  //+
  106.         }
  107.         return(zhi);
  108. }
  109. //===========================================
  110. void duzhichuli()
  111. {
  112.         uchar tt,u;

  113.         tt=scanzhi();
  114.         if(tt!=27)
  115.         {
  116.                 led=0;
  117.                 buzzer=0;
  118.                 if(tt<=9)//数字输入
  119.                 {
  120.                         if(qinflag==1)  qin();
  121.                                 qinflag=0;
  122.                         if(yiweiflag!=1)
  123.                         {
  124.                                 for(u=8;u>1;u--)                         //移位输入
  125.                                 {
  126.                                         playshuzu[u]=playshuzu[u-1];
  127.                                 }
  128.                         }
  129.                         yiweiflag=0;    //移位
  130.                         playshuzu[1]=shuzi[tt];        
  131.                         if(czs12==1)   bczs=bczs*10+tt;                        //
  132.                         if(czs12==2)   czs=czs*10+tt;               
  133.                 }
  134.                 if(tt>20)//符号输入
  135.                 {
  136.                         switch(tt)
  137.                         {
  138.                                 case 21:           jiafa();break;                //+
  139.                                 case 22:    jianfa();break;                //-
  140.                                 case 23:    chengfa();break;        //*
  141.                                 case 24:    chufa();break;
  142.                                 case 25:    zhuandisplayjiguo();break;                //=
  143.                                 case 26:    init();break;                //nc
  144.                         }               
  145.                 }
  146.         }
  147.   //-----------------------------------------------
  148.         while(tt!=27)           //松手检测
  149.         {
  150.                 led=0;
  151.                 buzzer=0;
  152.                 tt=scanzhi();
  153.                 delay(1);
  154.                 if(tt==27) goto chu;
  155.         }

  156.         chu: delay(1);
  157.         led=1;
  158.         buzzer=1;
  159. }

  160. //============================================
  161. void display()
  162. {

  163.         TMOD=0x01;
  164.         TH0=(65536-200)/256;
  165.         TL0=(65536-200)%256;
  166.         EA=1;
  167.         ET0=1;
  168.         TR0=1;

  169. }
  170. void TIME0(void) interrupt 1
  171. {
  172.         TH0=(65536-200)/256;
  173.         TL0=(65536-200)%256;
  174.         i++;
  175.         if(i==9) i=1;
  176.             wei=weizi[i];
  177.             duan=playshuzu[i];        
  178. }
  179. //===============================================           //显示数转操作数
  180. void zhuandisplayjiguo()
  181. {
  182.         uchar i,k;
  183.         long ttt;

  184.         for(i=1;i<9;i++)
  185.                 playshuzu[i]=shuzi[10];
  186.     //----------------------------------------
  187.         switch(fuhao)
  188.         {
  189.                 case 1: jiguo=bczs+czs;break;
  190.                 case 2: jiguo=bczs-czs;break;
  191.                 case 3: jiguo=bczs*czs;break;
  192.                 case 4: jiguo=bczs/czs;break;
  193.                 case 0: jiguo=jiguo1;break;
  194.         }
  195.         fuhao=0;

  196.         //----------------------------------------
  197.         ttt=jiguo;
  198.         jiguo1=jiguo;                                                           //显示处理
  199.         k=1;                                        //取数的个数
  200.     for(i=1;i<=8;i++)
  201.            {
  202.                            if(ttt/10!=0)  k++;
  203.                         ttt=ttt/10;        
  204.            }        

  205.         for(i=8;i>k;i--)
  206.            {
  207.                            playshuzu[i]=shuzi[10];
  208.            }
  209.         if(jiguo<0)  { jiguo=fabs(jiguo);playshuzu[k+1]=shuzi[11]; }   //取正加负号
  210.         
  211.         for(i=1;i<=k;i++)
  212.            {
  213.                            playshuzu[i]=shuzi[jiguo%10];
  214.                                 jiguo=jiguo/10;        
  215.            }
  216.         if(jiguo1>99999999) displayerror();
  217.         
  218. }
  219. //===================================================
  220. void qin()
  221. {
  222.         uchar i;
  223.         yiweiflag=1;  //1不移
  224.         playshuzu[1]=shuzi[0];
  225.         for(i=2;i<9;i++)
  226.                 playshuzu[i]=shuzi[10];
  227. }
  228. //===================================================
  229. void displayerror()
  230. {
  231.         uchar i;
  232.         for(i=1;i<=8;i++)
  233.                 playshuzu[i]=error[i];
  234. }
  235. //===================================================
  236. void jiafa()   //+
  237. {

  238.         qinflag=1;
  239.     if(jiguo1!=0) bczs=jiguo1;
  240.         czs=0;
  241.         czs12=2;
  242.         fuhao=1;   //+               
  243. }

  244. void jianfa()
  245. {

  246.         qinflag=1;
  247.         if(jiguo1!=0) bczs=jiguo1;
  248.         czs=0;
  249.         czs12=2;
  250.         fuhao=2;   //-
  251. }

  252. void chengfa()
  253. {

  254.         qinflag=1;
  255.         if(jiguo1!=0) bczs=jiguo1;
  256.         czs=0;
  257.         czs12=2;
  258.         fuhao=3;   //*        
  259. }

  260. void chufa()
  261. {

  262.         qinflag=1;
  263.         if(jiguo1!=0) bczs=jiguo1;
  264.         czs=0;
  265.         czs12=2;
  266.         fuhao=4;   // /
  267. }
复制代码
Keil代码与Proteus仿真下载:
实验20.7z (223.76 KB, 下载次数: 181)

评分

参与人数 2黑币 +52 收起 理由
TTQWTWTQ + 12 很给力!
admin + 40 共享资料的黑币奖励!

查看全部评分

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

使用道具 举报

沙发
ID:1017814 发表于 2022-4-12 14:50 | 只看该作者
今天刚注册,没有下载权限,只能看看。

自己写了一些初步入门的小程序,想上传上去请老大们支点一二,不知有没有这个权限
回复

使用道具 举报

板凳
ID:1034745 发表于 2022-6-14 21:49 | 只看该作者
感谢大佬的指点
回复

使用道具 举报

地板
ID:1034745 发表于 2022-6-16 00:26 | 只看该作者
感谢大佬的指点
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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