找回密码
 立即注册

QQ登录

只需一步,快速开始

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

关于单片机控制数码管闪烁问题 求思路

[复制链接]
跳转到指定楼层
楼主
新手想请假一下各位大佬,要怎么样才能做到让数码管其中一位以1Hz闪动,其他三位正常显示,已经卡在这个步骤好多天了,是需要用到中断定时器什么的吗,希望大佬可以讲一下具体思路

51hei截图20191228223721.png (19.95 KB, 下载次数: 58)

51hei截图20191228223721.png
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

来自 6#
ID:89515 发表于 2019-12-29 21:53 | 只看该作者
这个最好还是用中断,因为有长延时容易造成程序时间阻塞!!!
思路:就两个方向解决
1:控制数据线,扫描线不变。这个楼上有人已经说过就是没点通而已,需要写两个函数,一个正常的扫描函数;另一个根据设置位的标志将相应位写全1或全0关闭(取决于共阴还是共阳),两个函数交叉调用即可。调用时间就是频率,自己决定。如果要退出设置状态,就只调用正常扫描的函数。
2:数据线不变,控制扫描线。同样设置位标志决定哪一位闪烁,相应位位选线的开启用闪烁周期决定,
比如前500MS开启,后500MS关闭。其它的和正常扫描一样。多申明一组变量来赋给位选,不要直接控制,这样就很方便了。

评分

参与人数 1黑币 +50 收起 理由
admin + 50 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

沙发
ID:437615 发表于 2019-12-28 23:30 来自手机 | 只看该作者
写两个显示函数,把它们分开来显示
回复

使用道具 举报

板凳
ID:213173 发表于 2019-12-29 07:09 | 只看该作者
楼主只要搞清楚数码管在什么条件下可以点亮,什么条件下不亮,再按0.5秒间隔交替提供这两个条件不就成了?如果对闪动周期要求精确当然使用定时器中断为佳。
回复

使用道具 举报

地板
ID:676374 发表于 2019-12-29 12:43 | 只看该作者
wulin 发表于 2019-12-29 07:09
楼主只要搞清楚数码管在什么条件下可以点亮,什么条件下不亮,再按0.5秒间隔交替提供这两个条件不就成了? ...

大佬能说的再详细一点吗,看的有点懵= =
回复

使用道具 举报

5#
ID:384312 发表于 2019-12-29 18:49 | 只看该作者
首先确定数码管共阴还是共阳,然后确定位选和段选IO口,再考虑动态数码管的消影,最后结合定时器完事
回复

使用道具 举报

7#
ID:89515 发表于 2019-12-29 22:13 | 只看该作者
说明:以上两种方法都是要先在中断中设置闪烁标志的,闪烁标志是否有效  由是否进入设置状态的标志决定。所以其实写一个函数更方便,但是你必须先理解逻辑是什么样的。
回复

使用道具 举报

8#
ID:213173 发表于 2019-12-30 07:11 | 只看该作者
Rei 发表于 2019-12-29 12:43
大佬能说的再详细一点吗,看的有点懵= =

这是一个动态显示的数码管驱动程序
void display()
{
        static uchar i=0;//静态变量
        P0=0x00;                        //消隐
        switch(i)        //送位码
        {
                case 0: led138a=0;led138b=0;led138c=0; break;
                case 1: led138a=1;led138b=0;led138c=0; break;
                case 2: led138a=0;led138b=1;led138c=0; break;
                case 3: led138a=1;led138b=1;led138c=0; break;
                case 4: led138a=0;led138b=0;led138c=1; break;
                case 5: led138a=1;led138b=0;led138c=1; break;
                case 6: led138a=0;led138b=1;led138c=1; break;
                case 7: led138a=1;led138b=1;led138c=1; break;
        }
        P0=dis_buf;        //送段码
        i++;
        i%=8;
}
在上述程序基础改为键控逐位闪烁的数码管驱动程序
void display()
{
        static uchar i=0;//静态变量
        P0=0x00;                        //消隐
        switch(i)        //送位码
        {
                case 0: led138a=0;led138b=0;led138c=0; break;
                case 1: led138a=1;led138b=0;led138c=0; break;
                case 2: led138a=0;led138b=1;led138c=0; break;
                case 3: led138a=1;led138b=1;led138c=0; break;
                case 4: led138a=0;led138b=0;led138c=1; break;
                case 5: led138a=1;led138b=0;led138c=1; break;
                case 6: led138a=0;led138b=1;led138c=1; break;
                case 7: led138a=1;led138b=1;led138c=1; break;
        }
        if(Twinkle==1 && key==i)//闪烁标志与键值条件符合
                        P0=0xff;        //保持消隐状态
        else P0=dis_buf;        //送段码,dis_buf[ ]显示缓存数组
        i++;
        i%=8;
}
回复

使用道具 举报

9#
ID:213173 发表于 2019-12-30 07:53 | 只看该作者
Rei 发表于 2019-12-29 12:43
大佬能说的再详细一点吗,看的有点懵= =

勘误:
        if(Twinkle==1 && key==i)//闪烁标志与键值条件符合
                        P0=0x00;        //保持消隐状态
        else P0=dis_buf;        //送段码,dis_buf[ ]显示缓存数组
回复

使用道具 举报

10#
ID:130230 发表于 2019-12-30 16:52 | 只看该作者
定时器中断
回复

使用道具 举报

11#
ID:584814 发表于 2019-12-31 09:53 | 只看该作者
Rei 发表于 2019-12-29 12:43
大佬能说的再详细一点吗,看的有点懵= =

除了加分的那个思路,其他的很麻烦,贴程序的没听懂你的意思基本在忽悠。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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