亲们,我用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: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);
}
没按键应用,读就不贴了 代码问题吧,不贴上了.... 本帖最后由 书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下降沿后的第一组数据是命令吗? lmhtz 发表于 2016-6-13 21:10
代码问题吧,不贴上了....
我试了一下,用模拟时序是好使的,
单是用STC15W的SPI硬件就是不好使的,程序我贴上去了,你能帮我看看嘛? 确认 SPI 时序能对上? 高低位都OK? 看一下时钟周期速率, 注意SPI速度、相位等等时序是否对。
页:
[1]