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

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

      拋開復(fù)雜的時(shí)序,軟件其實(shí)沒那么復(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í)而輸入,像戀愛中的忽冷忽熱
    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();
}

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

// 發(fā)送一個(gè)字節(jié),像說一句情話
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é),像等待對方回復(fù)
uint8_t TM1638_ReadByte(void) {
    uint8_t data = 0;
    
    // 先把DIO設(shè)置為輸入模式,像豎起耳朵聽回復(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),像揣摩對方心思
        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;
}

      有了讀取和寫入的操作,我們就可以嘗試讓數(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();  // 開始深情告白
    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é)戀愛熱度
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ù)碼管以外,它還支持掃描按鍵輸入功能(真心對得起這個(gè)價(jià)格):

// 讀取按鍵狀態(tài),像揣摩對方心思
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();
    
    // 先來個(gè)"自我介紹"
    TM1638_SetBrightness(7);  // 最大亮度示愛
    
    // 顯示"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ì)遇到的問題:

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

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

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

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

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

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

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

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

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

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

聲明:本內(nèi)容為作者獨(dú)立觀點(diǎn),不代表電子星球立場。未經(jīng)允許不得轉(zhuǎn)載。授權(quán)事宜與稿件投訴,請聯(lián)系:editor@netbroad.com
覺得內(nèi)容不錯(cuò)的朋友,別忘了一鍵三連哦!
贊 3
收藏 3
關(guān)注 151
成為作者 賺取收益
全部留言
0/200
成為第一個(gè)和作者交流的人吧
主站蜘蛛池模板: 亚洲精品一区二区网址 | 国产在线视精品在一区二区 | 久久勉费视频 | 97精品久久中文 | 日本欧美黄色 | 亚洲综合无码久久精品综合 | 大地资源第二页中文高清版 | free性欧美1819护士 | 18日本xxxxxxxxx95 成人午夜免费在线 | 欧美97 | 亚洲区色情区激情区小说色情书 | 日韩欧美在线播放 | 91精品久久久久久久久久不卡 | 日欧一片内射VA在线影院 | 日韩射吧 | 中文字幕乱码亚洲无线码 | 嫩草国产 | 四虎影视永久免费在线观看 | 91视频青娱乐 | 5252aⅴhaose我爱久久 | 日韩色综合 | 亚洲伊人久久综合影院 | 国产农村妇女一区二区三区 | 成人精品视频网站 | 一级二级视频免费观看 | 国产极品美女高潮抽搐免费网站 | 1717she国产精品高清在线观看 | 岛国毛片不卡在线 | 国产高清黄色片 | 国产一级片内射视频 | 日韩欧美的一区二区 | 2021亚洲va在线va天堂va国产 | 国产综合久久一区二区三区 | 蜜桃精品视频 | 欧美XXXXX高潮喷水麻豆 | 91精品国产日韩一区二区三区 | 韩国三级激情吃奶 | 午夜久操 | 欧美猛交xxx | 中文字幕一区二区在线视频 | 久久婷婷成人综合色综合 |