找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2853|回复: 6
收起左侧

关于数码管动态扫描的问题,请教一下大家!谢谢!

[复制链接]
ID:404479 发表于 2018-11-19 11:16 来自手机 | 显示全部楼层 |阅读模式
我的目的是让四位共阴级数码管实现动态扫描。分别显示0.1.2.3,我是利用一个138译码器来提供位选,利用一个74H595实现段选!两个芯片使能端均配置OK,我选用P2.2和P2.3以及P2.4为38译码器提供的输入,用P2.5和P2.6以及P2.7口控制595芯片的移位寄存器时钟,存储寄存器时钟,以及输入!我遇到的问题为:
①程序写入单片机,数码管能口实现动态扫描,但是数码管显示的不是0.1.2.3,而是显示的0.7.8.8,我就搞不懂了,我的段码是正确的,移位寄存器得子函数也配置正确的,为什么它会显示0.7.8.8呢?首先,面包板接线是没问题的,要不然他不会实现动态扫描,这个是共阴数码管,它有8位,分别是a.b.c.d.e.f.g.h,我是把h最高位接到595芯片的输出口最高位,把a最低位接到595芯片输出的最低位,因为595芯片移位是先移动段码的最高位到595芯片输出的的最高位,在依次移动次高位,那么我提供595芯片移位子函数也是正确的,为何明明是显示0.1.2.3的段码却显示出了0.7.8.8.呢?真心请教一下大家!
以下是程序:

#include <reg51.h>
#include <intrins.h>
typedef unsigned u16;
typedef unsigned u8;
u8 a,b;
sbit LSA=P2^2; //38译码器输入A
sbit LSB=P2^3; //38译码器输入B
sbit LSC=P2^4; //38译码器输入C
sbit yiwei=P2^5; //74H595移位寄存器
sbit chunchu=P2^6; //74H595存储寄存器
sbit shuru=P2^7; //74H595输入端
u8 look[]={0x3f,0x06,0x5b,0x4f,0x00};
//数码管段码,4位数码管分别显示0.1.2.3
void delay(u16 z)
{
while(z--); //延时子函数
}
void ddr(u8 k) //74H595芯片配置子函数
{
yiwei=0; //首先把移位和存储寄存器初始化
chunchu=0;

for(a=0;a<8;a++)//通过for循环8次移位
{
shuru=k>>7; //段码先右移7次,把值赋给输入
k<<=1; //段码本身左移一次,次高位变高位
yiwei=1; //给移位寄存器时钟一个上升延
_nop_(); //用机器周期延时
_nop_();
yiwei=0; //移位寄存器上升延结束
}
chunchu=1; //给存储器时钟一个上升延刷新
_nop_();
_nop_();
chunchu=0;//存储寄存器上升延结束
}


void saomiao() //数码管动态扫描函数
{
while(1)
{
for(b=0;b<4;b++) //for循环4次
{

switch(b)
{
case(0):LSA=0;LSB=0;LSC=0;ddr(look[0]);break;
case(1):LSA=1;LSB=0;LSC=0;ddr(look[1]);break;
case(2):LSA=0;LSB=1;LSC=0;ddr(look[2]);break; case(3):LSA=1;LSB=1;LSC=0;ddr(look[3]);break;
}

delay(200);
ddr(look[4]);// 消隐

}
}
}

void main()
{


saomiao();
while(1);
}


IMG_20181118_192510.jpg
回复

使用道具 举报

ID:94031 发表于 2018-11-19 14:09 | 显示全部楼层
这里改成:typedef unsigned int  u16; typedef unsigned char u8;
回复

使用道具 举报

ID:429292 发表于 2018-11-19 16:49 | 显示全部楼层
已经大三毕业了,我还是对单片机陌生,无能为力。。
回复

使用道具 举报

ID:411940 发表于 2018-11-19 17:55 | 显示全部楼层

这里改成:typedef unsigned int  u16; typedef unsigned char u8;
回复

使用道具 举报

ID:404479 发表于 2018-11-22 01:28 来自手机 | 显示全部楼层
xuyaqi 发表于 2018-11-19 14:09
这里改成:typedef unsigned int  u16; typedef unsigned char u8;

谢谢!
回复

使用道具 举报

ID:431077 发表于 2018-11-22 11:29 | 显示全部楼层
这里改成:typedef unsigned int  u16; typedef unsigned char u8;
回复

使用道具 举报

ID:430677 发表于 2018-11-22 13:02 | 显示全部楼层
需要指定u16和u8的类型,比如:typedef unsigned int  u16; typedef unsigned char u8;试试看
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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