单片机avr128,数码管显示问题,请高人解答以下程序哪错了?

//单片机:AVRATMEGE128频率:8MH//编译环境:AVRGCCWINAVF-20100110AVRSTUDIO4//硬件连接:学习利用AVR128的SPI,7... //单片机:AVR ATMEGE128 频率:8MH
//编译环境: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位数码管段选位,以决定哪一位管显示
}
展开
 我来答
gaplee
2012-06-16 · TA获得超过748个赞
知道小有建树答主
回答量:359
采纳率:0%
帮助的人:395万
展开全部

#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个段选。看图

推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式