找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机开发板实现电子琴和数码管计算器程序(超简单)

[复制链接]
跳转到指定楼层
楼主
程序实现内容为:
1、通过矩阵键盘输入和数码管显示可以实现简易计算器的功能。
2、计算器功能有基本的加减乘除外,还实现了累加累乘的功能。
3、矩阵键盘从第一排往右的案件功能分别为1、2、3、+、4、5、6、-、7、8、9、*、0、清零、等于、除
4、在第一二独立按键按下切换还可以实现电子琴和计算器切换的功能5、程序包含数码管显示函数。

普中A2单片机源程序如下:
  1. #include <reg52.h>
  2. #include <string.h>
  3. //strcmp(tempName, names[i]) == 0
  4. #define KEYS P1
  5. typedef signed long u16; //对数据类型进行声明定义
  6. typedef unsigned int u12;
  7. typedef unsigned char u8;
  8. unsigned char chice = 0;
  9. int find;
  10.         long view = 0;                                  //计算器最终数字定义
  11.         int s = 0;                                                //按键次数
  12.         int num = 1;
  13.         long temp,temp1;                                //计算器用到的数值
  14.         long sum = 0;
  15.         long totalsum = 0;
  16.         int tect = 0;                                        //测试是否按下等号
  17. sbit KEY1 = P3^1;
  18. sbit KEY2 = P3^0;
  19. int ZE;                                                        //选择模式
  20. int sound;        
  21. sbit LSA=P2^2;
  22. sbit LSB=P2^3;
  23. sbit LSC=P2^4;
  24. sbit beep=P2^5;
  25. void delay(int t)
  26. {
  27.         while(t--);        //大概等于十微秒

  28. }
  29. u8 code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,
  30. 0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0X40};// 显 示 0~F 的值
  31. void Display(int i)
  32. {
  33.          switch(i) //位选,选择点亮的数码管,
  34.          {
  35.                   case(0): LSA=1;LSB=1;LSC=1; break;//显示第 0 位
  36.                 case(1): LSA=0;LSB=1;LSC=1; break;//显示第 1 位
  37.                 case(2): LSA=1;LSB=0;LSC=1; break;//显示第 2 位
  38.                 case(3): LSA=0;LSB=0;LSC=1; break;//显示第 3 位
  39.                 case(4): LSA=1;LSB=1;LSC=0; break;//显示第 4 位
  40.                 case(5): LSA=0;LSB=1;LSC=0; break;//显示第 5 位
  41.                 case(6): LSA=1;LSB=0;LSC=0; break;//显示第 6 位
  42.                 case(7): LSA=0;LSB=0;LSC=0; break;//显示第 7 位
  43.         }
  44. }
  45. void Displaynum(long num)
  46. {
  47.         long temp ;
  48.         int nums[8];
  49.         long i,j;
  50.         u16 sum;
  51.         int m = 0;
  52.         for(sum = 1,j = 0;j < 8;j++)
  53.         {
  54.         if ( num >= 0 )
  55.     {

  56.         if(sum <= num && num >= 0 )
  57.         {
  58.             temp = num / sum;
  59.             temp = temp % 10;
  60.             nums[j] = temp;
  61.                         m++;
  62.         }
  63.                 else if(num == 0)
  64.                 {
  65.                         nums[j] = 0;
  66.                         m++;
  67.                         break;
  68.                 }
  69.                 sum *= 10;
  70.         }
  71.     else if(num < 0)
  72.         {
  73.                 if(num < 0 && sum <= (-num))
  74.                 {

  75.                         temp = (-num) / sum;
  76.             temp = temp % 10;
  77.             nums[j] = temp;
  78.                         m++;        

  79.                 }
  80.                 else
  81.                 {
  82.                         nums[j] = 16;
  83.                         m++;
  84.                         break;
  85.                 }
  86.                 sum *= 10;        
  87.         }
  88.         }
  89.     for(i = 7;i >= 0;i--)
  90.         {
  91.         j = nums[i];
  92.                 if(i < m)
  93.                 {
  94.                         Display(7 - i);
  95.                         P0=smgduan[j];
  96.                         delay(100); //间隔一段时间扫描
  97.                         P0=0x00;//消隐        
  98.                 }
  99.                 else
  100.                 {
  101.                         P0 = 0X00;
  102.                 }
  103.                
  104.         }

  105. }
  106. void Mkey()
  107. {
  108.         int a = 0;
  109.         KEYS = 0X0f;
  110.         if(KEYS != 0X0f)
  111.         {
  112.            delay(1000);
  113.            if(KEYS != 0Xff)
  114.            {
  115.                            KEYS=0X0F;
  116.                         switch(KEYS) //判断列
  117.                         {
  118.                                 case(0X07): chice=0;break;
  119.                                 case(0X0b): chice=1;break;
  120.                                 case(0X0d): chice=2;break;
  121.                                 case(0X0e): chice=3;break;
  122.                         }
  123.                         KEYS=0XF0;
  124.                         switch(KEYS)
  125.                         {
  126.                                 case(0X70): chice=chice;break;
  127.                                 case(0Xb0): chice=chice+4;break;
  128.                                 case(0Xd0): chice=chice+8;break;
  129.                                 case(0Xe0): chice=chice+12;break;
  130.                         }
  131.                         switch(chice) //对每个按键进行功能定义
  132.                         {
  133.                                 case(0):find = 1;break;                case(1):find = 2;break;                case(2):find = 3;break;                case(3):find = 10;break; //加
  134.                                 case(4):find = 4;break;                case(5):find = 5;break;                case(6):find = 6;break;                case(7):find = 11;break; //减
  135.                                 case(8):find = 7;break;                case(9):find = 8;break;                case(10):find = 9;break;        case(11):find = 12;break;//乘
  136.                                 case(12):find = 0;break;        case(13):find = 14;break;        case(14):find = 15;break;        case(15):find = 13;break;//除
  137.                                 
  138.                         }
  139.                         switch(find) //音频频率
  140.                         {
  141.                                 case(1):sound = 70;break;
  142.                                 case(2):sound = 65;break;
  143.                                 case(3):sound = 60;break;
  144.                                 case(4):sound = 55;break;
  145.                                 case(5):sound = 50;break;
  146.                                 case(6):sound = 45;break;
  147.                                 case(7):sound = 40;break;
  148.                                 case(8):sound = 35;break;
  149.                         }                           
  150.                         
  151.            }
  152.            while(KEYS!=0xf0)
  153.            {
  154.                            if(ZE == 2 && sound > 35)
  155.                         {
  156.                                 beep = ~beep;delay(sound);

  157.                         }
  158.            }                         //检测按键松手检测
  159.            sound = 0;
  160.            if(sum == 0)
  161.            {
  162.                            view = 0;
  163.            }
  164.            view = (view *= 10) + find;        //累加
  165.            if(find < 10 && s == 0)                //第一次加
  166.            {
  167.                            sum = 1;
  168.                         temp = view;
  169.                                 
  170.            }
  171.            else if(find >= 10)
  172.            {
  173.                            if(tect == 0 && s > 0)                  //累算
  174.                         {
  175.                                 switch(find)
  176.                                 {
  177.                                         case(10):temp = temp + temp1;break;
  178.                                         case(11):temp = temp - temp1;break;
  179.                                         case(12):temp = temp * temp1;break;
  180.                                         case(13):temp = temp / temp1;break;   
  181.                                 }        
  182.                         }
  183.                            view = 0;
  184.                         switch(find)
  185.                         {
  186.                                 case(10):s=1;break;
  187.                                 case(11):s=2;break;
  188.                                 case(12):s=3;break;
  189.                                 case(13):s=4;break;   
  190.                         }
  191.            }
  192.            if(find < 10 && s != 0)        //第二次加
  193.                 {
  194.                         sum = 1;
  195.                         temp1 = view;
  196.                 }
  197.                                 
  198.         }
  199.         
  200. }
  201. void Comp()
  202. {
  203.         
  204.         if(find == 15)
  205.         {
  206.                
  207.                 switch(s)
  208.                 {
  209.                         case(1):view = temp + temp1;break;
  210.                         case(2):view = temp - temp1;break;
  211.                         case(3):view = temp * temp1;break;
  212.                         case(4):view = temp / temp1;break;
  213.                 }
  214.                 temp = view;
  215.                 find = 0;
  216.                 sum = 0;
  217.                 s = 0;
  218.                 tect = 1;
  219.         }
  220.         else if(find == 14)
  221.         {
  222.                 view=0;
  223.                 temp = 0;
  224.                 temp1 = 0;
  225.                 s = 0;
  226.                 find = 0;
  227.                 sum = 0;
  228.                 totalsum = 0;
  229.                 tect = 0;
  230.         }
  231. }
  232. void XUAN()
  233. {
  234.         if(KEY1 == 0 || KEY2 == 0)
  235.         {
  236.                 delay(100);
  237.                 if(KEY1 == 0)
  238.                 {
  239.                         ZE = 1;
  240.                 }
  241.                 if(KEY2 == 0)
  242.                 {
  243.                         ZE = 2;
  244.                 }
  245.                 while(!KEY1 || !KEY2);
  246.         }
  247. }
  248. void main()
  249. {
  250.         while(1)
  251.         {
  252.                 XUAN();
  253.                 Mkey();
  254.                 if(ZE != 2)
  255.                 {
  256.                         Comp();
  257.                         Displaynum(view);        
  258.                 }
  259.                 if(ZE == 2)
  260.                 {
  261.                         view = 0;
  262.                 }
  263.         

  264.         }

  265. }
复制代码


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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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