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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3469|回復: 0
打印 上一主題 下一主題
收起左側

51單片機矩陣鍵盤數碼管顯示按鍵值Proteus仿真程序

[復制鏈接]
跳轉到指定樓層
樓主


單片機源程序如下:
  1. #include "reg51.h"
  2. #include "intrins.h"

  3. #define SEG7 P0
  4. #define Key P3
  5. unsigned char code DIG_CODE[17]={
  6. 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
  7. 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
  8. void Delayms(unsigned int z);
  9. void Count(void);
  10. void DigtDisplay(void);
  11. void scan_key_f(void);
  12. void Scan_key_b(void);
  13. sbit LSA=P2^2;
  14. sbit LSB=P2^3;
  15. sbit LSC=P2^4;
  16. unsigned char Num;
  17. unsigned char Digt[8];
  18. void main()
  19. {


  20.         while(1)
  21.         {
  22.                 scan_key_f();
  23.                 Count();
  24.                 DigtDisplay();
  25.         }


  26. }



  27. /*計算各位數碼管顯示段碼*/
  28. void Count()
  29. {
  30.                         Digt[0]=DIG_CODE[Num/10000000];
  31.             Digt[1]=DIG_CODE[Num%10000000/1000000];
  32.                         Digt[2]=DIG_CODE[Num%1000000/100000];
  33.                         Digt[3]=DIG_CODE[Num%100000/10000];
  34.                         Digt[4]=DIG_CODE[Num%10000/1000];
  35.                         Digt[5]=DIG_CODE[Num%1000/100];
  36.                         Digt[6]=DIG_CODE[Num%100/10];
  37.                         Digt[7]=DIG_CODE[Num%10];       
  38.                         if(Num<10) Digt[0]=Digt[1]=Digt[2]=Digt[3]=Digt[4]=Digt[5]=Digt[6]=0x00;   //消隱
  39.                         if(Num<100) Digt[0]=Digt[1]=Digt[2]=Digt[3]=Digt[4]=Digt[5]=0x00;
  40.                         if(Num<1000) Digt[0]=Digt[1]=Digt[2]=Digt[3]=Digt[4]=0x00;
  41.                         if(Num<10000) Digt[0]=Digt[1]=Digt[2]=Digt[3]=0x00;
  42.                         if(Num<100000) Digt[0]=Digt[1]=Digt[2]=0x00;
  43.                         if(Num<1000000) Digt[0]=Digt[1]=0x00;
  44.                         if(Num<10000000) Digt[0]=0x00;

  45.        
  46. }
  47. void DigtDisplay()
  48. {
  49.                 unsigned char i;
  50.                 for(i=0;i<8;i++)
  51.                 {
  52.                         switch(i)         
  53.                         {
  54.                                 case(0):
  55.                                         LSA=0;LSB=0;LSC=0; break;
  56.                                 case(1):
  57.                                         LSA=1;LSB=0;LSC=0; break;
  58.                                 case(2):
  59.                                         LSA=0;LSB=1;LSC=0; break;
  60.                                 case(3):
  61.                                         LSA=1;LSB=1;LSC=0; break;
  62.                                 case(4):
  63.                                         LSA=0;LSB=0;LSC=1; break;
  64.                                 case(5):
  65.                                         LSA=1;LSB=0;LSC=1; break;
  66.                                 case(6):
  67.                                         LSA=0;LSB=1;LSC=1; break;
  68.                                 case(7):
  69.                                         LSA=1;LSB=1;LSC=1; break;
  70.                         }
  71.                 SEG7=Digt[i];
  72.                 Delayms(2);                                                 
  73.           SEG7=0x00;  //清顯示,消除重影
  74.         }
  75. }

  76. ////反轉法  先列再行
  77. //void scan_key_f()
  78. //{
  79. //        Key=0X0F;      //0000 1111
  80. //        if(Key!=0X0F)
  81. //        {
  82. //                Delayms(10);
  83. //                if(Key!=0X0F)
  84. //                {
  85. //                        Key=0XF0;    //判斷列
  86. //                        switch(Key)
  87. //                        {
  88. //                                case 0xE0: Num=1;break;
  89. //                                case 0xD0: Num=2;break;
  90. //                                case 0xB0: Num=3;break;
  91. //                                case 0x70: Num=4;break;   //0111
  92. //                                default: Num=0;break;
  93. //                        }
  94. //                        Key=0X0F;                 //判斷行
  95. //                        switch(Key)
  96. //                        {
  97. //                                case 0x07: Num=Num;break;                  //1  2 3  4   
  98. //                                case 0x0B: Num=Num+4;break;                 //5  6 7  8                 
  99. //                                case 0x0D: Num=Num+8;break;                 //9 10 11 12   
  100. //                                case 0x0E: Num=Num+12;break;        //13 14 15 16         
  101. //                                default: Num=0;break;
  102. //                        }
  103. //                }
  104. //                while(Key!=0X0F);    //要和最后的Key值一樣
  105. //        }
  106. //}
  107. //
  108. //反轉法 先行再列
  109. void scan_key_f()
  110. {
  111.         Key=0X0F;      //0000 1111
  112.         if(Key!=0X0F)
  113.         {
  114.                 Delayms(10);
  115.                 if(Key!=0X0F)
  116.                 {
  117.                        
  118.                         Key=0X0F;                 //判斷行
  119.                         switch(Key)
  120.                         {
  121.                                 case 0x07: Num=1;break;                  //1  2 3  4   
  122.                                 case 0x0B: Num=2;break;                 //5  6 7  8                 
  123.                                 case 0x0D: Num=3;break;                 //9 10 11 12   
  124.                                 case 0x0E: Num=4;break;        //13 14 15 16         
  125.                                 default: Num=0;break;
  126.                         }
  127.                 }
  128.                         Key=0XF0;    //判斷列
  129.                         switch(Key)
  130.                         {
  131.                                 case 0xE0: Num=Num*4-3;break;
  132.                                 case 0xD0: Num=Num*4-2;break;
  133.                                 case 0xB0: Num=Num*4-1;break;
  134.                                 case 0x70: Num=Num*4;break;   //0111
  135.                                 default: Num=0;break;
  136.                         }
  137.                
  138.                 while(Key!=0XF0);
  139.         }
  140. }
  141. //逐列掃描
  142. void Scan_key_b()     
  143. {
  144.         Key=0x0f;    //無論怎么接線,先確定列線  將列線置為0  行線置為1
  145.         if(Key!=0x0f)
  146.         {
  147.                 Delayms(10);
  148.                 if(Key!=0x0f)
  149.                 {
  150.                   Key=0xef;    //第一列
  151.                         if(Key!=0xef)
  152.                         {
  153.                          switch(Key)
  154.                          {
  155.                                  case 0xe7:Num=1;while(Key==0xe7);break;  //第一列第一行
  156.                                  case 0xeb:Num=5;while(Key==0xeb);break;        //第一列第二行
  157.                                  case 0xed:Num=9;while(Key==0xed);break;       
  158.                                  case 0xee:Num=13;while(Key==0xee);break;
  159.                                  default:Num=0;break;
  160.                          }
  161.                         }
  162.                         Key=0xdf;  //第二列
  163.                         if(Key!=0xdf)
  164.                         {
  165.                          switch(Key)
  166.                          {
  167.                                  case 0xd7:Num=2;while(Key==0xd7);break;
  168.                                  case 0xdb:Num=6;while(Key==0xdb);break;
  169.                                  case 0xdd:Num=10;while(Key==0xdd);break;
  170.                                  case 0xde:Num=14;while(Key==0xde);break;
  171.                                  default:Num=0;break;
  172.                          }
  173.                   }
  174.                         Key=0xbf;        //第三列
  175.                         if(Key!=0xbf)
  176.                         {
  177.                          switch(Key)
  178.                          {
  179.                                  case 0xb7:Num=3;while(Key==0xb7);break;
  180.                                  case 0xbb:Num=7;while(Key==0xbb);break;
  181.                                  case 0xbd:Num=11;while(Key==0xbd);break;
  182.                                  case 0xbe:Num=15;while(Key==0xbe);break;
  183.                                  default:Num=0;break;
  184.                          }
  185.                   }
  186.                         Key=0x7f;  //第四列
  187.                         if(Key!=0x7f)
  188.                         {
  189.                          switch(Key)
  190.                          {
  191.                                  case 0x77:Num=4;while(Key==0x77);break;  //0111 0111
  192.                                  case 0x7b:Num=8;while(Key==0x7b);break;        //0111 1011
  193.                                  case 0x7d:Num=12;while(Key==0x7d);break; //0111 1101
  194.                                  case 0x7e:Num=16;while(Key==0x7e);break; //0111 1110
  195.                                  default:Num=0;break;
  196.                          }
  197.                   }
  198.                          
  199.                 }
  200.         }
  201. }
  202.   
  203. void Delayms(unsigned int z)                //@11.0592MHz
  204. {
  205.         unsigned char i, j;
  206.         for(;z>0;z--)
  207.         {
  208.                 _nop_();
  209.                 i = 2;
  210.                 j = 199;
  211.                 do
  212.                 {
  213.                         while (--j);
  214.                 } while (--i);
  215.         }
  216. }
復制代碼

所有資料51hei提供下載:
資料.rar (71.86 KB, 下載次數: 52)


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产精品久久久久久久久大全 | www.久久久久久久久久久 | 国产免费色 | 久久精品手机视频 | 日韩蜜桃视频 | 欧美xxxx色视频在线观看免费 | 国户精品久久久久久久久久久不卡 | 免费黄色录像视频 | 色网站在线免费观看 | 天天爱av | 91精品91久久久 | 欧美激情久久久 | 能看的av网站 | 国产精品小视频在线观看 | 成人免费视频网站在线看 | 国产精品久久久久久久三级 | 日韩在线观看 | 久久精品亚洲一区二区三区浴池 | 国产 日韩 欧美 制服 另类 | 精品一区二区在线观看 | 国产我和子的乱视频网站 | 欧美精品一区二区免费视频 | 久久精品国产99国产精品 | 第一福利社区1024 | 永久网站 | 日韩国产高清在线观看 | 精品欧美一区二区精品久久久 | 免费视频久久 | 日朝毛片 | 亚洲视频一区二区三区 | 全免费a级毛片免费看视频免费下 | 91视频大全| 国产在线网站 | 国产精品成人一区二区三区夜夜夜 | 三级黄片毛片 | 2022精品国偷自产免费观看 | 涩涩鲁亚洲精品一区二区 | 亚洲一区二区三区在线视频 | 天天操天天干天天曰 | 可以免费观看的av | 成人h电影在线观看 |