PIC单片机 SPI数码管显示问题————跪求进来帮助解决一下。非常感谢!!

2019-03-25 19:42发布

本人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);
}   

此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。