STM32F103+TM1638 SPI驱动,非GPIO模拟SPI

STM32F103+TM1638 SPI驱动,非GPIO模拟SPI

由于最近的项目需要用到数码管显示。本想……
废话少说,由于种种原因(偷懒)选用了一片TM1638。现成的开发板,貌似好多示例代码!于是果断入手了一块开发板。上个图
窃取的隔壁老王的图

图是盗用的隔壁老王的,他贴出来的示例代码就是GPIO模拟的SPI。隔壁老王的传送门

开始敲测试代码的时候发现了一个问题,TMD能找到的参考代码都是GPIO模拟的SPI。瞬间有种被骗了的感觉。
算了,只能怪我太年轻。
本着不折腾不是好电工的想法。开始干活了!
现在贴出代码给有需要的电工参考下。
STM32CubeMX 配置
要注意的是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。发现了还请告知!

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是基于HAL库的TM1637数码管显示标准库代码: 首先需要定义TM1637的相关参数: ```c #define TM1637_CLK_Pin GPIO_PIN_8 #define TM1637_CLK_GPIO_Port GPIOA #define TM1637_DIO_Pin GPIO_PIN_9 #define TM1637_DIO_GPIO_Port GPIOA #define TM1637_DIO_1 GPIOA->BSRR = TM1637_DIO_Pin #define TM1637_DIO_0 GPIOA->BRR = TM1637_DIO_Pin #define TM1637_CLK_1 GPIOA->BSRR = TM1637_CLK_Pin #define TM1637_CLK_0 GPIOA->BRR = TM1637_CLK_Pin ``` 然后定义TM1637的相关函数: ```c void TM1637_Start(void) { TM1637_DIO_1; TM1637_CLK_1; HAL_Delay(2); TM1637_DIO_0; } void TM1637_Stop(void) { TM1637_DIO_0; TM1637_CLK_1; HAL_Delay(2); TM1637_DIO_1; } void TM1637_WriteByte(uint8_t data) { uint8_t i; for (i = 0; i < 8; i++) { TM1637_CLK_0; if (data & 0x01) TM1637_DIO_1; else TM1637_DIO_0; data >>= 1; TM1637_CLK_1; } TM1637_CLK_0; TM1637_DIO_1; TM1637_CLK_1; TM1637_DIO_0; } void TM1637_Display(uint8_t *pBuffer) { uint8_t i; TM1637_Start(); TM1637_WriteByte(0x40); TM1637_Stop(); TM1637_Start(); TM1637_WriteByte(0xC0); for (i = 0; i < 4; i++) { TM1637_WriteByte(pBuffer[i]); } TM1637_Stop(); TM1637_Start(); TM1637_WriteByte(0x88); TM1637_Stop(); } ``` 最后,在主函数中调用TM1637_Display函数即可实现数码管的显示: ```c uint8_t pBuffer[4] = {0x00, 0x00, 0x00, 0x00}; while (1) { pBuffer[0] = 0x01; pBuffer[1] = 0x23; pBuffer[2] = 0x45; pBuffer[3] = 0x67; TM1637_Display(pBuffer); HAL_Delay(500); } ``` 以上代码仅供参考,具体实现需要根据实际情况进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值