找回密码
 立即注册

QQ登录

只需一步,快速开始

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

基于单片机的简易计算器数码管显示程序

[复制链接]
跳转到指定楼层
楼主
ID:319762 发表于 2018-5-28 23:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. //S4:+    S8:-   S12:*   S16:/   S15: =   S13:  remove
  2. #include<reg51.h>
  3. #define DIG P0
  4. #define KEY P1
  5. sbit LSA=P2^2;
  6. sbit LSB=P2^3;
  7. sbit LSC=P2^4;
  8. unsigned long int count=0,sum=1;
  9. int a[11]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
  10. 0x7f,0x6f,0x00};
  11. unsigned  char KeyDate;
  12. unsigned char symbol;
  13. void delay();   
  14. void KeyDown();               
  15. void DigDisplay();
  16. void conversion();
  17. void DigDisplayNumble();
  18. void main(void)
  19. {
  20.         while(1)
  21.         {
  22.                 KeyDown();
  23.                 DigDisplay();
  24.         }                               
  25. }
  26. void KeyDown()
  27. {
  28.         KEY=0x0f;
  29.         if(KEY!=0x0f)
  30.         {
  31.                 delay();
  32.                 if(KEY!=0x0f)
  33.                 {       
  34.                         KEY=0X0F;
  35.                         switch(KEY)
  36.                         {
  37.                                 case(0X07):        KeyDate=1;break;
  38.                                 case(0X0b):        KeyDate=2;break;
  39.                                 case(0X0d):        KeyDate=3;break;
  40.                                 case(0X0e):        KeyDate=4;break;
  41.                         }               
  42.                         KEY=0XF0;
  43.                         switch(KEY)
  44.                         {
  45.                                 case(0X70):        KeyDate=KeyDate;break;
  46.                                 case(0Xb0):        KeyDate=KeyDate+4;break;
  47.                                 case(0Xd0): KeyDate=KeyDate+8;break;
  48.                                 case(0Xe0):        KeyDate=KeyDate+12;break;
  49.                         }
  50.                         while(KEY!=0xf0)        ;
  51.                                 delay();
  52.                         conversion();
  53.                 }
  54.         }
  55. }
  56. void DigDisplay()
  57. {
  58.         unsigned int j,p=0;       
  59.         for(j=0;j<8;j++)
  60.         {
  61.                 switch(j)
  62.                 {
  63.                         case(0):
  64.                                 LSA=0;LSB=0;LSC=0;DIG=a[count%10]; break;
  65.                         case(1):
  66.                                 LSA=1;LSB=0;LSC=0;
  67.                                 if(count>=10)
  68.                                         DIG=a[count%100/10];
  69.                                 else
  70.                                         DIG=a[10];
  71.                                 break;
  72.                         case(2):
  73.                                 LSA=0;LSB=1;LSC=0;
  74.                                 if(count>=100)
  75.                                         DIG=a[count%1000/100];
  76.                                 else
  77.                                         DIG=a[10];
  78.                                 break;
  79.                         case(3):
  80.                                 LSA=1;LSB=1;LSC=0;
  81.                                 if(count>=1000)
  82.                                         DIG=a[count%10000/1000];
  83.                                 else
  84.                                         DIG=a[10];
  85.                                 break;
  86.                         case(4):
  87.                                 LSA=0;LSB=0;LSC=1;
  88.                                 if(count>=10000)
  89.                                         DIG=a[count%100000/10000];
  90.                                 else
  91.                                         DIG=a[10];
  92.                                 break;
  93.                         case(5):
  94.                                 LSA=1;LSB=0;LSC=1;
  95.                                 if(count>=100000)
  96.                                         DIG=a[count%1000000/100000];
  97.                                 else
  98.                                         DIG=a[10];
  99.                                 break;
  100.                         case(6):
  101.                                 LSA=0;LSB=1;LSC=1;
  102.                                 if(count>=1000000)
  103.                                         DIG=a[count%10000000/1000000];
  104.                                 else
  105.                                         DIG=a[10];
  106.                                 break;
  107.                         case(7):
  108.                                 LSA=1;LSB=1;LSC=1;
  109.                                 if(count>=10000000)
  110.                                         DIG=a[count%100000000/10000000];
  111.                                 else
  112.                                         DIG=a[10];
  113.                                 break;       
  114.                 }
  115.                 p=10;                                               
  116.                 while(p--);       
  117.                 DIG=0x00;
  118.         }
  119. }
  120. void conversion()
  121. {
  122.         unsigned keydate_count;
  123.                         if(KeyDate%4!=0)
  124.                 {
  125.                         if(KeyDate!=15)
  126.                                 {
  127.                                         switch(KeyDate)
  128.                                         {
  129.                                                         case 1:
  130.                                                         case 2:
  131.                                                         case 3:keydate_count=KeyDate;count=count*10+keydate_count;break;
  132.                                                         case 5:
  133.                                                         case 6:
  134.                                                         case 7:keydate_count=KeyDate-1;count=count*10+keydate_count;break;
  135.                                                         case 9:
  136.                                                         case 10:
  137.                                                         case 11: keydate_count=KeyDate-2;count=count*10+keydate_count;break;
  138.                                                         case 13: count/=10;break;
  139.                                                         case 14 :keydate_count=0;count=count*10+keydate_count;break;
  140.                                                         default :break;                                               
  141.                                         }

  142.                                 }
  143.                                 else
  144.                                 {
  145.                                         if(symbol=='+')
  146.                                                 sum+=count;
  147.                                         if(symbol=='-')
  148.                                                 sum-=count;
  149.                                         if(symbol=='*')
  150.                                                 sum*=count;
  151.                                         if(symbol=='/')
  152.                                                 sum/=count;
  153.                                         count=sum;
  154.                                 }
  155.                 }
  156.                 else  
  157.                 {
  158.                                 switch(KeyDate)
  159.                                 {
  160.                                         case 4: symbol='+';break;
  161.                                         case 8: symbol='-';break;
  162.                                         case 12: symbol='*';break;
  163.                                         case 16:        symbol='/';break;
  164.                                 }
  165.                                 sum=count;
  166.                                 count=0;
  167.                         }               
  168. }

  169. void delay()   
  170. {
  171. unsigned char b,c;
  172.     for(c=200;c>0;c--)
  173.         for(b=200;b>0;b--);
  174. }
复制代码


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

使用道具 举报

沙发
ID:1 发表于 2018-5-29 01:08 | 只看该作者
原理图能分享一下吗?
回复

使用道具 举报

板凳
ID:319762 发表于 2018-5-29 08:56 | 只看该作者
admin 发表于 2018-5-29 01:08
原理图能分享一下吗?

可以的   稍后分享
回复

使用道具 举报

地板
ID:336174 发表于 2018-5-31 17:08 | 只看该作者
非常感谢楼主
回复

使用道具 举报

5#
ID:865475 发表于 2020-12-24 11:31 来自手机 | 只看该作者
请问原理图在哪里呀
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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