标题:
求解一个关于数码管动态显示的问题
[打印本页]
作者:
青春的时光
时间:
2015-1-28 19:57
标题:
求解一个关于数码管动态显示的问题
`MGC(TOYM9_5%ZQ6YT]~]8U.png
(14.33 KB, 下载次数: 204)
下载附件
图
2015-1-28 19:54 上传
如图,只有三个芯片接口,要这样既能控制段选又能控制位选呢?我自己觉得,当我把位选码输出的时候,这个段选不是也接受到了吗?我是新人.....求大神帮帮忙
作者:
admin
时间:
2015-1-29 03:58
你需要了解锁存这个概念
作者:
beill88
时间:
2015-1-29 08:21
每次送两字节的数据,第一字节为位码,第二字节为段码,这样就能显示出来了。
作者:
mqwu
时间:
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);
}
}
作者:
ahshmj
时间:
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上,所以,第一个字节就是数码管的“位”码,第二字节就是“段”码。
作者:
mqwu
时间:
2015-1-31 10:35
595的工作原理不知道能写程序吗? 595不是今天才用, 4年前开发的电源通信输出开路检测都用到,典型的串进并出, 每次只能接受8位数据, 根本不是楼主说的哪样。SPI通信都是标准的接法, 图中的连接MOSI都不接, 能有通信吗?这是基本的常识, 图中两个74HC595是并联的,通过使能断来改变哪一个在工作, 哪一个在Standby;
作者:
mqwu
时间:
2015-1-31 10:42
图中两个脚74HC595是并联的, 数据是级联的;这种接法不可能工作。
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1