找回密码
 立即注册

QQ登录

只需一步,快速开始

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

4四位数码管带时钟冒号,冒号闪烁问题

  [复制链接]
跳转到指定楼层
楼主


我思考了半天,打出了冒号闪烁代码,测试发现每分钟只闪57下。
一开始直接用延时500毫秒循环闪,发现抢了数码管的动态扫描时间,造成数码管闪烁。
这里是插入在动态扫描里的,显示效果都还算理想,只是少了几次闪烁。
自学的,不怎么会跳延时和keil看单步时间……
想问问黑友尽善的闪烁办法。
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:161164 发表于 2022-8-10 17:00 | 只看该作者
冒号是哪根脚/段位?
假设是W3的dp段

  1. P1=0xFF;w3=1;P1=smgduan[shi%16];
  2. if(ss>=500)
  3. {
  4.         ss==0;
  5.         if(flash)
  6.         {
  7.                 P1 &= 0x7F;
  8.         }
  9.         flash = !flash;
  10. }else{
  11.         ss+=ms*4;
  12. }
  13. delay(ms);w3=0;//....
复制代码



回复

使用道具 举报

板凳
ID:1023753 发表于 2022-8-10 17:06 | 只看该作者
定时器不是好一点,不占用时间
回复

使用道具 举报

地板
ID:139866 发表于 2022-8-10 17:35 | 只看该作者
要想准确就用定时器
回复

使用道具 举报

5#
ID:57657 发表于 2022-8-10 18:00 | 只看该作者
你要用定时器中断进行动态扫描和计时。
回复

使用道具 举报

6#
ID:624769 发表于 2022-8-10 18:06 | 只看该作者
这要具体情况具体分析,不能任死理的。
一般如果时钟点 是独立引脚的话,我比较习惯用 DS1307 的 SQW 引脚输出 1秒 的脉冲 来驱动。
而如果时钟点 是和其他段是公用引脚,比如,在位2的 小数点。 那么会 利用定时器  每 500ms 翻转一次 Flag_TimePiont 标志, 在数码管 动态扫描 显示  位2 数字的时候:
if(Flag_TimePiont)   Disp[2] |= 0x80;
else Disp[2] &= 0x7f;
这样的方法。
回复

使用道具 举报

7#
ID:213173 发表于 2022-8-10 20:54 | 只看该作者
这个程序里有关于数码管闪点的代码,可以借鉴用于冒号闪烁。
4位数码管时钟温度表仿真.rar (175.43 KB, 下载次数: 28)

回复

使用道具 举报

8#
ID:367840 发表于 2022-8-11 09:08 | 只看该作者
可以用定时器延伸出来做一个软定时器,然后置标志位进行准确定时
回复

使用道具 举报

9#
ID:16255 发表于 2022-8-11 10:35 | 只看该作者
这种闪烁我会用定时器中断,不占用系统延时。他在闪烁的话给我的信息就是系统在运行。至于一分钟闪多少下,是57下还是63下,其实并不是那么重要的了。
回复

使用道具 举报

10#
ID:584814 发表于 2022-8-11 12:05 | 只看该作者
用个定时器之类的,约500ms灭,然后时钟变秒时亮就可以。
回复

使用道具 举报

11#
ID:796012 发表于 2022-8-11 12:17 | 只看该作者
lkc8210 发表于 2022-8-10 17:00
冒号是哪根脚/段位?
假设是W3的dp段

感谢黒友回复。。mh
回复

使用道具 举报

12#
ID:796012 发表于 2022-8-11 12:18 | 只看该作者
haiyang201 发表于 2022-8-10 17:06
定时器不是好一点,不占用时间

感谢黒友回复。。自学的技术不是很会
回复

使用道具 举报

13#
ID:796012 发表于 2022-8-11 12:18 | 只看该作者
天ノ忆 发表于 2022-8-10 17:35
要想准确就用定时器

感谢黒友回复。
回复

使用道具 举报

14#
ID:796012 发表于 2022-8-11 12:19 | 只看该作者
npn 发表于 2022-8-10 18:00
你要用定时器中断进行动态扫描和计时。

感谢黒友回复。。自学的技术,还不是很熟悉
回复

使用道具 举报

15#
ID:796012 发表于 2022-8-11 12:20 | 只看该作者
188610329 发表于 2022-8-10 18:06
这要具体情况具体分析,不能任死理的。
一般如果时钟点 是独立引脚的话,我比较习惯用 DS1307 的 SQW 引脚 ...

感谢黒友回复。。那个是SQW引脚
回复

使用道具 举报

16#
ID:796012 发表于 2022-8-11 12:20 | 只看该作者
wulin 发表于 2022-8-10 20:54
这个程序里有关于数码管闪点的代码,可以借鉴用于冒号闪烁。

感谢黒友回复。
回复

使用道具 举报

17#
ID:796012 发表于 2022-8-11 12:20 | 只看该作者
董云交 发表于 2022-8-11 09:08
可以用定时器延伸出来做一个软定时器,然后置标志位进行准确定时

感谢黒友回复。
回复

使用道具 举报

18#
ID:796012 发表于 2022-8-11 12:21 | 只看该作者
mengsiu 发表于 2022-8-11 10:35
这种闪烁我会用定时器中断,不占用系统延时。他在闪烁的话给我的信息就是系统在运行。至于一分钟闪多少下, ...

感谢黒友回复。。要精确闪烁哦
回复

使用道具 举报

19#
ID:796012 发表于 2022-8-11 12:23 | 只看该作者
lkc8210 发表于 2022-8-10 17:00
冒号是哪根脚/段位?
假设是W3的dp段

冒号是哪根脚/段位?
假设是W3的dp段

P1=0xFF;w3=1;P1=smgduan[shi%16];
if(ss>=500)
{
        ss==0;
        if(flash)
        {
                P1 &= 0x7F;
        }
        flash = !flash;
}else{
        ss+=ms*4;
}
delay(ms);w3=0;//....



用的是单独带冒号的数码管,不是小数点分出的;其实小数点分出可以节省硬件连接
回复

使用道具 举报

20#
ID:401564 发表于 2022-8-11 13:36 | 只看该作者
Miao在定时器中断中改变,1秒钟取反一次
OUT=..........;                   //显示,冒号不亮
if(Miao)OUT&=.....;//冒号亮灯
如果你不会写一个一秒钟的定时器,那.............

回复

使用道具 举报

21#
ID:624769 发表于 2022-8-11 14:54 来自手机 | 只看该作者
玉萌业余发展 发表于 2022-8-11 12:20
感谢黒友回复。。那个是SQW引脚

时钟点是独立引脚控制的话,建议用ds1307替代ds1302,因为ds1307有sqw引脚,可直接控制时钟点,给07地址分别写入0x00,0x80,0x10可控制时钟点亮,灭,闪。
回复

使用道具 举报

22#
ID:796012 发表于 2022-8-11 17:59 | 只看该作者
wulin 发表于 2022-8-10 20:54
这个程序里有关于数码管闪点的代码,可以借鉴用于冒号闪烁。


看,按你的程序修改了单按键调时。就是单片机延时得调精准些
回复

使用道具 举报

23#
ID:796012 发表于 2022-8-11 18:00 | 只看该作者
188610329 发表于 2022-8-11 14:54
时钟点是独立引脚控制的话,建议用ds1307替代ds1302,因为ds1307有sqw引脚,可直接控制时钟点,给07地址 ...

好,有钱再买回来研究
回复

使用道具 举报

24#
ID:796012 发表于 2022-8-11 18:01 | 只看该作者
Y_G_G 发表于 2022-8-11 13:36
Miao在定时器中断中改变,1秒钟取反一次
OUT=..........;                   //显示,冒号不亮
if(Miao)OUT&=.....;//冒 ...

修改了一个。本来就学着玩得
回复

使用道具 举报

25#
ID:401564 发表于 2022-8-12 07:24 | 只看该作者
玉萌业余发展 发表于 2022-8-11 17:59
看,按你的程序修改了单按键调时。就是单片机延时得调精准些

你这个代码,写得让人耳目一新啊,有黑客帝国风范
回复

使用道具 举报

26#
ID:796012 发表于 2022-8-13 10:28 | 只看该作者
Y_G_G 发表于 2022-8-12 07:24
你这个代码,写得让人耳目一新啊,有黑客帝国风范

其实我什么都不懂
回复

使用道具 举报

27#
ID:401564 发表于 2022-8-13 14:50 | 只看该作者

话不是这么说的
你多少是会点的
虽说不是一定要像人家科班出身那样,写出严谨的规范的C语言代码出来
但至少,一个语句占一行,这一点是要的
因为大家都是这样的,如果你要贴代码出来,多少是要考虑一下别人能不能看得明白你的代码
像你这种代码,很多时候,过一段时间,只怕是你自己都不知道自己代码是什么意思了
回复

使用道具 举报

28#
ID:213173 发表于 2022-8-14 07:21 | 只看该作者
玉萌业余发展 发表于 2022-8-11 17:59
看,按你的程序修改了单按键调时。就是单片机延时得调精准些

单键调时,适用带冒号时钟专用数码管。


  1. #include<reg51.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. #define key_S 3                                        //宏定义短按(约15ms)
  5. #define key_L key_S*40                        //宏定义长按(约600ms)
  6. #define key_I key_S*20                        //宏定义长按连+间隔(约300ms)

  7. sbit K1=P2^4;//连接按键
  8. sbit DP=P0^7;//连接冒号

  9. uchar code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共阳LED段码表
  10. uchar displayData[4];//显示数据缓存
  11. char shi=12,fen=0,sec=0;//时,分,秒
  12. uchar Cnt5ms;//5ms时基
  13. uchar KeySec;//键值
  14. uint num=0;//计数
  15. bit flashing=0;//闪烁标志

  16. //定时器初始化程序
  17. void Timer0Init()//5毫秒@12.000MHz
  18. {
  19.         TMOD=0x01;//定时器T0方式1
  20.         TH0=(65536-5000)/256;
  21.         TL0=(65536-5000)%256;
  22.         TF0=0;//中断请求清0
  23.         TR0=1;//启动T0
  24. }

  25. void keyscan()
  26. {
  27.         static unsigned int time=0;//计数变量
  28.         if(!K1)//按键按下
  29.         {
  30.                 time++;
  31.                 if(time>=key_L)//长按
  32.                 {
  33.                         switch(KeySec)
  34.                         {
  35.                                 case 1: shi++;if(shi>23)shi=0; break;
  36.                                 case 2: fen++;if(fen>59)fen=0; break;
  37.                         }
  38.                         time=key_I;//连+间隔
  39.                         num=1000;//自复位变量赋值(5秒)
  40.                 }
  41.         }
  42.         else                                //松手
  43.         {
  44.                 if(time>key_S && time<key_I)//短按
  45.                 {
  46.                         KeySec++;
  47.                         if(KeySec>2)
  48.                         {
  49.                                 KeySec=0;
  50.                                 Cnt5ms=0;
  51.                                 sec=0;
  52.                         }
  53.                         num=1000;//自复位变量赋值(5秒)
  54.                 }
  55.                 time=0;

  56.         }
  57. }

  58. void display()//显示
  59. {
  60.         static uchar i=0;
  61.         displayData[0] = tab[shi/10%10];
  62.         displayData[1] = tab[shi%10];
  63.         displayData[2] = tab[fen/10%10];
  64.         displayData[3] = tab[fen%10];

  65.         P2&=0xf0;//消隐
  66.         if(KeySec==0)
  67.                 P0=displayData[i];

  68.         if(KeySec==1)
  69.         {
  70.                 if(flashing && (i==0||i==1) && K1)
  71.                         P0=0xff;//时调整闪烁
  72.                 else P0=displayData[i];
  73.         }

  74.         if(KeySec==2)
  75.         {
  76.                 if(flashing && (i==2||i==3) && K1)
  77.                         P0=0xff;//分调整闪烁
  78.                 else P0=displayData[i];
  79.         }
  80.         P2|=0x01<<i;
  81.         i=++i%4;
  82. }


  83. void main()//主函数
  84. {
  85.         Timer0Init();//初始化定时器
  86.         while(1)
  87.         {
  88.                 if(TF0)//查询定时器中断请求位
  89.                 {
  90.                         TF0=0;
  91.                         TH0=(65536-5000)/256;//5ms
  92.                         TL0=(65536-5000)%256;

  93.                         Cnt5ms++;
  94.                         if(KeySec!=0)
  95.                         {
  96.                                 num--;
  97.                                 if(num==0)//按键停止操作5秒自动恢复正常显示
  98.                                 {
  99.                                         KeySec=0;
  100.                                         Cnt5ms=0;
  101.                                         sec=0;
  102.                                 }
  103.                                 if(Cnt5ms%50==0)   //0.25s 快闪
  104.                                         flashing=~flashing;
  105.                         }
  106.                         else if(Cnt5ms%100==0)//0.5s  慢闪
  107.                                         flashing=~flashing;

  108.                         if(Cnt5ms==200)//1s
  109.                         {
  110.                                 Cnt5ms=0;
  111.                                 sec++;
  112.                                 if(sec>=60)
  113.                                 {
  114.                                         sec=0;
  115.                                         fen++;
  116.                                         if(fen>=60)
  117.                                         {
  118.                                                 fen=0;
  119.                                                 shi++;
  120.                                                 if(shi>23)
  121.                                                         shi=0;
  122.                                         }
  123.                                 }
  124.                         }
  125.                         keyscan();                        //按键扫描
  126.                         display();                        //数码管显示
  127.                         if(KeySec==0)
  128.                                 DP=flashing;        //闪冒号 表示走时
  129.                         else DP=0;
  130.                 }
  131.         }
  132. }
复制代码
4位数码管时钟仿真.rar (125.11 KB, 下载次数: 15)


回复

使用道具 举报

29#
ID:1042050 发表于 2022-8-14 10:14 | 只看该作者
调整延时时间
回复

使用道具 举报

30#
ID:796012 发表于 2022-8-14 13:10 | 只看该作者
Y_G_G 发表于 2022-8-13 14:50
话不是这么说的
你多少是会点的
虽说不是一定要像人家科班出身那样,写出严谨的规范的C语言代码出来

复制修改的,改好的就凑一起了
回复

使用道具 举报

31#
ID:796012 发表于 2022-8-14 13:11 | 只看该作者
wulin 发表于 2022-8-14 07:21
单键调时,适用带冒号时钟专用数码管。

下载了,慢慢玩
回复

使用道具 举报

32#
ID:796012 发表于 2022-8-14 13:13 | 只看该作者

if(sec &1)ss=1;else ss=0;/*1s一翻*/
这个一秒一翻转还实在,直接关系1302
编译不了0.5要不然就按秒亮灭了
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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