STM32F103+TM1638 SPI驱动,非GPIO模拟SPI
由于最近的项目需要用到数码管显示。本想……
废话少说,由于种种原因(偷懒)选用了一片TM1638。现成的开发板,貌似好多示例代码!于是果断入手了一块开发板。上个图
图是盗用的隔壁老王的,他贴出来的示例代码就是GPIO模拟的SPI。隔壁老王的传送门
开始敲测试代码的时候发现了一个问题,TMD能找到的参考代码都是GPIO模拟的SPI。瞬间有种被骗了的感觉。
算了,只能怪我太年轻。
本着不折腾不是好电工的想法。开始干活了!
现在贴出代码给有需要的电工参考下。
要注意的是Baud Rate。TM1638的说明书中的频率是不超过1MHz 占空比50% 。没试过是不是能超过1M。
以下是SPI驱动代码
__weak void Enable_TM1638(void)
{
//TM1638片选使能
}
__weak void Disable_TM1638(void)
{
//TM1638片选失能
}
void Write_Byte(uint8_t Byte)
{
Enable_TM1638();
HAL_SPI_Transmit(&hspi1, &Byte, 1, 100);
Disable_TM1638();
}
void Write_Bytes(char *Byte, uint8_t len)
{
Enable_TM1638();
HAL_SPI_Transmit(&hspi1, (uint8_t *)Byte, len, 100);
Disable_TM1638();
}
void Write_Read_Bytes(char *Byte, uint8_t len, char *Rerurn_Byte, uint8_t Rerurn_len)
{
Enable_TM1638();
HAL_SPI_Transmit(&hspi1, (uint8_t *)Byte, len, 100);
memset(Rerurn_Byte, 0, Rerurn_len);
HAL_SPI_Receive(&hspi1, (uint8_t *)Rerurn_Byte, Rerurn_len, 100);
Disable_TM1638();
}
//使用地址自增方式从指定位置写入连续数据
void Write_Bytes_2_RAM(uint8_t Add, char *Data, uint8_t len)
{
Write_Byte(0x40); //设置地址增加模式
char buffer[20];
buffer[0] = 0xc0 | Add;
memcpy(&buffer[1], Data, len);
Write_Bytes(buffer, len + 1); //发送数据
}
//写入一个字节到指定地址的显存
void Write_Byte_2_RAM(uint8_t Add, char Data)
{
Write_Byte(0x44); //设置为固定地址模式
char buffer[2];
buffer[0] = 0xc0 | Add; //设定地址
buffer[1] = Data;
Write_Bytes(buffer, 2); //发送数据
}
//读取所有按键值
void Read_Key(char *Data, uint8_t len)
{
char buffer[2];
buffer[0] = 0x42;
Write_Read_Bytes(buffer, 1, Data, len);
}
//设定显示亮度
void Set_lith(uint8_t lith)
{
if (lith >= 7)
{
lith = 0x07;
}
lith |= 0x88;
Write_Byte(lith);
}
到这里我的任务就结束了。剩下的至于怎么显示数字,怎么获取按键。请从传送门去扒。
代码匆匆写完点亮了灯就贴出来了,没注意是否有bug。发现了还请告知!