4361|4

12

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

msp430f149数码管显示问题? [复制链接]

例程如下:
/**********************************************
程序功能:在八位数码管上显示八个数字01234567
-----------------------------------------------
测试说明:观察数码管显示
***********************************************/
#include  
typedef unsigned char uchar;
#define wei_h P5OUT|= BIT5   
#define wei_l P5OUT&= ~BIT5  
#define duan_l   P6OUT &= ~BIT6   
#define duan_h  P6OUT |= BIT6
//数码管7位段码:0--f
uchar scandata[16] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
                      0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
//记录显示位数的全局变量
uchar cnt = 0;

/********************主函数********************/
void main(void)
{
    /*下面六行程序关闭所有的IO口*/
    P1DIR = 0XFF;P1OUT = 0XFF;
    P2DIR = 0XFF;P2OUT = 0XFF;
    P3DIR = 0XFF;P3OUT = 0XFF;
    P4DIR = 0XFF;P4OUT = 0XFF;
    P5DIR = 0XFF;P5OUT = 0XFF;
    P6DIR = 0XFF;P6OUT = 0XFF;

    WDTCTL = WDT_ADLY_1_9;        // 设置内部看门狗工作在定时器模式,1.9ms中断一次
    IE1 |= WDTIE;                 // 使能看门狗中断

    P6DIR |= BIT2;P6OUT |= BIT2;  //关闭电平转换

    _BIS_SR(LPM3_bits + GIE);     //CPU进入LPM3低功耗模式,同时打开全局中断
}


#pragma vector=WDT_VECTOR
__interrupt void watchdog_timer(void)
{
    P4OUT = scandata[cnt];        //输出段选信号
    duan_h;
    duan_l;
    P4OUT = ~(1 << cnt);           //输出位选信号
    wei_h;
    wei_l;

   cnt++;                        //位计数变量在0~5之间循环
    if(cnt == 8) cnt = 0;
}
哪位大神能告知一下问题一为什么我感觉提供的开发板原理图的数码管的段选和位选,在同时选中时感觉会有冲突,比如说位选0x3f,和段选0x4f;问题二或者说根据我的这个原理图段选和位选可以不同时选?感觉中断函数的这一块不是特别明白。这个数码管应该是共阴极的吧。

数码管1.jpg (46.44 KB, 下载次数: 0)

数码管1.jpg

数码管2.jpg (45.88 KB, 下载次数: 1)

数码管2.jpg

最新回复

本帖最后由 ginny 于 2016-1-17 19:16 编辑 我接着一楼的说吧。 P4OUT = scandata[cnt];        //输出段选信号     duan_h;//打开锁存器     duan_l;//关闭锁存器,数据依然在     P4OUT = ~(1   详情 回复 发表于 2016-1-17 19:14
 
点赞 关注

回复
举报

140

帖子

0

TA的资源

一粒金砂(中级)

推荐
 
本帖最后由 ginny 于 2016-1-17 19:16 编辑

我接着一楼的说吧。
P4OUT = scandata[cnt];        //输出段选信号
    duan_h;//打开锁存器
    duan_l;//关闭锁存器,数据依然在
    P4OUT = ~(1 << cnt);           //输出位选信号
    wei_h;//打开锁存器
    wei_l;//关闭锁存器,数据依然在    这点非常重要!!!

P5.5前面有个非,可是它后面也有个非啊。所以还是1的时候打开573。
根据中断函数看是共阴的数码管。

在说说中断函数吧:
__interrupt void watchdog_timer(void)
{
    P4OUT = scandata[cnt];        //输出段选信号
    duan_h;
    duan_l;
    P4OUT = ~(1 << cnt);           //输出位选信号
    wei_h;
    wei_l;

   cnt++;                        //位计数变量在0~7之间循环
    if(cnt == 8) cnt = 0;
}
这样会出现鬼影。

比如我们现在要显示第一位,那么cnt=0;
    P4OUT = scandata[0];
    duan_h;
    duan_l;
    P4OUT = ~(1 << 0);    //P4OUT = 0xfe; 这里可以看出是共阴的数码管
    wei_h;
    wei_l;
好,现在经过wei_h;wei_l;位选就选中了第一位,记住这个点特别重要!!!
然后第二次进入中断cnt=1,
    P4OUT = scandata[1];
    duan_h;
    duan_l;

//这里停下了思考下

    P4OUT = ~(1 << 1);   
    wei_h;
    wei_l;
发现什么了吗?

    P4OUT = scandata[1];
    duan_h;
    duan_l;
这时段选是不是被赋值了第2个数,但是但是在
    P4OUT = ~(1 << 1);   
    wei_h;
    wei_l;
执行之前,位选还是在第一位的。看看我上面加三个感叹号的地方。
所以当第二次执行段选时它会显示到前一个位选上,虽然是非常短的时候但我们还是会察觉,这就是我们说的鬼影。
为了避免鬼影,要在显示前把上一次锁存器的数据清除。

修改如下:
__interrupt void watchdog_timer(void)
{
    P4OUT = 0xff;           //清除位选信号
    wei_h;
    wei_l;

    P4OUT = scandata[cnt];        //输出段选信号
    duan_h;
    duan_l;
    P4OUT = ~(1 << cnt);           //输出位选信号
    wei_h;
    wei_l;

   cnt++;                        //位计数变量在0~7之间循环
    if(cnt == 8) cnt = 0;
}

当然你也可以把段选和位选都清除。
__interrupt void watchdog_timer(void)
{
    P4OUT = 0x00;        //清除段选
    duan_h;
    duan_l;
    P4OUT = 0xff;           //清除位选
    wei_h;
    wei_l;

    P4OUT = scandata[cnt];        //输出段选信号
    duan_h;
    duan_l;
    P4OUT = ~(1 << cnt);           //输出位选信号
    wei_h;
    wei_l;

   cnt++;                        //位计数变量在0~7之间循环
    if(cnt == 8) cnt = 0;
}

每次位选应该只选一个位,0x3f这样位就不只一位了。
0x3f    ---   00111111B  两个位。

不知道我的回答是不是你要的。
 
个人签名喜好电子DIY的小伙伴可以关注我的微信公众号:电子创客派
 

回复

530

帖子

4

TA的资源

一粒金砂(高级)

沙发
 
没有冲突,锁存器能够所存显示。
P4OUT = scandata[cnt];        //输出段选信号
    duan_h;//打开锁存器
    duan_l;//关闭锁存器,数据依然在
    P4OUT = ~(1 << cnt);           //输出位选信号
    wei_h;//同理
    wei_l;
 
 
 

回复

12

帖子

0

TA的资源

一粒金砂(中级)

板凳
 
传媒学子 发表于 2016-1-17 00:32
没有冲突,锁存器能够所存显示。
P4OUT = scandata[cnt];        //输出段选信号
    duan_h;//打开锁存 ...

好像是这样的,但是我有有疑问了,这个wei_h也就是把P5.5置成1wei_l把P5.5置成0,按照你的注释wei_h是打开锁存器,wei_l是关闭锁存器,但根据原理图P5.5前面加了个非,我怎么感觉是低电平,也就是0的时候打开锁存器的,duan_h,和duan_l同理,我想的对不对,还请大神赐教
 
 
 

回复

12

帖子

0

TA的资源

一粒金砂(中级)

5
 
ginny 发表于 2016-1-17 19:14
我接着一楼的说吧。
P4OUT = scandata[cnt];        //输出段选信号
    duan_h;//打开锁存器
    duan_ ...

讲的很清楚,谢谢
 
 
 

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

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表