![]() |
再頂一下,望前輩指點 |
188610329 發表于 2023-3-9 13:22 前輩,請教一下,我的板子上上拉10K也有,101的電容也有,三條線還串聯了180電阻。顯示和按鍵都正常使用,但是在強電磁干擾下會讀到很多意外的按鍵,甚至亮度都會變成最低,這個怎樣解決? |
要得到TM1638按鍵返回值,需要進行以下步驟: 初始化TM1638控制器:在程序中通過SPI接口向TM1638控制器寫入數據,對其進行初始化。具體的初始化操作可以參考TM1638的數據手冊。 讀取按鍵狀態:通過讀取TM1638控制器內部的寄存器,可以得到按鍵的狀態。具體的讀取操作可以參考TM1638的數據手冊。 解析按鍵狀態:得到按鍵狀態后,需要進行解析,以得到按鍵的返回值。TM1638控制器可以同時檢測多個按鍵的狀態,因此需要對返回值進行判斷,以確定哪個按鍵被按下。 以下是一個簡單的示例程序,用于從TM1638控制器讀取按鍵狀態: #include <reg52.h> #include <intrins.h> #define uchar unsigned char #define uint unsigned int sbit STB = P1^0; // TM1638控制引腳1 sbit CLK = P1^1; // TM1638控制引腳2 sbit DIO = P1^2; // TM1638控制引腳3 void tm1638_write(uint address, uchar data) { STB = 0; // 開始傳輸數據 spi_write(address); // 發送地址 spi_write(data); // 發送數據 STB = 1; // 停止傳輸數據 } uchar tm1638_read(uint address) { uchar data; STB = 0; // 開始傳輸數據 spi_write(address | 0x02); // 發送讀取命令和地址 data = spi_read(); // 讀取數據 STB = 1; // 停止傳輸數據 return data; } uchar get_key(void) { uchar key_code = tm1638_read(0x42); // 讀取按鍵狀態 switch (key_code) { case 0x01: // 第1個按鍵被按下 return 1; case 0x02: // 第2個按鍵被按下 return 2; case 0x04: // 第3個按鍵被按下 return 3; case 0x08: // 第4個按鍵被按下 return 4; case 0x10: // 第5個按鍵被按下 return 5; case 0x20: // 第6個按鍵被按下 return 6; case 0x40: // 第7個按鍵被按下 return 7; case 0x80: // 第8個按鍵被按下 return 8; default: return } return key_code; } |
TM1638 按要求是 需要在 DIO 放置 10K 上拉 以及 100P 電容濾波的,你買的現成板子大概率 沒有加這個部分的,那么如果 12T 的學習板單片機操作(速度慢板載有上拉) 一般是沒有這個問題的,但是遇到 STC8 這種1T單片機,你就要在 CLK =0 之后給與足夠的 延時等待,以及IO口 要設置內部上拉開,并且不是推挽模式,才能讀到正確的鍵值。 |
![]() 我看不懂樓主的語言,我只知道匯編,我用過這個1638和樓主一樣很熟悉,思路應該是一樣的 這個1638按鍵沒有返回概念,用它的按鍵只能一直不停讀取鍵值,好像一共三個字節 ,每一個按鍵對應一個位數據,然后把固定的鍵值做比對,對上就說明按鍵按下,再去 執行,提醒樓主,同一個讀鍵腳上的按鍵不一定在同一個字節里 |