找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3797|回复: 9
打印 上一主题 下一主题
收起左侧

单片机程序问题 按一下显示加一

[复制链接]
跳转到指定楼层
楼主
为什么程序不能运行1,按一下显示加一呢??



#include<reg52.h>
char tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
sbit y=P3^3;
int num=0;
int ge=0;
int shi=0;
void delay(){
        int i,j=0;
        for(i=1000;i<0;i--)
                for(;j<100;j++);
                        }
main(){
        while(1){
        if(y==0)
        delay();
        if(y==0)
         num++;
          if(num==100) num=0;
                ge=num%10;
                shi=num/10;
                P1=tab[ge];
                P2=0x01;
                delay();
                P1=0xff;
                P1=tab[shi];
                P2=0x02;
                delay();
                P1=0xff;
                while(y==0);        
          }
}





1.jpg (133.04 KB, 下载次数: 96)

1.jpg
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:245521 发表于 2017-11-28 21:13 | 只看该作者
请问是哪里出问题了呢?
回复

使用道具 举报

板凳
ID:164602 发表于 2017-11-29 08:54 | 只看该作者
我运行了你的程序。
你的程序问题,在按键消抖上。
按键的抖动,时间至少10ms,你的消抖延时,只有0.15ms左右,不能确实消抖,所以按一次会加很多。
我这里有一个延时10ms的程序,你试试看。
void Delay10ms(uc c)
{
    unsigned char a,b;
    for(c;c>0;c--)
                for(b=44;b>0;b--)
                        for (a=112;a>0;a--);
}
回复

使用道具 举报

地板
ID:255045 发表于 2017-11-29 11:20 | 只看该作者
Afan的单片机 发表于 2017-11-28 21:13
请问是哪里出问题了呢?

给楼主提个建议,将按键扫描和动态显示分别做一个模块,  #include<reg51.h>   #define uchar unsigned char   sbit com1=P1^0;   sbit com2=P1^1;   sbit key=P3^0;         sbit key2=P3^1;         bit keyflag2;   bit keyflag;   char counter=0;   uchar code seg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共阳极                  //**********延时10ms*********//   void delay()   {                 uchar i,j=10;                 while(j--)                 {                         for(i=120;i>0;i--);                 }         }                                   //**********数码管动态扫描*********//   void display(void)   {                  P1=0xfd;                  P0=seg[counter/10];                  delay();                             P1=0xfe;            P0=seg[counter%10];                  delay();           }                  //***********按键扫描*********//         void keyread(void)         {           if(!key)                 {                                 if(keyflag==0)                                 {                              delay();                                          if(!key)                                    {                                                 keyflag=1;                                           counter++;                                           if(counter==100)                                                 counter=0;                                   }                           }                         }                         else                                 keyflag=0; }  void main(void) {          for(   ;    ;   )         {          keyread();          display();         } } }
回复

使用道具 举报

5#
ID:255045 发表于 2017-11-29 12:20 | 只看该作者
Afan的单片机 发表于 2017-11-28 21:13
请问是哪里出问题了呢?

给楼主提个建议,将按键扫描和动态显示分别做一个模块。采用分时的方法,在键盘扫描中定义一个标志位keyflag,当按键按下按下时,keyflag=1;按键弹起来时,keyflag置1,这样就检测标志位就不用一行一行的扫描键盘,消耗cpu的时间,同时也避免了按键扫描和动态显示之间的时间冲突,比如,按一下按键,数码管会闪一下。一个小段程序可能体现不出来,但如果是一个大型复杂的程序,问题就非常重要了,所以分时的思想在单片机中非常重要。当然也可以用中断解决,但是单片机中断源有限,能节约硬件资源就节约一下吧。
标志位的状态,如果不清楚的话,可以自己写一下,就会明白了。
  #include<reg51.h>
  #define uchar unsigned char
  sbit key=P3^3;
  bit keyflag;
  char counter=0;
  uchar code seg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
       
        //***********延时10ms*********//
  void delay()
  {
        uchar i,j=10;
        while(j--)
      {
           for(i=120;i>0;i--);
      }
   }
       
                  
  
  //**********动态扫描*********//
  void display(void)
  {
        P2=0xfd;
        P1=seg[counter/10];
        delay();
               
        P2=0xfe;
        P1=seg[counter%10];
        delay();       
  }
       
//***********按键扫描*********//
  void keyread(void)
  {
        if(!key)
      {
                               
          if(keyflag==0)//按键标志位
                               
         {
              delay();
              if(!key)
            {
                 keyflag=1;
                 counter++;
                 if(counter==100)//计满100,清0
                 counter=0;
             }
          }               
      }
        else
              keyflag=0;
  }
                       
               

    void main(void)
  {
      while( 1 )
      {
          keyread();
          display();
      }  
  }  
               
回复

使用道具 举报

6#
ID:255045 发表于 2017-11-29 12:25 | 只看该作者
廖宇航 发表于 2017-11-29 11:20
给楼主提个建议,将按键扫描和动态显示分别做一个模块,  #include   #define uchar unsigned char   sbi ...

不知道怎么回事,发表主题后格式乱了,楼主只有自己复制一下,自己排一下版了
回复

使用道具 举报

7#
ID:255156 发表于 2017-11-29 13:58 | 只看该作者
廖宇航 发表于 2017-11-29 12:25
不知道怎么回事,发表主题后格式乱了,楼主只有自己复制一下,自己排一下版了

标志位keyFlag在程序中没体现出来
回复

使用道具 举报

8#
ID:245521 发表于 2017-11-29 17:52 来自手机 | 只看该作者
HC6800-ES-V2.0 发表于 2017-11-29 08:54
我运行了你的程序。
你的程序问题,在按键消抖上。
按键的抖动,时间至少10ms,你的消抖延时,只有0.15ms ...

谢谢!原来是软件消抖的问题啊
回复

使用道具 举报

9#
ID:245521 发表于 2017-11-29 17:53 来自手机 | 只看该作者
J木昜 发表于 2017-11-29 13:58
标志位keyFlag在程序中没体现出来

是的!看不懂呢
回复

使用道具 举报

10#
ID:245521 发表于 2017-11-29 19:13 | 只看该作者
HC6800-ES-V2.0 发表于 2017-11-29 08:54
我运行了你的程序。
你的程序问题,在按键消抖上。
按键的抖动,时间至少10ms,你的消抖延时,只有0.15ms ...

100*1000比你的44*112大啊但是。。。。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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