找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1813|回复: 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;

                                   }

                                }

                         }

                }

        }

}
回复

使用道具 举报

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 | 显示全部楼层
无标题.jpg
  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

感谢,但是这个应该是按一下加一下按一下减一下的吧,我需要做的是它按一下自增自减的,在增的时候按另一个键又从增到的这个数自减下来,能不能指导一下
回复

使用道具 举报

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的自减呢?定义一个变量吗?但是我不知道定义这个变量怎么用啊,求指导一下。感谢
回复

使用道具 举报

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. }
复制代码
回复

使用道具 举报

ID:629063 发表于 2019-11-21 15:50 来自手机 | 显示全部楼层
wulin 发表于 2019-11-20 17:56
按一下自增或自减,这个很好改的。

能不能解释一下 void counter里面的语句是什么意思呀,它是一个计数器,为什么要一直加到h>=10000呢 而且如果没到一百怎样才能把百位的0给去掉呢,求指导
回复

使用道具 举报

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 单片机教程网

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