找回密码
 立即注册

QQ登录

只需一步,快速开始

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

求解一个关于数码管动态显示的问题

[复制链接]
ID:72939 发表于 2015-1-28 19:57 | 显示全部楼层 |阅读模式

图
如图,只有三个芯片接口,要这样既能控制段选又能控制位选呢?我自己觉得,当我把位选码输出的时候,这个段选不是也接受到了吗?我是新人.....求大神帮帮忙
回复

使用道具 举报

ID:1 发表于 2015-1-29 03:58 来自手机 | 显示全部楼层
你需要了解锁存这个概念
回复

使用道具 举报

ID:65490 发表于 2015-1-29 08:21 | 显示全部楼层
每次送两字节的数据,第一字节为位码,第二字节为段码,这样就能显示出来了。
回复

使用道具 举报

ID:66032 发表于 2015-1-30 11:56 | 显示全部楼层
硬件连接错误, 而且没有可产生计数的硬件, 我加了一个外部中断;
hc595 pin12-----PB2;hc595 pin14-----PB3;hc595 pin11-----PB5;hc595 pin13-----PB0&PB1;两个hc595分别接到不同的使能端;
下面的程序是我从ATmega128 的基础上改的, 在128上没有问题,应该可行; 楼主的硬件基础太差, 要认真看一下英文的数据手册; 看下面的code;

//*******Numerical_LED using 74HC595 ***************//
//****Created by MQ.Wu on 2015/1/30************//
#include <iom48v.h>
#include <macros.h>
#define uchar unsigned char
#define uint  unsigned int
#define Dis1_hc595  PORTB &= ~(1<<PB0)           
#define EN1_hc595   PORTB |= (1<<PB0)   
#define Dis2_hc595  PORTB &= ~(1<<PB1)           
#define EN2_hc595   PORTB |= (1<<PB1)               

#pragma interrupt_handler INT0_ISR:2
const uchar tab0[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90};
const uchar tab1[]={0xF7,0xEF,0xDF,0xBF};
uchar cData[4]={0,0,0,0};        //display the initial value;
uint  count=0;                     
               
void port_init(void);
void HC595out(uchar i);
void Process(uint i,uchar *p);
void DelayMs(uint t);
void SPImasterInit(void);
void SPIMasterTransmit(uchar TranData);
void HC595out(uchar i);
void Display(uchar *p);


void main(void)
{
  port_init();                 
  SPImasterInit();     
  while(1)
  {
    Process(count,cData);         
    Display(cData);               
  }
}

void INT0_ISR()       //External interrupt0;
   {
     count++;
     if(count==9999)
     count=0;
   }
   
   
void port_init(void)
{
  DDRB =0XFF;                  //define as Output;
  DDRC =0X00;                  
  PORTC=0XFF;
  DDRD =0X00;                  
  PORTD=0XFF;
}
void DelayMs(uint t)
{
   uint m,n;
   for(n=0;n<t;n++)
    for (m=0;m<1140;m++);
}

void SPImasterInit(void)   
{
  DDRB|=(1<<3)|(1<<5);       //set MOSI,SCK as output, others are input;
  SPCR|=(1<<SPE)|(1<<MSTR)|(1<<SPR1)|(1<<SPR0);//Enable SPI Master mode£¬Fck/128
}
void SPIMasterTransmit(uchar TranData)   
{
  SPDR=TranData;                        
  while(!(SPSR&(1<<SPIF)));               
}

void HC595out(uchar i)
{
   PORTB&=~(1<<2);             //waiting for the data transmision;
   SPIMasterTransmit(i);       //Transferring data;
   PORTB|=(1<<2);              
}

void Process(uint num,uchar *p)
{
  p[0]=num/1000;                                 
  p[1]=num%1000/100;                                    
  p[2]=num%100/10;               
  p[3]=num%10;                    
}


void Display(uchar *p)        
{
uchar i;         
for(i=0;i<4;i++)
  {
   EN1_hc595;            
   HC595out(tab0[p[i]]);         //send the segment code;
   Dis1_hc595;
   DelayMs(1);
   EN2_hc595;
   HC595out(tab1[i]);// send the bit code;
   Dis2_hc595;
   DelayMs(1);                 
  }
}
回复

使用道具 举报

ID:7485 发表于 2015-1-30 19:48 | 显示全部楼层
根据图上的接法,是属于2个595级联。595的工作原理你应该知道吧?

当向U2发送第1~8bit数据时,这8bit的值会出现在U2的Q0~Q7上。当你继续发送第9bit数据时,第9bit数据的值就会出现在U3的Q0上,第10bit会出现在U3的Q1上......
当你向U2发送2个字节数据时,第一个字节会出现在U3的Q0~Q7上,第二个字节会出现在U2的Q0~Q7上,所以,第一个字节就是数码管的“位”码,第二字节就是“段”码。
回复

使用道具 举报

ID:66032 发表于 2015-1-31 10:35 | 显示全部楼层
595的工作原理不知道能写程序吗? 595不是今天才用, 4年前开发的电源通信输出开路检测都用到,典型的串进并出, 每次只能接受8位数据, 根本不是楼主说的哪样。SPI通信都是标准的接法, 图中的连接MOSI都不接, 能有通信吗?这是基本的常识, 图中两个74HC595是并联的,通过使能断来改变哪一个在工作, 哪一个在Standby;
回复

使用道具 举报

ID:66032 发表于 2015-1-31 10:42 | 显示全部楼层
图中两个脚74HC595是并联的, 数据是级联的;这种接法不可能工作。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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