打印

数码管扫描求助

[复制链接]
2404|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
laoliang3064|  楼主 | 2010-9-12 19:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 laoliang3064 于 2010-9-13 13:54 编辑

这个8位8段数码管是用单片机一路端口驱动,字形驱动和位驱动用74HC373锁存,现在出现问题就是数码管单个位显示数据没有问题,不能同时有2个或2个以上显示,总是有前面的数据叠加到后面的数码管上,问高手如何解决?


这是显示函数:

void led_Display(){
    unsigned tmp ;
    P4DIR  = 0xff;                             // 设置 p4 输出
    P4OUT &= 0x00;                          // 设置
    P1DIR |= 0xc0;                           // 设置 p1.6,p1.7 输出
    P1OUT |= 0x00;                          // 关闭数据锁存器
      tmp    = 0x01;   
      P4OUT  = NUM_LED[led_Buf[led_Ctrl]];  // 设置显示值  
      P1OUT |= 0x40;                                 // 打开数据锁存器
      P1OUT &= 0X00;                                // 关闭数据锁存
   
      P4OUT  =~(tmp<<led_Ctrl);                 // 设置那只LED显示
      P1OUT  |= 0x80;                                 // 打开控制锁存
      P1OUT  &= 0X00;                                 // 关闭控制锁存
}

相关帖子

沙发
laoliang3064|  楼主 | 2010-9-12 21:38 | 只看该作者
这个,怎么也没个人搭话,单片机高手哪去了?

使用特权

评论回复
板凳
原野之狼| | 2010-9-13 00:05 | 只看该作者
考虑下段选和位选的匹配 你这种情况是没有协调好这两者的控制信号从而造成叠加

使用特权

评论回复
地板
高勇| | 2010-9-13 08:10 | 只看该作者
在显示之前要消隐。

使用特权

评论回复
5
ayb_ice| | 2010-9-13 08:22 | 只看该作者
分时显示
分时了没有

使用特权

评论回复
6
laoliang3064|  楼主 | 2010-9-13 08:56 | 只看该作者
基本确定了,段选和位选的时序没有问题,数码管是共阴极,段选后时位选置高,位选时段选置低。

使用特权

评论回复
7
laoliang3064|  楼主 | 2010-9-13 08:58 | 只看该作者
消隐了也没作用,依然叠加,关键是叠加的不该有的部分比较暗,而不是相同的亮度。

使用特权

评论回复
8
laoliang3064|  楼主 | 2010-9-13 15:04 | 只看该作者
这么快就沉下去了?好吧,人工置顶。

使用特权

评论回复
9
zhy433| | 2010-9-13 16:26 | 只看该作者
tmp    = 0x01;   
      P4OUT  = NUM_LED[led_Buf[led_Ctrl]];  // 设置显示值  
      P1OUT |= 0x40;                                 // 打开数据锁存器
      P1OUT &= 0X00;                                // 关闭数据锁存
在这段后面加个P4OUT=0xff试一下。

使用特权

评论回复
10
zhy433| | 2010-9-13 16:39 | 只看该作者
共阴极的话加P4OUT=0x00

使用特权

评论回复
11
ddtx| | 2010-9-13 16:40 | 只看该作者
下个输入输出之前要清楚掉上个输出数据

使用特权

评论回复
12
ddtx| | 2010-9-13 16:42 | 只看该作者
void led_Display(){
    unsigned tmp ;
    P4DIR  = 0xff;                             // 设置 p4 输出
    P4OUT &= 0x00;                          // 设置
    P1DIR |= 0xc0;                           // 设置 p1.6,p1.7 输出
    P1OUT |= 0x00;                          // 关闭数据锁存器
      tmp    = 0x01;
      P4OUT  = 0xff;//此处关闭上次显示数据  
      P4OUT  = NUM_LED[led_Buf[led_Ctrl]];  // 设置显示值  
      P1OUT |= 0x40;                                 // 打开数据锁存器
      P1OUT &= 0X00;                                // 关闭数据锁存
      //此处加入延时
       P4OUT  = 0xff;//此处关闭上次显示数据
      P4OUT  =~(tmp<<led_Ctrl);                 // 设置那只LED显示
      P1OUT  |= 0x80;                                 // 打开控制锁存
      P1OUT  &= 0X00;                                 // 关闭控制锁存
      //此处加入延时
}

使用特权

评论回复
13
laoliang3064|  楼主 | 2010-9-13 17:37 | 只看该作者
12# ddtx

一会儿回家试试,谢谢。

使用特权

评论回复
14
yuyetufu| | 2010-9-13 22:11 | 只看该作者
时序:关位码,给数据,开位码

使用特权

评论回复
15
laoliang3064|  楼主 | 2010-9-13 22:58 | 只看该作者
本帖最后由 laoliang3064 于 2010-9-13 23:02 编辑

问题解决了,忘了关位码,都是锁存惹得祸,我老想着锁存就万事大吉了,结果杯具了。是万能的21ic汇聚的众多网友给了我力量,阿门,结贴给分。

void led_Display(){
    unsigned tmp ;
    P4DIR  = 0xff;                          // 设置 p4 输出
    P4OUT &= 0x00;                          // 设置
    P1DIR |= 0xc0;                          // 设置 p1.6,p1.7 输出
    P1OUT |= 0x00;                          // 关闭数据锁存器
      tmp    = 0x01;   
      P4OUT  = NUM_LED[led_Buf[led_Ctrl]];  // 设置显示值  
      P1OUT |= 0x40;                        // 打开数据锁存器
      P1OUT &= 0X00;                        // 关闭数据锁存

     
      P4OUT  =~(tmp<<led_Ctrl);             // 设置那只LED显示
      P1OUT  |= 0x80;                       // 打开控制锁存      
      P1OUT  &= 0X00;                       // 关闭控制锁存
      
      delay(1);

      
       P4OUT |= 0Xff;                       //消隐
       P1OUT |= 0x80;                       
       P1OUT &= 0X00;
   
    }

使用特权

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

本版积分规则

个人签名:不清楚方向的叛逆没意义也没力量。 360777249

23

主题

766

帖子

1

粉丝