打印

输入段码后数码管不显示

[复制链接]
608|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
刚开始学单片机,被要求自己做一个51开发板
我做的板子上面的数码管只要输入段选的程序,就一个灯都不亮了,74hc245各个引脚都没有电压了。
图片是我的原理图,程序如下
#include "reg52.h"
#include "intrins.h"

typedef unsigned char u8;
typedef unsigned int u16;

sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;

u8 code smgduan[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,
                                   0x77,0x7c,0x39,0x5e,0x79,0x71};


void delay(u16 i)
{
while(i--);
}

void DigDisplay()
{
  u8 i;
  for(i=0;i<8;i++)
  {
   switch(i)
   {
        case 0:
        LSA=0;LSB=0;LSC=0;break;
        case 1:
        LSA=1;LSB=0;LSC=0;break;
        case 2:
        LSA=0;LSB=1;LSC=0;break;
        case 3:
        LSA=1;LSB=1;LSC=0;break;
        case 4:
        LSA=0;LSB=0;LSC=1;break;
        case 5:
        LSA=1;LSB=0;LSC=1;break;
        case 6:
        LSA=0;LSB=1;LSC=1;break;
        case 7:
        LSA=1;LSB=1;LSC=1;break;
   }
   P0=smgduan[i];
   delay(100);
   P0=0x00;
  }
}

void main()
{
while(1)
{
   DigDisplay();
}
}
这段程序烧进去后数码管没显示,245芯片各个引脚之间也没有电压。
如果把段选的这段程序删除
P0=smgduan[i];
   delay(100);
   P0=0x00;
数码管就能显示8个8,245芯片也有电压了。
初学单片机,有很多地方不明白,有大佬可以帮帮忙吗,在这多谢了

IMG_20201126_202723.jpg (145.19 KB )

IMG_20201126_202723.jpg

IMG_20201126_202714.jpg (132.59 KB )

IMG_20201126_202714.jpg

使用特权

评论回复

相关帖子

沙发
airwill| | 2020-11-29 13:34 | 只看该作者
新人, 上来要对电路硬件和软件相配合,  从信号控制 IO 变化开始验证软件行为

使用特权

评论回复
板凳
tianxj01| | 2020-11-29 14:52 | 只看该作者
本帖最后由 tianxj01 于 2020-11-29 15:11 编辑

首先,位扫描就不是你这样写的,138是3-8译码器,是一个直接3位二进制到8线的过程。
用一个寄存器,你这里其实就是for运算的i变量,P22-P24你去对应变量i的低3位就可以了。
中间switch函数先砍了。
P0=0;      /*这个可有可无,一般如果发现位扫描有闪烁现象,在这里进行LED熄灭动作。*/
P2&=&0x1C;
P2|=i<<2;
P0=TAB;    /*这里其实应该送的是需要显示的每位实际数字。你这里只是用i变量,结果是第一位显示0第二位显示1.....不过作为测量无可厚非。*/
然后就可以P0口查表输出了。
你这样的做法,程序冗长,关键是非常容易出错。
后面有一个关键是P0=0是完全不必要的,每次当P2口送出正确的3-8译码数据后,更新P0口正确段码,显示就能正常了。如果发现位扫描过程有闪烁,你可以在P2口更新前,送一个0到P0口这是可以的。没仔细看你的数码管极性和你段码表的极性,138送的是某一对应位低电平信号,这时候段码表必须是正逻辑。
还有就是,作为段码扫描。需要送出很大的电流,这里没看见你端口初始化逻辑,一般的51系列缺省的是准双向模式,这时候,基本上是推不动段码扫描形式的,必须将P0口初始化为互补模式,才能有较大的正逻辑驱动能力,LED才会正确发光。
一个完整的LED段码扫描测试程序,你首先应该做的是把显示更新驱动作为一个标准函数,同时把被显示的数据当作函数的参数来进行传递,然后在主程序里面对某个变量进行处理,再送显示子函数。

而且你必须注意到,动态显示,是有刷新速率要求的,必须稳定在一个合理是范围。所以,合理的做法是,用一个定时器,设定一个刷新周期,这里假定每位显示时间是1mS,然后将P2口的位扫描数据设置为全局变量,每次中断发生自动加1,然后送到P2口,同时根据对应的位,更新显示缓存寄存器数据的对应位。由于你这里有8位LED,所以该变量必须定义为unsigned long。
只有这样,LED段码扫描有一个固定的间隔,不会因为程序的运行产生长短偏差,才能保证不会闪烁,同时各位亮度保证一样。


使用特权

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

本版积分规则

1

主题

1

帖子

0

粉丝