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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機按鍵顯示程序,求大佬指導或者改一改

[復制鏈接]
跳轉到指定樓層
樓主
ID:629063 發表于 2019-11-19 22:44 來自手機 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
求大佬改一下,下面這個程序只能實現按下按鍵從0到100和100到0的切換而不能任意切換,比如按下K3數碼管顯示從0增到100,在中途按下K4會變換到100減到0,不能實現在增到的那個數降到0,也不能實現在降的時候按下K3從降到的這個數增到100的這種任意切換,怎么改,求大佬指導

單片機源程序如下:
#include "reg52.h"

sbit k3=P3^2;

sbit k4=P3^3;

unsigned char table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

void delay(unsigned int i)

{        

    while(i--);

}

void digui(unsigned int i)

{



        P0=table[(i%10)];

        P2=0x00;

        delay(500);

        if(i>9)

        {

                P0=table[(i/10%10)];

                P2=0x04;

                delay(100);

                if(i>99)

                {

                        P0=table[(i/100)];

                        P2=        0x08;

                        delay(100);

                }

        }

}

void main()

{

        unsigned int i,j;

        k3=1;

        while(1)

        {

                if(k3==0)

                {delay(100);

                 if(k3==1)

                        {

                           for(i=0;i<101;i++)

                           { if(k4==0)

                                        break;

                                 if(k3==0)

                                           break;

                                   for(j=0;j<50;j++)

                                        {

                                                   digui(i);

                                                if(i==100&&j==49)

                                                j=0;        

                                                if(k4==0)

                                                break;

                                           if(k3==0)

                                                   break;

                                   }

                           }

                        }

                }

                else if(k4==0)

                        {delay(100);

                          if(k4==1)

                         {

                           for(i=100;i>=0;i--)

                                {

                                if(k3==0)

                                        break;

                                if(k4==0)

                                        break;

                                   for(j=0;j<50;j++)

                                        {

                                                   digui(i);

                                                if(i==0&&j==49)

                                                j=0;

                                                if(k3==0)

                                                   break;

                                                if(k4==0)

                                                break;

                                   }

                                }

                         }

                }

        }

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

使用道具 舉報

沙發
ID:584814 發表于 2019-11-20 08:09 | 只看該作者
for(i=0;i<101;i++)
for(i=100;i>=0;i--)
問題在兩個開關動作時,對 I 都進行了初始化。
回復

使用道具 舉報

板凳
ID:213173 發表于 2019-11-20 10:28 | 只看該作者

  1. #include "reg52.h"

  2. sbit k3=P3^2;
  3. sbit k4=P3^3;

  4. unsigned char table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
  5. unsigned char i=0,j=0,k=0;
  6. unsigned char num1,num2;//消抖計數變量
  7. /*
  8. void delay(unsigned int i)
  9. {        
  10.     while(i--);
  11. }
  12. */
  13. void digui()
  14. {
  15.         j++;//延時計數
  16.         if(j>=250)
  17.         {
  18.                 j=0;
  19.                 P0=0x00;//消隱
  20.                 if(k==0)
  21.                 {
  22.                         P2=0x02;                        //送位碼
  23.                         P0=table[i%10];//送段碼
  24.                         k=1;
  25.                 }
  26.                 else if(k==1)
  27.                 {
  28.                         P2=0x04;
  29.                         P0=table[i/10%10];
  30.                         k=2;
  31.                 }
  32.                 else if(k==2)
  33.                 {
  34.                         P2=0x08;
  35.                         P0=table[i/100%10];
  36.                         k=0;
  37.                 }
  38.         }
  39. }
  40. void main()
  41. {
  42.         while(1)
  43.         {
  44.                 if(k3==0)//按下
  45.                 {
  46.                         num1++;//消抖計數
  47.                         if(num1>100)
  48.                                 num1=101;//防止溢出
  49.                         if(num1==100)
  50.                         {
  51.                                 if(i<100)
  52.                                         i++;
  53.                         }
  54.                 }
  55.                 else num1=0;//松手清0

  56.                 if(k4==0)
  57.                 {
  58.                         num2++;
  59.                         if(num2>100)
  60.                                 num2=101;
  61.                         if(num2==100)
  62.                         {
  63.                                 if(i>0)
  64.                                         i--;
  65.                         }
  66.                 }
  67.                 else num2=0;

  68.                 digui();//數碼管顯示程序
  69.         }
  70. }
復制代碼



回復

使用道具 舉報

地板
ID:629063 發表于 2019-11-20 13:00 來自手機 | 只看該作者
wulin 發表于 2019-11-20 10:28

感謝,但是這個應該是按一下加一下按一下減一下的吧,我需要做的是它按一下自增自減的,在增的時候按另一個鍵又從增到的這個數自減下來,能不能指導一下
回復

使用道具 舉報

5#
ID:629063 發表于 2019-11-20 13:12 來自手機 | 只看該作者
man1234567 發表于 2019-11-20 08:09
for(i=0;i=0;i--)
問題在兩個開關動作時,對 I 都進行了初始化。

你好,對兩個I進行了初始化是實現了0到100和100到0的任意切換對吧,如果我的for(i=100;i<=0;i--)里面的100改成50之后,那按下k4就是從50自減下來對吧,那么我要實現一個任意數都能自減下來,而且最開始不影響它從100到0的自減呢?定義一個變量嗎?但是我不知道定義這個變量怎么用啊,求指導一下。感謝
回復

使用道具 舉報

6#
ID:213173 發表于 2019-11-20 17:56 | 只看該作者
985387431 發表于 2019-11-20 13:00
感謝,但是這個應該是按一下加一下按一下減一下的吧,我需要做的是它按一下自增自減的,在增的時候按另一 ...

按一下自增或自減,這個很好改的。
  1. #include "reg52.h"

  2. sbit k3=P3^2;
  3. sbit k4=P3^3;

  4. unsigned char table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
  5. unsigned char i=50,j=0,k=0,l=0;
  6. unsigned char num=0;
  7. unsigned int h=0;
  8. /*
  9. void delay(unsigned int i)
  10. {        
  11.     while(i--);
  12. }
  13. */
  14. void keyscan()//按鍵掃描       
  15. {
  16.         if(k3==0)//按下
  17.         {
  18.                 l=1;
  19.         }
  20.         if(k4==0)
  21.         {
  22.                 l=2;
  23.         }
  24. }
  25. void counter()//計數器
  26. {
  27.         h++;
  28.         if(h>=10000)
  29.         {
  30.                 h=0;
  31.                 if(l==1)
  32.                 {
  33.                         if(i<100)
  34.                                 i++;
  35.                 }
  36.                 if(l==2)
  37.                 {
  38.                         if(i>0)
  39.                                 i--;
  40.                 }
  41.         }
  42. }
  43. void digui()
  44. {
  45.         j++;//延時計數
  46.         if(j>=250)
  47.         {
  48.                 j=0;
  49.                 P0=0x00;//消隱
  50.                 if(k==0)
  51.                 {
  52.                         P2=0x02;                        //送位碼
  53.                         P0=table[i%10];//送段碼
  54.                         k=1;
  55.                 }
  56.                 else if(k==1)
  57.                 {
  58.                         P2=0x04;
  59.                         P0=table[i/10%10];
  60.                         k=2;
  61.                 }
  62.                 else if(k==2)
  63.                 {
  64.                         P2=0x08;
  65.                         P0=table[i/100%10];
  66.                         k=0;
  67.                 }
  68.         }
  69. }

  70. void main()
  71. {
  72.         while(1)
  73.         {
  74.                 keyscan();//按鍵掃描
  75.                 counter();//計數
  76.                 digui();//數碼管顯示程序
  77.         }
  78. }
復制代碼
回復

使用道具 舉報

7#
ID:629063 發表于 2019-11-21 15:50 來自手機 | 只看該作者
wulin 發表于 2019-11-20 17:56
按一下自增或自減,這個很好改的。

能不能解釋一下 void counter里面的語句是什么意思呀,它是一個計數器,為什么要一直加到h>=10000呢 而且如果沒到一百怎樣才能把百位的0給去掉呢,求指導
回復

使用道具 舉報

8#
ID:213173 發表于 2019-11-21 21:24 | 只看該作者
985387431 發表于 2019-11-21 15:50
能不能解釋一下 void counter里面的語句是什么意思呀,它是一個計數器,為什么要一直加到h>=10000呢 而且 ...

樓主參見改寫后的注釋
  1. #include "reg52.h"

  2. sbit k3=P3^2;
  3. sbit k4=P3^3;

  4. unsigned char table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
  5. unsigned char i=50,j=0,k=0,l=0;
  6. unsigned char num=0;
  7. unsigned int h=0;
  8. /*
  9. void delay(unsigned int i)
  10. {        
  11.     while(i--);
  12. }
  13. */
  14. void keyscan()//按鍵掃描        
  15. {
  16.         if(k3==0)//按下
  17.         {
  18.                 l=1;
  19.         }
  20.         if(k4==0)
  21.         {
  22.                 l=2;
  23.         }
  24. }
  25. void counter()//計數器
  26. {
  27.         h++;
  28.         if(h>=10000)//計數延時,1秒約增減3個數
  29.         {
  30.                 h=0;
  31.                 if(l==1)
  32.                 {
  33.                         if(i<100)
  34.                         i++;
  35.                 }
  36.                 if(l==2)
  37.                 {
  38.                         if(i>0)
  39.                         i--;
  40.                 }
  41.         }
  42. }
  43. void digui()
  44. {
  45.         j++;//延時計數
  46.         if(j>=200)//約6ms刷新一次數碼管
  47.         {
  48.                 j=0;
  49.                 P0=0x00;//消隱
  50.                 if(k==0)
  51.                 {
  52.                         P2=0x02;      //送位碼
  53.                         P0=table[i%10];//送段碼
  54.                         k=1;
  55.                 }
  56.                 else if(k==1)
  57.                 {
  58.                         P2=0x04;
  59.                         if(i<10)
  60.                                 P0=0x00;//不顯示
  61.                         else P0=table[i/10%10];
  62.                         k=2;
  63.                 }
  64.                 else if(k==2)
  65.                 {
  66.                         P2=0x08;
  67.                         if(i<100)
  68.                                 P0=0x00;//不顯示
  69.                         else P0=table[i/100%10];
  70.                         k=0;
  71.                 }
  72.         }
  73. }

  74. void main()
  75. {
  76.         while(1)//主循環周期30多微秒
  77.         {
  78.                 keyscan();//按鍵掃描
  79.                 counter();//計數
  80.                 digui();//數碼管顯示程序
  81.         }
  82. }
復制代碼
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产精品激情在线 | 亚洲国产精品成人综合久久久 | 欧美日韩一区二区三区不卡视频 | 91网站在线看 | 五月婷婷 六月丁香 | 欧美综合久久久 | 久久aⅴ乱码一区二区三区 亚洲国产成人精品久久久国产成人一区 | 日韩影院在线观看 | 色偷偷人人澡人人爽人人模 | 欧美久久久久久久 | 国产成人精品久久 | 国产激情91久久精品导航 | 亚洲国产精品一区二区三区 | 欧美日韩一区二区在线播放 | 在线欧美亚洲 | 91影院在线观看 | 精品一区二区三区91 | 国产视频二区在线观看 | 欧美日韩一本 | 亚洲人在线观看视频 | 在线视频 亚洲 | 国产精品成人品 | 免费黄网站在线观看 | 99精品视频免费观看 | 欧美日韩高清免费 | 免费久久网| 午夜一区二区三区 | 黄色毛片在线观看 | 一区二区三区久久久 | 欧美乱码精品一区二区三区 | 人人玩人人添人人澡欧美 | 密室大逃脱第六季大神版在线观看 | 亚洲综合视频 | 国产精品大全 | 欧美一级片久久 | 精品欧美一区二区精品久久 | 9999久久 | 亚洲不卡视频 | 成人三级视频 | 亚洲成人久久久 | 日韩成人在线播放 |