久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1577|回復: 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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 视频第一区| 一区二区三区视频 | 一级片片 | 欧美在线一区二区三区 | 成人h视频在线 | 欧美一区二区三区视频 | 91麻豆精品一区二区三区 | 99精品网 | 99国产精品久久久 | 国产日韩一区 | 免费亚洲网站 | 韩日精品在线观看 | 国产欧美视频一区 | 日韩电影免费观看中文字幕 | 天天视频成人 | 一区二区在线不卡 | 日韩欧美中文在线 | 国产精品久久久久久久久久久久久 | 九九热精 | 一区在线观看 | 欧美一区二区 | 日日操操 | 91久久久久久久久 | 欧美三区| 久久一区 | 欧美亚洲视频在线观看 | 亚洲精品在线免费 | 一区二区精品视频 | 在线高清免费观看视频 | 91大神在线资源观看无广告 | 视频一区在线观看 | 国产精品成av人在线视午夜片 | 中文精品视频 | 69亚洲精品 | a免费观看 | 国产精彩视频一区 | 免费久久99精品国产婷婷六月 | 逼逼视频 | www.久久久| 日韩精品极品视频在线观看免费 | 欧美日韩一区二区三区四区五区 |