打印

谁有四按键数码管显示的电子时钟,求学习

[复制链接]
2088|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
frank_1019|  楼主 | 2013-9-10 15:24 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
6个数码管;
实现调整、加、减、支持长按、短按,
4个按键:调整按键按1下,调时,以1HZ闪烁;再按下时正常显示,分以1HZ闪烁。。。。直到确定按键按下,正常显示。
加、减长按则以一定的频率加或减,短按则加或减1。

STC89c52实现,不用液晶,不用计时芯片,只用定时T0.

新手,勿喷,写了个程序运行不出来,想请教看看已做好的程序,不要太高深。

相关帖子

沙发
frank_1019|  楼主 | 2013-9-10 15:25 | 只看该作者
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit tiao=P3^4;
sbit jia=P3^5;
sbit jian=P3^6;
sbit sure=P3^7;

uchar num=3;//调整的按键按下的次数,取num=3是为了方便后续使用num%3进行判断

sbit wela=P2^7;
sbit dula=P2^6;

// uchar flag0=0; //flag0=1时,1HZ闪烁
uchar flag1=0; //flag0=1的前提下:若flag1=0时,亮;flag1=1时,灭
uchar flag2=0;//flag2=1时,调整时
uchar flag3=0;//flag3=1时,调整分
uchar flag4=0;//flag4=1时,调整秒
uchar cd=0;  //定义一个长按或短按的标识位,cd=0,短按

uchar miao,fen,shi;//时分秒

uchar shanshuo=0;//用于闪烁,shanshuo=10时,为1HZ
uchar jishi=0; //用于数码管显示计时,jishi=20时为1s

uchar code duan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
uchar code wei[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};

void delay(uchar k)                 //数码管动态显示的延时函数
{
   uchar i,j;
   for(i=k;i>0;i--)
      for(j=110;j>0;j--);
}

void T0_init()        //定时50ms初始化
{
   TMOD=0x01;
   EA=1;
   ET0=1;
   TH0=(65535-50000)/256;
   TL0=(65535-50000)%256;
   TR0=1;
}

void T0_ser() interrupt 1   //定时1s中断服务程序
{
        TH0=(65535-50000)/256;
    TL0=(65535-50000)%256;
        jishi++;
        if(jishi==20)
        {
           jishi=0;
           miao++;
           if(miao==60)
            {  
                  miao=0;
                  fen++;
                }
           if(fen==60)
            {
                  fen=0;
                  shi++;
                }
           if(shi==24)
              shi=0;
        }

        shanshuo++;                  //用于闪烁
        if(shanshuo==10)
        flag1=~flag1;           //1HZ闪烁
}

void display_miao() //显示秒
{
   wela=1;  P0=wei[0];        wela=0;
   dula=1;  P0=duan[miao%10];  dula=0;
   delay(1);

   wela=1;  P0=wei[1];        wela=0;
   dula=1;  P0=duan[miao/10];  dula=0;
   delay(1);
}

void display_fen()        //显示分
{
   wela=1;  P0=wei[2];        wela=0;
   dula=1;  P0=duan[fen%10];  dula=0;
   delay(1);

   wela=1;  P0=wei[3];        wela=0;
   dula=1;  P0=duan[fen/10];  dula=0;
   delay(1);
}

void display_shi()                //显示时
{
   wela=1;  P0=wei[4];        wela=0;
   dula=1;  P0=duan[shi%10];  dula=0;
   delay(1);

   wela=1;  P0=wei[5];        wela=0;
   dula=1;  P0=duan[shi/10];  dula=0;
   delay(1);
}




void display_mie() //灭
{
   wela=1;   P0=0x00;  wela=0;
   dula=1;   P0=0x40;  dula=0;
   delay(5);
}



void tiaozheng() //时间调整
{
        if(tiao==0)
        {
          delay(5);
          if(tiao==0)
           {
            num++;
        if(num%3==1)         //调整按键按下的次数对3取余,为1表示调整时
                   {
                   flag4=0;
                   flag2=1;
                   }
                else
                   flag2=0;
           }
                while(tiao==0); //等待按键释放

                if(flag2==1) //此时调整时,时闪烁
                {
                   if(tiao==0)
                   delay(5);
                   if(tiao==0)           //分调整
                   {
                             num++;
                          if(num%3==2)
                            {
                                flag2=0;
                                flag3=1;
                                }
                          else
                            flag3=0;
                   }
           while(tiao==0);
                  
                   if(flag3==1)          //秒调整
                   {
                            delay(5);
                         if(tiao==0)
                         {
                                 num++;
                                if(num%3==0)
                                {
                                   flag4=1;
                                   flag3=0;
                                }
                                else
                                   flag4=0;
                         }
                         while(tiao==0);
                   }

                }
        }
        if(sure==0)
        {
                delay(5);
                if(sure==0)
                 {
                  display_shi();
                  display_fen();
                  display_miao();
                 }
        }
}

void tiao_shi()
{
        while(flag2==1)  //时闪烁
        {
                while(flag1==1)
                   display_mie();
                while(flag1==0)
                   display_shi();
                 
                 if(jia==0)        //加键按下
                 {
                   delay(5);
                   if(jia==0)
                      cd=0;              //短按
                   delay(100);
                   if(jia==0)
                      cd=1;     //长按
                 }         
                 
                 if(cd==0)                   //短按则加1次
                 {
                         shi++;
                        if(shi==24)
                             shi=0;
                 }
                 if(cd==1)                        //长按则一直加
                 {
                         while(jia==0)
                        {
                         shi++;
                         if(shi==24)
                            shi=0;
                        }
                 }
        }
}

void tiao_fen()
{
        while(flag3==1)  //分闪烁
        {
                while(flag1==1)
                   display_mie();
                while(flag1==0)
                   display_fen();
                 
                 if(jia==0)        //加键按下
                 {
                   delay(5);
                   if(jia==0)
                      cd=0;              //短按
                   delay(100);
                   if(jia==0)
                      cd=1;     //长按
                 }         
                 
                 if(cd==0)                   //短按则加1次
                 {
                         fen++;
                        if(fen==60)
                             fen=0;
                 }
                 if(cd==1)                        //长按则一直加
                 {
                         while(jia==0)
                        {
                         fen++;
                         if(fen==60)
                            fen=0;
                        }
                 }
        }
}


void tiao_miao()
{
        while(flag4==1)  //秒闪烁
        {
                while(flag1==1)
                   display_mie();
                while(flag1==0)
                   display_miao();
                 
                 if(jia==0)        //加键按下
                 {
                   delay(5);
                   if(jia==0)
                      cd=0;              //短按
                   delay(100);
                   if(jia==0)
                      cd=1;     //长按
                 }         
                 
                 if(cd==0)                   //短按则加1次
                 {
                         miao++;
                        if(miao==60)
                             miao=0;
                 }
                 if(cd==1)                        //长按则一直加
                 {
                         while(jia==0)
                        {
                         miao++;
                         if(miao==60)
                            miao=0;
                        }
                 }
        }
}



void main()
{
          while(1)
          {
          T0_init();
          display_shi();
          display_fen();
          display_miao();
          tiaozheng();
          tiao_shi();
          tiao_fen();
          tiao_miao();
          }
}
这是自己写的程序,还没写减按键,已经运行不出来了,所以请教各位以前编程的案例

使用特权

评论回复
板凳
dirtwillfly| | 2013-9-10 19:09 | 只看该作者
好长的程序

使用特权

评论回复
地板
NE5532| | 2013-9-11 13:03 | 只看该作者
不喷你,只拍你,请看《程序调试黑宝书》检查自己犯了什么错。

使用特权

评论回复
5
frank_1019|  楼主 | 2013-9-11 18:26 | 只看该作者
NE5532 发表于 2013-9-11 13:03
不喷你,只拍你,请看《程序调试黑宝书》检查自己犯了什么错。

额。。。这么严重啊。。。
这书名听起来好霸气,看看

使用特权

评论回复
6
stronger100| | 2013-9-11 18:56 | 只看该作者
虽然有错误,至少有一定的基础了,本人是个菜鸟,自学电脑原理的时候看了一下书中汇编语言实例,看不明白,没有汇编语言的书。看能不能在网上找到汇编语言的视频学习下。

使用特权

评论回复
7
frank_1019|  楼主 | 2013-9-12 08:56 | 只看该作者
stronger100 发表于 2013-9-11 18:56
虽然有错误,至少有一定的基础了,本人是个菜鸟,自学电脑原理的时候看了一下书中汇编语言实例,看不明白, ...

谢谢,其实我也是菜鸟。以后想向着电子方向发展,发现还有好多东西没学过。。。

现在不是基本都用C了吗?汇编看得懂就行,不需要用来编程吧

使用特权

评论回复
8
食肉狼| | 2013-9-12 09:19 | 只看该作者
电子行业发展没前途,如果有别的路,请尽量不要走上电子这一行业

使用特权

评论回复
9
273939700| | 2013-9-12 10:17 | 只看该作者
8楼 这么说也不好的  人总要学习  不然就像冠稀兄那样悲剧了

使用特权

评论回复
10
学海无涯2013| | 2013-9-22 10:30 | 只看该作者
/*                                                        
                                    
  p3.2设置键,p3.4调整加,p3.5调整减.
*/
#include<reg52.h>
#define uchar unsigned char
#define uint  unsigned int
sbit l1=P2^1;
sbit l2=P2^2;
sbit l3=P2^3;
sbit l4=P2^4;
//sbit l5=P2^5;
//sbit l6=P2^6;
sbit keyset=P2^5;
sbit keyup=P2^6;
sbit keydown=P2^7;
sbit sled=P2^0;
bit flash=0;
uchar hs,hg,ms,mg,ss,sg,a;
uchar h,m,s,num;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f
};
void init()//初始化程序
{        
        
        P3=0xff;
        num=0;
        h=0;
        m=0;
        s=0;
        EA=1;
        ET0=1;
        ET1=1;
        TMOD=0x11;
        TH0=0x3c;
        TL0=0xb0;
        TH1=0x3c;
        TL1=0xb0;        
        TR0=1;
        TR1=1;

        
}
void delay(uchar z)//延时程序
{
        uchar x,y;
                for(x=z;x>0;x--)
                        for(y=125;y>0;y--);
}

void display()//显示程序
{        

        
        hs=h/10;
        hg=h%10;
        ms=m/10;
        mg=m%10;
        if(a==1&flash==1)
                {
                        l1=1;
                        delay(5);
                }
        else
        {
                l1=0;
                P0=table[hs];
            delay(5);
                l1=1;
                P0=0xff;
        }
        
        if(a==1&flash==1)
                {
                        l2=1;
                        delay(5);
                }
        else
        {
                l2=0;
                P0=table[hg];
                delay(5);
                l2=1;
                P0=0xff;
        }
        
        if(a==2&flash==1)
        {
                l3=1;
                delay(5);
        }
        else
        {
        l3=0;
        P0=table[ms];
        delay(5);
        l3=1;
        P0=0xff;
        }
        
        if(a==2&flash==1)
        {
                l4=1;
                delay(5);
        }
        else
        {
                l4=0;
            P0=table[mg];
                delay(5);
                l4=1;
                P0=0xff;
        }

        if(flash==1&a==0)
                sled=0;
        else
                sled=1;
}

void secdisp()//单独显示秒程序
{
        if(a==3)
        {
                l1=1;
                l2=1;
                ss=s/10;
                sg=s%10;
               
                if(flash==1)
                        {
                                l3=1;
                                delay(3);
                                l4=1;
                                delay(3);
                        }
                else
                {
                        l3=0;
                        P0=table[ss];
                        delay(5);
                        l3=1;
                        P0=0xff;
                        
                        l4=0;
                        P0=table[sg];
                        delay(5);
                        l4=1;
                        P0=0xff;
                }
         }
}         
        

        
        
                 


void exter() interrupt 1//定时器0中断
        {
        TH0=0x3c;
        TL0=0xb0;        
        num++;
        if(num==20)
{
                num=0;
                s++;
                if(s==60)
                {
                  
                s=0;
                m++;
                }

                if(m==60)
                {
                m=0;
                h++;
                }
               
                if(h==60)
                {
                h=0;
                }
                }        
}

void exter1() interrupt 3//定时器1中断
{
        uchar timeout;
        TH1=0x3c;
        TL1=0xb0;
        timeout++;
         if(timeout==10)
         {        
                 flash=!flash;
                 timeout=0;
         }
}        

        void key()
{
               
                if(keyset==0)
                {
                  delay(3);
                  if(keyset==0)
                            TR0=0;
                                 a++;
    while(!keyset)
                {
                display();//调用显示防止闪烁
                }
                        if(a==4)
                                {
                                a=0;
                                TR0=1;
                                }
                }
                if(a!=0)
                {   
                                
                        if(a==3)
                        {
                                if(keyup==0)
                                {
                                 delay(3);
                                 while(!keyup)
                                        {
                                        secdisp();
                                        }
                                   s++;
                                        if(s==60)
                                        s=0;
                                }
                                
                                if(keydown==0)
                                {
                                 delay(3);
                                 while(!keydown)
                                        {
                                        secdisp();
                                        }
                                        if(s==0)
                                                s=60;
                                        s--;
                                        if(s==60)
                                           s=0;
                            }
                        
                         }

                        if(a==2)
                        {
                                if(keyup==0)
                                {
                                 delay(3);
                                 while(!keyup)
                                        {
                                        display();
                                        }
                                   m++;
                                        if(m==60)
                                        m=0;
                                }
                                
                                if(keydown==0)
                                {
                                 delay(3);
                         while(!keydown)
                                        {
                                        display();
                                        }
                                        if(m==0)
                                                m=60;
                                      m--;
                                        if(m==60)
                                           m=0;
                            }
                        
                         }

                        
                        if(a==1)
                        {
                                if(keyup==0)
                                {
                                 delay(3);
                         while(!keyup)
                                        {
                                        display();
                                        }
                                   h++;
                                        if(h==24)
                                        h=0;
                                }
                                
                                if(keydown==0)
                                {
                                 delay(3);
                         while(!keydown)
                                        {
                                        display();
                                        }
                                        if(h==0)
                                                h=24;
                                      h--;
                                        if(h==24)
                                           h=0;
                            }
                        
                         }

               
            }        
                        
                                
                                       
               
}
void main()
{
        init();
        while(1)
        {
         
                 key();
                 if(a<3)
                         display();
                 if(a==3)
                         secdisp();
            
        }
}

使用特权

评论回复
11
lanchong1980| | 2013-9-22 14:55 | 只看该作者
这,只能说很强悍

使用特权

评论回复
12
双赢电子| | 2013-10-11 19:56 | 只看该作者
不错正在学习中不管对与错反正有收获

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

18

主题

66

帖子

0

粉丝