单片机avr128,数码管显示问题,请高人解答以下程序哪错了?
//编译环境:AVRGCC WINAVF-20100110 AVR STUDIO 4
//硬件连接:学习利用AVR128的SPI,74HC595芯片控制4位数码管(共阴)显示数字,PB0~3分别与74HC595(串入并出)相连,PB0相当于
//一片选信号ss,PB1为数据传输时钟sck,PB2为MOSI(数据输出)脚,PB3为MISO(数据输入)脚-在本例中用不上,共阴数码管编码(在本例中
//为0X6F,即显示数字9)通过PB2串行输入74HC595,通过74HC595(8个输出脚)并行输出给4位数码管的位选。PB4~7与4位数码管的段选
//相连以控制哪一位管显示;
//目的:本例的目的是想在4位数码管上显示4个9。
//本例编译通过,但是烧入单片机数码管不显示。用AVR STUDIO 4仿真,SPDR数据宿存器值如终为0。
#include <avr/io.h>
#define SS 0
#define SCK 1
#define MOSI 2
#define MISO 3
int main(void)
{
DDRC|=(1<<7); //接74HC595的OE脚,13脚,利用此脚关断数码管显示
PORTC|=(1<<7); //接74HC595的OE脚,13脚,利用此脚关断数码管显示
PORTB=0x0F; //PORTB设为00001111,PB0~PB3分别与74HC595相连,SS,SCK,MOSI,MISO
DDRB|=(1<<MOSI)|(1<<SCK)|(1<<SS); //DDRB第0,1,2脚为输出,初始化SPI
SPCR=(1<<SPE)|(1<<MSTR)|(1<<SPR0)|(1<<SPR1); //初始化SPI,SPI允许|主机模式|SCK频率为128分频
PORTB&=~(1<<0); //置PB0(SS脚)为0,
SPDR=0x6f; //向SPI数据宿存器写数据,启动传输(向74HC575)
while(!(SPCR&(1<<SPIF))) //判断发送是否完成,完成则跳出循环
{}
PORTB|=(1<<0); //置PB0为1,结束数据传送
DDRB=0xf0; //DDRB为11110000,PB4~7连4位数码管段选位,以决定哪一位管显示
PORTB=0xf0; //DDRB为11110000,PB4~7连4位数码管段选位,以决定哪一位管显示
} 展开
#include <avr/io.h>
#define SS 0
#define SCK 1
#define MOSI 2
#define MISO 3
int main(void)
{
DDRC|=(1<<7); //接74HC595的OE脚,13脚,利用此脚关断数码管显示
PORTC|=(1<<7); //接74HC595的OE脚,13脚,利用此脚关断数码管显示
PORTB=0x0F; //PORTB设为00001111,PB0~PB3分别与74HC595相连,SS,SCK,MOSI,MISO
DDRB|=(1<<MOSI)|(1<<SCK)|(1<<SS); //DDRB第0,1,2脚为输出,初始化SPI
/** 段选端口配置为输出 */
DDRB |= 0xF0;
SPCR=(1<<SPE)|(1<<MSTR)|(1<<SPR0)|(1<<SPR1); //初始化SPI,SPI允许|主机模式|SCK频率为128分频
PORTB&=~(1<<0); //置PB0(SS脚)为0,
SPDR=0x6f; //向SPI数据宿存器写数据,启动传输(向74HC575)
while(!(SPCR&(1<<SPIF))) //判断发送是否完成,完成则跳出循环
{}
PORTB|=(1<<0); //置PB0为1,结束数据传送
/** 此处不需要再配置IO端口的方向了 */
// DDRB=0xF0; //DDRB为11110000,PB4~7连4位数码管段选位,以决定哪一位管显示
PORTB=0xf0; //DDRB为11110000,PB4~7连4位数码管段选位,以决定哪一位管显示
while(1);
}
这里面我只改了加/***/注释的两个地方。
不是很清楚你的74HC595的ST管脚是如何控制的,移位时钟和存储时钟有个相位差,我改成74HC164了,只用了SPI的两个端口,外加4个段选。看图