【1】HC595输出不对头?...解决办法:选罩如择了某位八段,要要延迟一段时间,大约1us这样的,以便保证SPI输出的数据的前沿在SPI_CS之后。另外一个产生错误的可能是“不断检测SPI_READY位”!建议不要接着检测,而是估计发送一个字节所花的时间,再考虑一个延迟。例如,发送一个字节为物埋启10us,则检测之前先延迟6us左右,再检测SPI_READY标志,不影响你的发送速率。这样做的原因是很多SPI核设计不是很好,还有可能是ARM7的IO速率与指令速率匹配。一个IO_R/W周期很长,而一个指令周期很短;
【2】位码不对?...................解决办法:严格检查PORT_DIR,保证引脚配置正确。
--------
长时间不鼓捣这东西了,具体液闷还得请你自己细致测验。
//程序有不足。//
//下面是一个判宏凳595输出的程序,供参考。
//
/********************************************************/
/*
*/
/*将显示数据送入74HC595内部移位寄存器
*/
/*
*/
/********************************************************/
void WR_595(uchar temp)
{
uchar j
for (j = 8j >0j--) {
SDATA_595 = (temp &0x80)
SCLK_595 = 0
//上升沿发生移位
temp = temp <<1
SCLK_595 = 1
}
}
/********************************************************/
/*
*/
/*将移位寄存器内的掘旅数绝宽据锁存到输出寄存器并显示
*/
/*
*/
/********************************************************/
void OUT_595(void)
{
RCK_595 = 1
//上升沿将数据送到输出锁存器
_nop_() _nop_()
RCK_595 = 0
}
/********************************************************/
/*
*/
/*主函数
*/
/*
*/
/********************************************************/
main()
{
uchar tem
uchar i, m
SCLK_595 =0
RCK_595 = 0
oe_595 = 0
for(i = 0i <8i++) {
tem = DAT[i]
//取显示数据
WR_595(tem)
OUT_595()
delay(1000)
}
while(1)
}
对于C8051F330而言,你需要设置好SPI的时序,极性以及空闲时的状态,一般在送完一个字节后,要等待spi中断后,在能进行第二次送数据我截取部分程序给你看看
void SPI_INT(void) //SPI初始化
{
SPI0CFG=0x40
SPI0CN=0x01//0000 0001最后一位是SPI使能位 SPI工作在三线主方式
SPI0CKR=0x0f//SPI 时钟频率设置为100kHz 0x63
IE &= 0xbf //关燃锋闭SPI中断
}
void pio_int(void) // 端口配置皮斗晌
{
XBR0=0x06
XBR1=0x40
P0MDIN=0xff //禁止模拟输入,0为模拟,1为数字
P0MDOUT=0x0d //0为开漏,1为推挽(ff)
P0SKIP=0x08
P1MDIN=0xff
P1MDOUT=0xff//低四位用于138
P1SKIP=0x00
P0=0xff
P1=0xff
}
/***********************/
SPI0DAT = sm[i]
while(!SPIF)
SPIF=0
//这部分就是SPI的传输指令,送一个字节后,等待中断,然后清中断
标志,然后再送
//按照你想要的东西,就可以写成
for(i=0i<12i++)
{
SPI0DAT = sm[i]
while(!SPIF)
SPIF=0
CLK = 1//这个就定义成你595的所存输出
CLK = 0
delay(1)//像你送一个595显示的话,还要延时一下
//如有更多的,就送多次再延时
}
/************************/
我空间有个点阵驱动的程序,销毁你可以去看看
用的就是你的这个单片机
日志名字
QQ空间247519442
C8051F330 16*16点阵(SPI 、SMBus、I2C)PCF8563
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)