99久久全国免费观看_国产一区二区三区四区五区VM_久久www人成免费看片中文_国产高清在线a视频大全_深夜福利www_日韩一级成人av

基于STM32驅動TM1638學習筆記——軟件篇


      當我們需要通過單片機去驅動一款芯片正常工作的時候,我們第一時間會去閱讀它的數據手冊,當你沒有接觸過類似的芯片時候,這個時候越看會感覺腦殼越疼,哪怕等你真的驅動它正常工作以后會發現原來它是如此的簡單。大部分人卡在最難的部分無疑是時序上,數據手冊里面給出了時序的要求如下:

      拋開復雜的時序,軟件其實沒那么復雜,首先我們要找到連接的引腳,并進行初始化:

STM32       TM1638

PA5   ----- CLK

PA6   ----- DIO

PA7   ----- STB

3.3V  ----- VCC

GND   ----- GND

      

// 先定義幾個"暗號"
#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,相當于教STM32怎么"搭訕"
void TM1638_Init(void) {
    GPIO_InitTypeDef GPIO_InitStruct = {0};
    
    __HAL_RCC_GPIOA_CLK_ENABLE();
    
    // CLK和STB是輸出模式,像主動出擊的直男
    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是雙向的,時而輸出時而輸入,像戀愛中的忽冷忽熱
    GPIO_InitStruct.Pin = TM1638_DIO_PIN;
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
    HAL_GPIO_Init(TM1638_PORT, &GPIO_InitStruct);
    
    // 先保持高冷姿態
    TM1638_STB_HIGH();
    TM1638_CLK_HIGH();
}

      接下來,我們需要實現最終的就是根據時序完成一個字節的讀取和寫入操作:

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

// 接收一個字節,像等待對方回復
uint8_t TM1638_ReadByte(void) {
    uint8_t data = 0;
    
    // 先把DIO設置為輸入模式,像豎起耳朵聽回復
    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狀態,像揣摩對方心思
        if(HAL_GPIO_ReadPin(TM1638_PORT, TM1638_DIO_PIN)) {
            data |= (1 << i);
        }
        
        TM1638_CLK_HIGH();
        HAL_Delay(1);
    }
    
    // 讀完切回輸出模式,繼續主動出擊
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
    HAL_GPIO_Init(TM1638_PORT, &GPIO_InitStruct);
    
    return data;
}

      有了讀取和寫入的操作,我們就可以嘗試讓數碼管顯示一個數字,需要自定義顯示的數組,這個跟數碼管的連接相關,這里應用共陰極數碼管,最最通用的連接方式下的數組定義及顯示函數:

// 顯示數字,像送出一份禮物
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();  // 開始深情告白
    TM1638_WriteByte(0x44);  // 固定地址模式
    TM1638_STB_HIGH();
    
    TM1638_STB_LOW();
    TM1638_WriteByte(0xC0 | (pos << 1));  // 設置顯示位置
    
    // 送出數字"禮物"
    TM1638_WriteByte(digitToSegment[num]);
    
    TM1638_STB_HIGH();
}

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

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

      除了點數碼管以外,它還支持掃描按鍵輸入功能(真心對得起這個價格):

// 讀取按鍵狀態,像揣摩對方心思
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;  // 每個bit代表一個按鍵狀態
}

      以下是終極的示例代碼:

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

      在實際調試中可能會遇到的問題:

1. 數碼管無顯示情況

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

   - 確認STM32的GPIO時鐘已開啟,有時候可以連上示波器調到觸發狀態看下波形。

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

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

   - 確認數碼管是共陰還是共陽。

3.按鍵讀取數據不準

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

   - 增加去抖動處理。

      到這里本篇的內容就結束了,希望對大家有所幫助,感謝閱讀!

聲明:本內容為作者獨立觀點,不代表電子星球立場。未經允許不得轉載。授權事宜與稿件投訴,請聯系:editor@netbroad.com
覺得內容不錯的朋友,別忘了一鍵三連哦!
贊 3
收藏 3
關注 149
成為作者 賺取收益
全部留言
0/200
成為第一個和作者交流的人吧
主站蜘蛛池模板: 欧美日韩亚洲免费 | 日韩一区二区三区四区在线 | 斗罗大陆4终极斗罗免费观看 | 国产色产综合色产在线观看视频 | 色图久久 | 国产偷国产偷亚洲高清日韩 | 黄色一级在线视频 | 四虎国产成人 | 久草视频免费观 | 日本不卡免费在线观看 | 欧美日韩一区二区国产 | 欧洲成人午夜精品无码区久久 | 亚洲一级视频在线观看 | 黑人巨大精品欧美久久 | 中文天堂在线观看 | 久久精品国产亚洲aⅴ瑜伽 操处女逼小说 | 每日更新在线观看AV | 精品国产乱码一区二区三区 | 亚洲精品成人三区 | 91久久夜色精品国产网站 | japanese乱人伦精品 | 无码人中文字幕 | 北条麻妃国产九九九精品视频 | 性夜影院爽黄A爽免费 | 天天草夜夜骑 | 给老师下药挺进她的身体 | 国产aV永久精品无码 | 久久久www视频 | 在线aⅴ免费 | 国产成人精品久久二区二区 | 亚洲欧美闷骚少妇影院 | 亚洲7天堂人人爽人人爽 | 国产亚洲精品欧洲在线观看 | 视频免费一区 | 亚洲成人999| 欧美人与禽猛交乱配视频 | 又大又粗又爽免费视频a片 婷婷五月综合丁香在线 | 色窝窝无码一区二区三区 | 这里只有精品免费 | 亚洲国产成人精品无码一区二区 | 欧美va免费高清在线观看 |