打印
[51单片机]

新手求指导:怎样用定时器实现按键使数码管闪烁

[复制链接]
4760|25
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
liuhao19900801|  楼主 | 2014-3-18 15:13 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
ayb_ice| | 2014-3-18 15:25 | 只看该作者
一段时间送正常数据显示,一段时间送空白数据显示

使用特权

评论回复
板凳
ballack_linux| | 2014-3-18 17:04 | 只看该作者
很好办,按键用外部中断检测,按键中断处理函数中完成的任务就是打开定时器,然后在定时器中让一个标志位比如FLAG不断取反就行, 在数码管动态显示的函数中加入此标志位的判断

使用特权

评论回复
地板
liuhao19900801|  楼主 | 2014-3-18 18:48 | 只看该作者
ballack_linux 发表于 2014-3-18 17:04
很好办,按键用外部中断检测,按键中断处理函数中完成的任务就是打开定时器,然后在定时器中让一个标志位比 ...

我现在写的时钟程序就是用的定时器中断的,现在我是再开一个定时器 还是用原来那个定时器啊?
if(key1==0)
{
        delayms(10);
        if(key1==0)
        {
        }
}
我按键消抖了就不知道怎么办了。新手莫笑啊。

使用特权

评论回复
5
liuhao19900801|  楼主 | 2014-3-18 18:54 | 只看该作者
这是我写的时钟程序,求指导指导,只知道加了个按键关定时器的操作,按键闪烁和加减时间都还没思路啊。
#include<reg52.h>
#include<math.h>
#define uint unsigned int
#define uchar unsigned char
sbit key1=P3^4;
sbit key2=P3^5;
sbit key3=P3^6;
sbit key4=P3^7;
sbit dula=P2^6;
sbit wela=P2^7;
uchar s1,s2,f1,f2,m1,m2,xms,num,num1;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f};
void delayms(uint xms);
void key_cz();
void display1(uchar shi1,uchar shi2);
void display2(uchar fen1,uchar fen2);
void display3(uchar miao1,uchar miao2);
void main()
{
        init();
        while(1)
        {
              key_cz();
              display1(s1,s2);
                  display2(f1,f2);
                  display3(m1,m2);
        }
}
init()
{
        TMOD=0x01;
        TH0=(65536-45872)/256;
        TL0=(65536-45872)%256;
        EA=1;
        ET0=1;
        TR0=1;
}
void display1(uchar shi1,uchar shi2)
{
          dula=1;
      P0=table[shi1];
          dula=0;
          P0=0xff;
          wela=1;
          P0=0xfe;
          wela=0;
          delayms(1);

          dula=1;
          P0=table[shi2];
          dula=0;
          P0=0xff;
      wela=1;
      P0=0xfd;
          wela=0;
          delayms(1);
}
void display2(uchar fen1,uchar fen2)
{
          dula=1;
          P0=table[fen1];
      dula=0;
          P0=0xff;
          wela=1;
          P0=0xfb;
          wela=0;
          delayms(1);

          dula=1;
          P0=table[fen2];
          dula=0;
          P0=0xff;
          wela=1;
          P0=0xf7;
          wela=0;
          delayms(1);
}
void display3(uchar miao1,uchar miao2)
{
          dula=1;
          P0=table[miao1];
          dula=0;
          P0=0xff;
          wela=1;
          P0=0xef;
          wela=0;
          delayms(1);

          dula=1;
          P0=table[miao2];
          dula=0;
          P0=0xff;
          wela=1;
          P0=0xdf;
          wela=0;
          delayms(1);
}
void delayms(uint xms)
{
     uint i,j;
         for(i=xms;i>0;i--)
               for(j=110;j>0;j--);
}
void key_cz()
{
        if(key4==0)
                {
                        delayms(10);
                        if(key4==0)
                        {
                                TR0=~TR0;
                                while(key4!=0);
                        }
                }
//        if(key1==0)
//        {
//                delayms(10);
//                if(key1==0)
//                {
//                        TR0=
//                }
//        }
}
void T0_time() interrupt 1
{
     TH0=(65536-45872)/256;
         TL0=(65536-45872)%256;
         num++;
         if(num==20) //20次为一秒
         {
              num=0;
                  num1++;
                 if(num1==60)
                 {
                      num1=0;
                          f2++;
                          if(f2==10)
                          {
                               f2=0;
                                   f1++;
                                   if(f1==6)
                                   {
                                                   f1=0;
                                                s2++;
                                                if(s2==10)
                                                {
                                                        s2=0;
                                                        s1++;
                                                        if(s1*10+s2>=24)
                                                        {
                                                                s1=0;
                                                                s2=0;
                                                        }
                                                }
                                   }
                          }
                  }
                 m1=num1/10;
                 m2=num1%10;
         }

}
求个大师带我啊!本人一是工作需求,再者对单片机以及硬件很感兴趣。

使用特权

评论回复
6
zhangmangui| | 2014-3-18 19:17 | 只看该作者
我觉得你用定时器去扫描按键有没有按下  如果按下则执行:
数码管小时位交替送全灭和数据

使用特权

评论回复
7
soso| | 2014-3-18 20:30 | 只看该作者
留个联系吧?

使用特权

评论回复
8
FAQ| | 2014-3-19 08:44 | 只看该作者
楼主程序架构直接错误

使用特权

评论回复
9
liuhao19900801|  楼主 | 2014-3-19 09:08 | 只看该作者
FAQ 发表于 2014-3-19 08:44
楼主程序架构直接错误

怎么个错法啊  指导指导呗。

使用特权

评论回复
10
FAQ| | 2014-3-19 09:11 | 只看该作者
liuhao19900801 发表于 2014-3-19 09:08
怎么个错法啊  指导指导呗。

看见你的 delayms就知道你刚学单片机。这个应该用定时器来做。分时扫描思路。楼主该改改思路了。推翻你以前的写法。

使用特权

评论回复
11
FAQ| | 2014-3-19 09:14 | 只看该作者
liuhao19900801 发表于 2014-3-19 09:08
怎么个错法啊  指导指导呗。

你要的应该是这么个效果吧。


使用特权

评论回复
12
liuhao19900801|  楼主 | 2014-3-19 10:14 | 只看该作者
本人qq694393482,求指导  求批评。。

使用特权

评论回复
13
liuhao19900801|  楼主 | 2014-3-19 10:20 | 只看该作者
FAQ 发表于 2014-3-19 09:14
你要的应该是这么个效果吧。

对啊 ,就是这个效果,菜鸟不会做啊,能不能给个代码 让我开开窍啊!:handshake

使用特权

评论回复
14
FAQ| | 2014-3-19 11:19 | 只看该作者
liuhao19900801 发表于 2014-3-19 10:20
对啊 ,就是这个效果,菜鸟不会做啊,能不能给个代码 让我开开窍啊! ...

晚上给你个例子代码瞧瞧。

使用特权

评论回复
15
liuhao19900801|  楼主 | 2014-3-19 12:15 | 只看该作者
FAQ 发表于 2014-3-19 11:19
晚上给你个例子代码瞧瞧。

好的,等着,谢谢啊

使用特权

评论回复
16
liuhao19900801|  楼主 | 2014-3-21 09:09 | 只看该作者
FAQ 发表于 2014-3-19 11:19
晚上给你个例子代码瞧瞧。

代码呢?大神!

使用特权

评论回复
17
kamen588| | 2014-3-21 09:40 | 只看该作者
用定时器扫描数码管 不要用Dalayms() ,

使用特权

评论回复
18
FAQ| | 2014-3-21 10:51 | 只看该作者
liuhao19900801 发表于 2014-3-21 09:09
代码呢?大神!

晚上回家没开电脑,今晚给你发,忘了不好意思啊。

使用特权

评论回复
19
four_zhg| | 2014-3-22 15:08 | 只看该作者
最好是自己先画流程图

使用特权

评论回复
20
天风立马| | 2014-3-22 20:48 | 只看该作者
怎么这么多人遇到问题就问呢?你想让它闪你就刷新它慢点,让视觉残留不起作用,时间自己调。
建议先培养自己分析解决问题的方法。我想让它闪----为什么不闪(一直亮呗,为什么一直亮?刷新太快,视觉残留作祟。)---搞掉视觉残留(刷新慢点(需要亮的时间段和需要灭的时间段先定好,这两个时间段隔的时间越段闪的越快,最后视觉残留导致“长亮”))---编程、调试---搞定。动动脑子就根本没必要问。

使用特权

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

本版积分规则

1

主题

17

帖子

0

粉丝