本人PIC单片机新手。 最近用dsPIC30F4013单片机做了一个电路板,其中显示部分是SPI驱动74HC595移位寄存器 数码管显示。 测试电路板的时候首先测的是显示部分,但无论怎么修改程序、配置字都不行 电路板硬件检查了 没问题。 所以很是纠结郁闷,现在都无从下手了, 求高手给解决一下。
单片机没有外画晶振,采用的是内部FRC 目的是:驱动10个数码管从左到右依次显示9到0十个数。 显示部分电路见下图 只截了其中5个数码管。或者程序见附件。
程序如下:
/**********************************************
** 文件名 :dsPIC30F4013.c **
** **
**********************************************/
#include "p30f4013.h" //ds30f4013头文件
_FOSC(CSW_FSCM_OFF&FRC_PLL4);
_FWDT(WDT_OFF);
_FBORPOR(PBOR_OFF&MCLR_EN);
_FGS(CODE_PROT_OFF);
const int Table2[10] = {0x82,0x9f,0xa8,0x89,0x95,0xc1,0xc0,0X8f,0x80,0x81}; // 不带小数点的显示段码表,依顺序为0-9共10个 */
const int Lengths = 1;
//系统初始化子程序,放在程序首部
void InitializeSys()
{
SRbits.IPL = 7; //关闭所有可屏蔽中断
}
//SPI输出初始化子程序
void InitializeSPIOut()
{
// TRISF = TRISF&0xff97; //RF3、RF5、RF6输出
// SPI1CON = 0x0379; // 字节通讯模式,CKP=1,CKE=1,FOSC/32,时钟上升沿发送数据
// SPI1STATbits.SPIEN = 1; //SPI1EN=1
// IFS0bits.SPI1IF = 0; // 清除SPI1IF标志
TRISF = 0X0000; //RF3、RF5、RF6输出
IFS0bits.SPI1IF=0; /*清除SSPIF标志*/
SPI1CONbits.MSTEN=1;
SPI1CONbits.CKP=1;
SPI1CONbits.SSEN=0;
SPI1CONbits.CKE=1;
SPI1STATbits.SPIEN=1;
}
//在十个数码管上显示Lens长度的数据
void DisplayOnLED(int Lens)
{
int i=0;
PORTFbits.RF5 = 0; //RF5送低电平,给SPIOut输出锁存做准备
for(i=0; i<Lens; i++) //显示所要求的内容
{
SPI1BUF = Table2
;
while(SPI1STATbits.SPITBF == 1);
}
SPI1BUF=0xff;
while(SPI1STATbits.SPITBF==1);
PORTFbits.RF5 = 1; //给锁存信号,显示数据
}
void main()
{
InitializeSys();
InitializeSPIOut();
DisplayOnLED(Lengths);
while(1);
}
此帖出自小平头技术问答
一周热门 更多>