欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3942|回復: 0
收起左側

可預置十六位計數器 單片機程序+Proteus仿真圖

[復制鏈接]
ID:507788 發表于 2019-4-24 17:17 | 顯示全部樓層 |閱讀模式
可預置十六位計數器的效果如下:
初始界面:
0.png

單刀雙置開關SW1打到下面,左邊的LED燈亮,上下兩個按鈕開始工作,按下上面的按鈕顯示加1,按下下面的按鈕顯示減1

單刀雙置開關SW1打到上面,左邊的LED燈不亮,4×4 矩陣鍵盤 KEYBOARD開始工作,從左到右,從上到下分別為0到F(第一個為0)輸入是從左到右開始的,eg:要顯示16這個數值,先輸入1,2位共陰極數碼管右邊部分為0,左邊部分為1;再輸入6,2位共陰極數碼管右邊部分為1,左邊部分為6.
(代碼在附件中給出,格式為c語言代碼,由Keil4編譯運行)

單片機源程序如下:
  1. #include "at89x51.h"
  2. unsigned char low=0;  
  3. unsigned char high=0;
  4. unsigned char led_disp[] = {
  5.                                                         0x3f,0x06,0x5b,0x4f,
  6.                                                         0x66,0x6d,0x7d,0x07,
  7.                                                         0x7f,0x6f,0x77,0x7c,
  8.                                                         0x39,0x5e,0x79,0x71
  9.                                                 }; //0-f


  10. void delay_ms(unsigned int a)
  11. {
  12.         unsigned int i;
  13.         while(a--)
  14.         {
  15.                 i = 70;
  16.                 while(i--);
  17.         }
  18. }

  19. //反轉法

  20. unsigned char translate(unsigned char x)
  21. {
  22.         unsigned char y;
  23.         if(x==7)  //0111
  24.                 y=3;
  25.         else if(x==11)        //1011
  26.                 y=2;
  27.         else if(x==13)        //1101
  28.                 y=1;
  29.         else if(x==14)        //1110
  30.                 y=0;
  31.         return y;
  32. }

  33. unsigned char getKey(unsigned char *key)
  34. {
  35.         unsigned char r, c, t;
  36.         P3 = 0xf0; //列線置1,行線置0
  37.         if(P3 != 0xf0) //按鍵按下
  38.         {
  39.                 //消抖
  40.                 delay_ms(15);
  41.                 if(P3 != 0xf0)
  42.                 {
  43.                         t = P3;
  44.                         //取列號
  45.                         c = (t & 0xf0) >> 4;
  46.                         c = translate(c);
  47.                         //將列值輸出,行線置1
  48.                         P3 = t | 0x0f;
  49.                         //取行號
  50.                         r = (P3 & 0x0f);
  51.                         r = translate(r);
  52.                         *key = r*4+c;

  53.                         //等待按鍵放開
  54.                         P3 = 0xf0;
  55.                         while(P3 != 0xf0);
  56.                         return 1;
  57.                 }
  58.         }
  59.         return 0;
  60. }

  61. void dispHigh(unsigned char v)
  62. {
  63.                 P2=0;
  64.                 P1_7 = 1;
  65.                 P1_6 = 0;
  66.                 P2 = led_disp[v];
  67.                 delay_ms(5);
  68. }
  69. void dispLow(unsigned char v)
  70. {
  71.                 P2=0;
  72.                 P1_6 = 1;
  73.                 P1_7 = 0;
  74.                 P2 = led_disp[v];
  75.                 delay_ms(5);
  76. }

  77. void main(void)
  78. {
  79.         unsigned char k;
  80.         //P2 = 0;//預置
  81.         if(P1_5==1)
  82.         {
  83.                 P2=0;
  84.                 P1_4=1;//左邊的LED不亮,鍵盤計數
  85.                 while(1){
  86.                         if(getKey(&k))
  87.                         {
  88.                                 high= low;
  89.                                 low = k;//低位置數
  90.                         }
  91.                         dispLow(low);//低位顯示
  92.                         dispHigh(high);
  93.                         if(P1_5==0)
  94.                                 break;                               
  95.                 }                       
  96.         }


  97.         if(P1_5==0)
  98.         {
  99.                 P2=0;
  100.                 P1_4=0;//左邊的LED亮,加減計數
  101.                 while(1)
  102.                 {
  103.                         delay_ms(15);
  104.                         if(P1_0==0)
  105.                         {
  106.                                 delay_ms(300);
  107.                                 low++;
  108.                                 if(low==16)
  109.                                 {
  110.                                         low=0;
  111.                                         high++;
  112.                                         if(high==16)
  113.                                         {
  114.                                                 low=0;
  115.                                                 high=0;
  116.                                         }
  117.                                 }
  118.                         }
  119.                         else if(P1_1==0)
  120.                         {
  121.                                 delay_ms(300);
  122.                                 low--;
  123.                                 if(low==-1)
  124. ……………………

  125. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
0.png

所有資料51hei提供下載:
可預置十六位計數器.zip (223.04 KB, 下載次數: 41)


評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表