|
#include <iom16v.h>
#include <macros.h>
#define uchar unsigned char
#define uint unsigned int
#pragma data:code
flash uchar table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92, 0x82,0xf8,0x80,0x90};
void delay(uchar ms) //延时函数
{
uchar i;
while(ms--)
for(i=0;i<12;i++);
}
void HC_595out(uchar data)
{
PORTB&=~(1<<4); //等待数据传输,595存储寄存器数据不变
SPDR=data; //传输数据
while(!(SPSR&(1<<SPIF)))
PORTB|=(1<<4); //595移位寄存器的数据进入数据存储寄存器,并在数码管上显示
}
void show(uint num)
{
uchar temp;
if(num>9)
{
PORTD=0XBF;
temp=num/10;
HC_595out(table[temp]);
delay(5);
PORTD=0X7F;
temp=num%10;
HC_595out(table[temp]);
delay(5);
}
else
{
PORTD=0X7F;
temp=num;
HC_595out(table[temp]);
delay(5);
}
}
void main()
{
uint i=71;
DDRB=0XFF;PORTB=0XF0;
DDRD=0Xff;PORTD=0X0F; //输出低电平,启用数码管
DDRB|=(1<<5)|(1<<7); //数据放入SPI寄存器中
SPCR=(1<<SPE)|(1<<MSTR)|(1<<SPR1)|(1<<SPR0); //等待数据传输完毕
while(1)
show(i);
}
主函数里,我用i等于0到9时数码管都可以正常显示,而等于两位数的时候也即是上述的程序,数码管却都显示两个7,这到底错在哪里?难道是HC_595out( )函数不支持短时间内显示不同的数?
关键是void show()部分,因为我i等于1到9是数码管都可以正常显示出1到9,所以其他部分应该没问题,而i等于两位数却出问题,这是怎么回事,要如何改正(我是用的是mega16)?
ps: SPI控制寄存器介绍
SPIE SPE DORD MSTR CPOL CPHA SPR1 SPR0
SPIE:中断使能
SPE :SPI使能
DORD:数据次序 1为LSB首先发送,0为MSB首先发送
MSTR:主从选择 1为主,0为从MSTR置位时选择主机模式,否则为从机.如果MSTR为"1",
SS配置为输入,且被拉低,则MSTR 被清零,寄存器SPSR 的SPIF 置位.用户必须重新
设置MSTR 进入主机模式。
CPOL: 时钟极性见ATMEGA16L(中文)P130
CPHA: 时钟相位
SPR1, SPR0: SPI 时钟速率选择1 与0 SPR1 和SPR0 对从机没有影响。 |
阿莫论坛20周年了!感谢大家的支持与爱护!!
月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!
|