书9500 发表于 2016-6-13 20:52:43

亲们,我用STC15W408AS控制TM1618不成功啊,大家帮帮忙。

本帖最后由 书9500 于 2016-6-13 23:22 编辑

这是我画的电路图。

难道电路图有问题吗?


我把代码附上。大家帮忙看看吧。。
void        SPI_config(void)
{
        SPI_InitTypeDef                SPI_InitStructure;
        SPI_InitStructure.SPI_Module    = ENABLE;            //SPI启动    ENABLE, DISABLE
        SPI_InitStructure.SPI_SSIG      = DISABLE;                          //片选位   ENABLE, DISABLE
        SPI_InitStructure.SPI_FirstBit= SPI_LSB;                          //移位方向   SPI_MSB, SPI_LSB
        SPI_InitStructure.SPI_Mode      = SPI_Mode_Master;          //主从选择   SPI_Mode_Master, SPI_Mode_Slave
        SPI_InitStructure.SPI_CPOL      = SPI_CPOL_High;      //时钟相位   SPI_CPOL_High,   SPI_CPOL_Low
        SPI_InitStructure.SPI_CPHA      = SPI_CPHA_1Edge;          //数据边沿   SPI_CPHA_1Edge,SPI_CPHA_2Edge
        SPI_InitStructure.SPI_Interrupt = DISABLE;                          //中断允许   ENABLE,DISABLE
        SPI_InitStructure.SPI_Speed   = SPI_Speed_16;                  //SPI速度    SPI_Speed_4, SPI_Speed_16, SPI_Speed_64, SPI_Speed_128
        SPI_InitStructure.SPI_IoUse   = SPI_P12_P13_P14_P15; //IO口切换   SPI_P12_P13_P14_P15, SPI_P24_P23_P22_P21, SPI_P54_P40_P41_P43
        SPI_Init(&SPI_InitStructure);
       
//        SPI_TxRxMode = SPI_Mode_Master;
//        SPI_SetMode(SPI_Mode_Master);
}



void Write_TM1618_Data(unsigned char SPI_Data)
{
        SPSTAT = SPIF | WCOL; //clear SPI status

        SPDAT =SPI_Data;
        while (!(SPSTAT & SPIF)); //wait send complete
        SPSTAT = SPIF | WCOL; //clear SPI status
//        STB1=1;

}

void Write_TM1618_Com(unsigned char SPI_Data)
{
        STB1=0;                                //CS=0开片选
        SPSTAT = SPIF | WCOL; //clear SPI status
        SPDAT =SPI_Data;
        while (!(SPSTAT & SPIF)); //wait send complete
        SPSTAT = SPIF | WCOL; //clear SPI status
        STB1=1;

}

/******************** 主函数 **************************/
void main(void)
{
        SPI_config();
       
        STB1=1;                                //CS=0开片选

        Write_TM1618_Com(0x00);



        Write_TM1618_Com(0x40);
       
       
        STB1=0;                                //CS=0开片选
        Write_TM1618_Data(0xC0);
       
       
        Write_TM1618_Data(0x1f);
        Write_TM1618_Data(0x18);
       
        Write_TM1618_Data(0x1f);
        Write_TM1618_Data(0x18);
       
        Write_TM1618_Data(0x1f);
        Write_TM1618_Data(0x18);
       
        Write_TM1618_Data(0x1f);
        Write_TM1618_Data(0x18);
       
        STB1=1;                                //CS=0开片选


        Write_TM1618_Com(0x8f);
               
//        STB1=1;                                //CS=0开片选

while(1);
}

lmhtz 发表于 2016-6-13 21:10:13

本帖最后由 lmhtz 于 2016-6-13 21:13 编辑

代码问题吧,不贴上了....

发个供你参考

//****************************************************************
//写入数据
void indate(unsigned char input)
{
    for (i1=0; i1<8; i1++)
    {
                TM1618_CLK=0;            //先将“CLK”清零
                NOP(); NOP(); NOP(); NOP();
                if ((input & 0x01) == 1) TM1618_DIO=1;
                else TM1618_DIO=0;         
                NOP(); NOP(); NOP(); NOP();
                TM1618_CLK=1;            //送时钟的上升沿   
                NOP(); NOP(); NOP(); NOP();
                input = input >> 1; //准备送下一个BIT
    }                     //送完一个字节后退出循环
    TM1618_DIO=1;
    NOP(); NOP(); NOP(); NOP();
}

void Write_COM(unsigned char cmd)                //发送命令字
{
    TM1618_STB=0;            
    NOP(); NOP(); NOP(); NOP();
    indate(cmd);               
    NOP(); NOP(); NOP(); NOP();
    TM1618_STB=1;
}


//****************************************************************
//显示处理
void display(void)
{      
        volatile unsigned char temp;
//---------------------------------------------------------------------------------------------------------------------------
        play_buff = power_play;
        play_buff = power_play;
        play_buff = power_play;
        play_buff = power_play;
//----------------------------------------------------------------------------------------------------------------------------
    TM1618_DIO=1; TM1618_CLK=1; TM1618_STB=1;
    Write_COM(B0000_0000);//工作 4 位 8 段模式
    Write_COM(B0100_0000);//写现实寄存器,地址自动增加
    TM1618_STB=0;
    indate(B1100_0000);        //c0 设置显示地址
//------------------------------------------------
        for (i3=0; i3<4; i3++)
        {
                temp = seg_code_a];
                indate(temp);
                temp = seg_code_b];
                indate(temp);
        }
        TM1618_STB=1;
        Write_COM(B1000_1111);
}

没按键应用,读就不贴了

lmhtz 发表于 2016-6-13 21:10:29

代码问题吧,不贴上了....

书9500 发表于 2016-6-13 21:23:02

本帖最后由 书9500 于 2016-6-13 21:24 编辑

lmhtz 发表于 2016-6-13 21:10
代码问题吧,不贴上了....

发个供你参考


STB你怎么用的?
TM1618_STB=1;
    Write_COM(B0000_0000);//工作 4 位 8 段模式
    Write_COM(B0100_0000);//写现实寄存器,地址自动增加
    TM1618_STB=0;

数据手册上不是说STB下降沿后的第一组数据是命令吗?

书9500 发表于 2016-6-14 00:03:09

lmhtz 发表于 2016-6-13 21:10
代码问题吧,不贴上了....

我试了一下,用模拟时序是好使的,
单是用STC15W的SPI硬件就是不好使的,程序我贴上去了,你能帮我看看嘛?

lmhtz 发表于 2016-6-14 08:25:32

确认 SPI 时序能对上? 高低位都OK? 看一下时钟周期速率,

小李非刀 发表于 2016-6-14 16:08:48

注意SPI速度、相位等等时序是否对。
页: [1]
查看完整版本: 亲们,我用STC15W408AS控制TM1618不成功啊,大家帮帮忙。