硬件连接错误, 而且没有可产生计数的硬件, 我加了一个外部中断;
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);
}
}
|