这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » 按键控制数码管

共11条 1/2 1 2 跳转至

按键控制数码管

菜鸟
2011-05-16 12:37:23     打赏
//功能:多功能按键控制数码管抽奖器,第一次按下SB1数字能加减;第二次按下
//      按下SB2数字闪烁,当按下SB3是数字开始从0000开始跑按下SB4停下
#include<reg51.h>
#define  uchar  unsigned  char
char  number[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
char  number1[4]={0,0,0,0};
char   h=0,l=0;
sbit  SB4=P3^3;  //停止键
sbit  SB3=P3^4;  //数字减
sbit  SB2=P3^5;  //数字加
sbit  SB1=P3^6;  //功能切换键
sbit  FM5=P3^7;// 蜂鸣器
void  delay(int  b) 
   {
     int  a,c;             /*特殊钟延时子程序*/
     for(a=832;a>0;a--)
        for(c=b;c>0;c--);
   }
/**********************************************************************/
int   smiao()
{
   uchar  c,f,g=0x01;
   number1[0]=h/10;     //显示高十位
   number1[1]=h%10;     //显示高个位
   number1[2]=l/10;    //显示低十位
   number1[3]=l%10;   //显示低个位
    for(c=0;c<4;c++)
    {
      P1=g;    //位选
      P2=number[number1[c]]; //段选
   for(f=0;f<200;f++);    //简短的延时
   g=g<<1; //左移为了扫描位选
    }
 
}
/***************************************************************/
int   fengming()
{
  uchar q;
   for(q=0;q<3;q++)    //蜂鸣器函数
   { FM5=0;
    delay(10);
  FM5=1;
  delay(10);
 }      
}
/***********************************************************************/
  main()
{
  char  b=0,q,t=0;
  SB1=SB2=SB3=SB4=1;   //按键初始化
   while(1)
   {
     smiao();
    if(SB1==0)     //判断SB1是否按下
    {  for(q=0;q<50;q++); //去抖
   if(SB1==0)
    {
     b=b+1;
   if(b>=3) b=0;
    }
   }
/***********************************************************/   
          if(b==1)
     {  //while(b==1)
       {
      if(SB2==0) //如果SB3等于0
         {
      for(q=0;q<125;q++); //去抖
      if(SB2==0)
       { smiao();
           //while(SB2==0) smiao();
         l=l+1;      //高位加一
            if(l==100)
           {
          h=h+1; l=0;
       if(h>99) h=0;
         } //如果高位等于30再从0开始
        
               }  
      }
        if(SB3==0)
       {   for(q=0;q<125;q++);
         if(SB3==0)
         {
           smiao();
          // while(SB3==0)smiao(); //数码管扫描函数
        l=l-1;
        if(l<=0)
         {
           l=0;
        h=h-1;
        if(h<=0) h=0;
          }
          }
         }
        
          //smiao(); //数码管扫描函数
         }
     
       
       }
/************************************************************/
    if(b==2)      //当b=2时蜂鸣器报警数码管闪烁    
     {
       for(t=0;t<3;t++)
       {                                         个位师傅帮忙看看这段程序为什么一下
      delay(60);                    SB1程序就执行-----b=2时蜂鸣器报警数码      smiao();                                         闪烁
      FM5=0;                             
            smiao();                     为什么不执行数码管加减啊帮忙改一下谢谢师傅了

      delay(10);        
      FM5=1;
      b=0;
      smiao();
     }  
     }  
      
   }
 }



关键词: 按键     控制     数码     smiao    

专家
2011-05-16 12:48:52     打赏
2楼
给你看看啊

专家
2011-05-16 13:04:30     打赏
3楼
你的程序是有问题的,你的延时太短了!

if(SB1==0)     //判断SB1是否按下
    {  for(q=0;q<50;q++); //去抖
这个时间太短,假设你按的按键的时间是10ms的话,那么他有可以连续的采集两次的,那么b的值就是2了,所以它能蜂鸣器响,但是数码管的数值不变!

高工
2011-05-17 11:10:33     打赏
4楼
楼主看到回复了吧?一并谢谢热心的halibote

菜鸟
2011-05-17 18:56:39     打赏
5楼
非常感谢两位了!呵呵!搞定了!

助工
2011-05-18 14:07:46     打赏
6楼
学习了

菜鸟
2011-06-18 17:29:03     打赏
7楼
刚好我最近也是做这个,先学习了,我在程序里求余遇到麻烦了,不知道怎么搞定,我想把脉冲数显示在数码管上

菜鸟
2011-06-18 17:46:27     打赏
8楼

学习了哦


菜鸟
2011-06-25 19:02:49     打赏
9楼
学习一下

菜鸟
2011-06-26 00:53:27     打赏
10楼

谢谢。不错,个人觉得还行吧


共11条 1/2 1 2 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]