找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机四位数码管与4*4矩阵键盘计算器源代码与Proteus仿真

[复制链接]
跳转到指定楼层
楼主
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)


单片机源程序如下:
  1. #include<reg52.h>
  2. unsigned char code Table[10]=
  3. {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//定义一个char型一维数组(coed:存储数据ROM)
  4. char key;//
  5. void delay()//延时函数
  6. {
  7.         char i;//
  8.         for(i=0;i<50;i++);         
  9. }

  10. void display(int num)//
  11. {
  12.         P3=0X00;//清屏;千位
  13.         P2=Table[num/1000];//送显示
  14.         P3=0X01;//单独供电
  15.         delay();//短延时
  16.        
  17.         P3=0X00;//清屏;百位
  18.         P2=Table[num/100%10];//送显示
  19.         P3=0X02;//单独供电
  20.         delay();//短延时
  21.        
  22.         P3=0X00;//清屏;十位
  23.         P2=Table[num/10%10];//送显示
  24.         P3=0X04;//单独供电
  25.         delay();//短延时
  26.        
  27.         P3=0X00;//清屏;个位
  28.         P2=Table[num%10];//送显示
  29.         P3=0X08;//单独供电
  30.         delay();//短延时
  31.        
  32. }

  33. char key_scan(void)//
  34. {
  35.         key=0;
  36.         P1=0XFE;//
  37.         //一
  38.         if(P1 !=0XFE)
  39.         {
  40.                 delay();
  41.                 if(P1 !=0XFE)
  42.                 {
  43.                         switch(P1)
  44.                         {
  45.                                 case 0x7E:key=1;break;
  46.                                 case 0xBE:key=2;break;
  47.                                 case 0xDE:key=3;break;
  48.                                 case 0xEE:key=4;break;
  49.                         }
  50.                 }
  51.                   while(P1 !=0XFE);
  52.         }
  53.        
  54.                 //二
  55.         P1=0XFD;
  56.         if(P1!=0XFD)
  57.         {
  58.                 delay();
  59.                 if(P1!=0XFD)
  60.                 {
  61.                         switch(P1)
  62.                         {
  63.                                 case 0x7D:key=5;break;
  64.                                 case 0xBD:key=6;break;
  65.                                 case 0xDD:key=7;break;
  66.                                 case 0xED:key=8;break;
  67.                         }
  68.                 }
  69.                         while(P1!=0XFD);
  70.         }

  71.                 //三
  72.         P1=0XFB;
  73.         if(P1!=0XFB)
  74.         {
  75.                 delay();
  76.                 if(P1!=0XFB)
  77.                 {
  78.                         switch(P1)
  79.                         {
  80.                                 case 0x7B:key=9;break;
  81.                                 case 0xBB:key=10;break;
  82.                                 case 0xDB:key=11;break;
  83.                                 case 0xEB:key=12;break;
  84.                         }
  85.                 }
  86.                 while(P1!=0XFB);
  87.         }
  88.        
  89.                 //四
  90.         P1=0XF7;
  91.         if(P1!=0XF7)
  92.         {
  93.                 delay();
  94.                 if(P1!=0XF7)
  95.                 {
  96.                         switch(P1)
  97.                         {
  98.                                 case 0x77:key=13;break;
  99.                                 case 0xB7:key=14;break;
  100.                                 case 0xD7:key=15;break;
  101.                                 case 0xE7:key=16;break;
  102.                         }
  103.                 }
  104.                         while(P1!=0XF7);
  105.         }
  106.         return key;
  107. }

  108. void main()//主函数
  109. {
  110.         char key_value;//按键信息 0代表无按键 1-16代表有按键
  111.         int a1=0;//
  112.         int a2=0;//
  113.         char ys_flag=0;//运算符
  114.         int result;//计算结果
  115.         int show;//显示内容
  116.         while(1)
  117.         {
  118.                 display(show);
  119.                 key_value=key_scan();
  120.                
  121.                 //a1输入
  122.                 if((key_value>0)&&(key_value<11)&&(ys_flag==0))
  123.                 {
  124.                         if(key_value==10)
  125.                         key_value=0;
  126.                         a1=a1*10+key_value;
  127.                         show=a1;
  128.                 }
  129.                
  130.                 if((key_value>12)&&(key_value<17))
  131.                 {
  132.                         ys_flag=key_value;
  133.                 }
  134.                
  135.                 //a2输入
  136.                 if((key_value>0)&&(key_value<11)&&(ys_flag!=0))
  137.                 {
  138.                         if(key_value==10)
  139.                         key_value=0;
  140.                         a2=a2*10+key_value;
  141.                         show=a2;
  142.                 }
  143.                
  144.                 if(key_value==12)//输入运算符
  145.                 {
  146.                         switch(ys_flag)
  147.                         {
  148.                                 case 13:result=a1+a2;break;
  149.                                 case 14:result=a1-a2;break;
  150.                                 case 15:result=a1*a2;break;
  151.                                 case 16:result=a1/a2;break;
  152.                         }
  153.                         show=result;
  154.                 }
  155.                
  156.                 if(key_value==11)//复位
  157.                 {
  158.                         show=0;
  159.                         result=0;
  160.                         a1=0;
  161.                         a2=0;
  162.                         ys_flag=0;
  163.                 }
  164.         }
  165. }
复制代码

所有资料51hei提供下载:
四位简易计算器.zip (114.03 KB, 下载次数: 107)


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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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