久久久国产精品视频袁燕,99re久久精品国产,亚洲欧美日韩国产综合v,天天躁夜夜躁狠狠久久,激情五月婷婷激情五月婷婷

程序小白
認(rèn)證:優(yōu)質(zhì)創(chuàng)作者
作者動(dòng)態(tài)
基于stm32采用PWM驅(qū)動(dòng)伺服控制器學(xué)習(xí)筆記
05-13 15:25
基于STM32驅(qū)動(dòng)TM1638學(xué)習(xí)筆記——軟件篇
04-19 12:42
基于TM1638驅(qū)動(dòng)8位數(shù)碼管設(shè)計(jì)分享
02-24 11:26
RT-Thread驅(qū)動(dòng)之路: Studio創(chuàng)建FAL分區(qū)⑤
01-02 08:30
RT-Thread驅(qū)動(dòng)之路: Studio 掛載通用SPI flash④
2024-12-23 13:41

基于STM32驅(qū)動(dòng)TM1638學(xué)習(xí)筆記——軟件篇


      當(dāng)我們需要通過(guò)單片機(jī)去驅(qū)動(dòng)一款芯片正常工作的時(shí)候,我們第一時(shí)間會(huì)去閱讀它的數(shù)據(jù)手冊(cè),當(dāng)你沒(méi)有接觸過(guò)類似的芯片時(shí)候,這個(gè)時(shí)候越看會(huì)感覺(jué)腦殼越疼,哪怕等你真的驅(qū)動(dòng)它正常工作以后會(huì)發(fā)現(xiàn)原來(lái)它是如此的簡(jiǎn)單。大部分人卡在最難的部分無(wú)疑是時(shí)序上,數(shù)據(jù)手冊(cè)里面給出了時(shí)序的要求如下:

      拋開(kāi)復(fù)雜的時(shí)序,軟件其實(shí)沒(méi)那么復(fù)雜,首先我們要找到連接的引腳,并進(jìn)行初始化:

STM32       TM1638

PA5   ----- CLK

PA6   ----- DIO

PA7   ----- STB

3.3V  ----- VCC

GND   ----- GND

      

// 先定義幾個(gè)"暗號(hào)"
#define TM1638_CLK_PIN  GPIO_PIN_5
#define TM1638_DIO_PIN  GPIO_PIN_6
#define TM1638_STB_PIN  GPIO_PIN_7
#define TM1638_PORT     GPIOA

// 初始化GPIO,相當(dāng)于教STM32怎么"搭訕"
void TM1638_Init(void) {
    GPIO_InitTypeDef GPIO_InitStruct = {0};
    
    __HAL_RCC_GPIOA_CLK_ENABLE();
    
    // CLK和STB是輸出模式,像主動(dòng)出擊的直男
    GPIO_InitStruct.Pin = TM1638_CLK_PIN | TM1638_STB_PIN;
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
    HAL_GPIO_Init(TM1638_PORT, &GPIO_InitStruct);
    
    // DIO是雙向的,時(shí)而輸出時(shí)而輸入,像戀愛(ài)中的忽冷忽熱
    GPIO_InitStruct.Pin = TM1638_DIO_PIN;
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
    HAL_GPIO_Init(TM1638_PORT, &GPIO_InitStruct);
    
    // 先保持高冷姿態(tài)
    TM1638_STB_HIGH();
    TM1638_CLK_HIGH();
}

      接下來(lái),我們需要實(shí)現(xiàn)最終的就是根據(jù)時(shí)序完成一個(gè)字節(jié)的讀取和寫(xiě)入操作:

// 發(fā)送一個(gè)字節(jié),像說(shuō)一句情話
void TM1638_WriteByte(uint8_t data) {
    for(uint8_t i = 0; i < 8; i++) {
        TM1638_CLK_LOW();  // 先低頭示好
        
        // 根據(jù)數(shù)據(jù)位決定是送花(1)還是送巧克力(0)
        if(data & 0x01) {
            TM1638_DIO_HIGH();
        } else {
            TM1638_DIO_LOW();
        }
        
        HAL_Delay(1);  // 停頓一下,別太著急
        TM1638_CLK_HIGH();  // 抬起頭等待回應(yīng)
        HAL_Delay(1);
        
        data >>= 1;  // 準(zhǔn)備下一句情話
    }
}

// 接收一個(gè)字節(jié),像等待對(duì)方回復(fù)
uint8_t TM1638_ReadByte(void) {
    uint8_t data = 0;
    
    // 先把DIO設(shè)置為輸入模式,像豎起耳朵聽(tīng)回復(fù)
    GPIO_InitTypeDef GPIO_InitStruct = {0};
    GPIO_InitStruct.Pin = TM1638_DIO_PIN;
    GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
    GPIO_InitStruct.Pull = GPIO_PULLUP;
    HAL_GPIO_Init(TM1638_PORT, &GPIO_InitStruct);
    
    for(uint8_t i = 0; i < 8; i++) {
        TM1638_CLK_LOW();
        HAL_Delay(1);
        
        // 讀取DIO狀態(tài),像揣摩對(duì)方心思
        if(HAL_GPIO_ReadPin(TM1638_PORT, TM1638_DIO_PIN)) {
            data |= (1 << i);
        }
        
        TM1638_CLK_HIGH();
        HAL_Delay(1);
    }
    
    // 讀完切回輸出模式,繼續(xù)主動(dòng)出擊
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
    HAL_GPIO_Init(TM1638_PORT, &GPIO_InitStruct);
    
    return data;
}

      有了讀取和寫(xiě)入的操作,我們就可以嘗試讓數(shù)碼管顯示一個(gè)數(shù)字,需要自定義顯示的數(shù)組,這個(gè)跟數(shù)碼管的連接相關(guān),這里應(yīng)用共陰極數(shù)碼管,最最通用的連接方式下的數(shù)組定義及顯示函數(shù):

// 顯示數(shù)字,像送出一份禮物
void TM1638_DisplayNum(uint8_t pos, uint8_t num) {
    const uint8_t digitToSegment[] = {
        0x3F,  // 0
        0x06,  // 1
        0x5B,  // 2
        0x4F,  // 3
        0x66,  // 4
        0x6D,  // 5
        0x7D,  // 6
        0x07,  // 7
        0x7F,  // 8
        0x6F   // 9
    };
    
    TM1638_STB_LOW();  // 開(kāi)始深情告白
    TM1638_WriteByte(0x44);  // 固定地址模式
    TM1638_STB_HIGH();
    
    TM1638_STB_LOW();
    TM1638_WriteByte(0xC0 | (pos << 1));  // 設(shè)置顯示位置
    
    // 送出數(shù)字"禮物"
    TM1638_WriteByte(digitToSegment[num]);
    
    TM1638_STB_HIGH();
}

      TM1638還支持軟件設(shè)置數(shù)碼管的顯示亮度,這比我們用三極管調(diào)電阻的方式方便太多了:

// 設(shè)置亮度,像調(diào)節(jié)戀愛(ài)熱度
void TM1638_SetBrightness(uint8_t brightness) {
    // 亮度范圍0-7,7最亮
    brightness = brightness > 7 ? 7 : brightness;
    
    TM1638_STB_LOW();
    TM1638_WriteByte(0x88 | brightness);
    TM1638_STB_HIGH();
}

      除了點(diǎn)數(shù)碼管以外,它還支持掃描按鍵輸入功能(真心對(duì)得起這個(gè)價(jià)格):

// 讀取按鍵狀態(tài),像揣摩對(duì)方心思
uint8_t TM1638_ReadKeys(void) {
    uint8_t keys = 0;
    
    TM1638_STB_LOW();
    TM1638_WriteByte(0x42);  // 讀取按鍵指令
    
    for(uint8_t i = 0; i < 4; i++) {
        keys |= TM1638_ReadByte() << i;
    }
    
    TM1638_STB_HIGH();
    
    return keys;  // 每個(gè)bit代表一個(gè)按鍵狀態(tài)
}

      以下是終極的示例代碼:

int main(void) {
    HAL_Init();
    SystemClock_Config();
    TM1638_Init();
    
    // 先來(lái)個(gè)"自我介紹"
    TM1638_SetBrightness(7);  // 最大亮度示愛(ài)
    
    // 顯示"520"表白
    TM1638_DisplayNum(0, 5);
    TM1638_DisplayNum(1, 2);
    TM1638_DisplayNum(2, 0);
    
    while(1) {
        // 持續(xù)關(guān)注"女神"的反饋(按鍵)
        uint8_t keys = TM1638_ReadKeys();
        
        if(keys != 0) {
            // 如果有按鍵按下,改變顯示內(nèi)容
            TM1638_DisplayNum(3, keys % 10);
        }
        
        HAL_Delay(100);
    }
}

      在實(shí)際調(diào)試中可能會(huì)遇到的問(wèn)題:

1. 數(shù)碼管無(wú)顯示情況

   - 檢查硬件連接,是不是"紅線"(VCC)接錯(cuò)了。

   - 確認(rèn)STM32的GPIO時(shí)鐘已開(kāi)啟,有時(shí)候可以連上示波器調(diào)到觸發(fā)狀態(tài)看下波形。

2.數(shù)碼管顯示亂碼(顯示不正常)

   - 檢查時(shí)序延遲,是不是時(shí)序太快了,示波器該上了。

   - 確認(rèn)數(shù)碼管是共陰還是共陽(yáng)。

3.按鍵讀取數(shù)據(jù)不準(zhǔn)

   - 檢查上拉電阻是否接好。

   - 增加去抖動(dòng)處理。

      到這里本篇的內(nèi)容就結(jié)束了,希望對(duì)大家有所幫助,感謝閱讀!

聲明:本內(nèi)容為作者獨(dú)立觀點(diǎn),不代表電子星球立場(chǎng)。未經(jīng)允許不得轉(zhuǎn)載。授權(quán)事宜與稿件投訴,請(qǐng)聯(lián)系:editor@netbroad.com
覺(jué)得內(nèi)容不錯(cuò)的朋友,別忘了一鍵三連哦!
贊 3
收藏 3
關(guān)注 155
成為作者 賺取收益
全部留言
0/200
成為第一個(gè)和作者交流的人吧