熱門(mén): 51單片機(jī) | 24小時(shí)必答區(qū) | 單片機(jī)教程 | 單片機(jī)DIY制作 | STM32 | Cortex M3 | 模數(shù)電子 | 電子DIY制作 | 音響/功放 | 拆機(jī)樂(lè)園 | Arduino | 嵌入式OS | 程序設(shè)計(jì)
|
發(fā)布時(shí)間: 2018-3-25 08:08
正文摘要:TM1650模塊子函數(shù),歡迎下載測(cè)試應(yīng)用. 取之于網(wǎng)絡(luò),分享給大家 單片機(jī)源程序如下: #include<STC12C5A.h> #include"tm1650.h" void Delay_us(uint i) //us延時(shí) { for ... |
|
正在看規(guī)格書(shū)寫(xiě)1650的程序,還沒(méi)有拿到板子上面測(cè)試。看了樣例程序,對(duì)于有的師兄說(shuō)按鍵掃描沒(méi)有反應(yīng),可能是有的單片機(jī)的端口輸入和輸出狀態(tài)要單獨(dú)設(shè)定,而樣例里面的單片機(jī)可能是不用設(shè)定的。 我這邊看規(guī)格書(shū)的時(shí)候也有個(gè)疑問(wèn),按鍵讀取的時(shí)候,只有一個(gè)字節(jié),又不區(qū)分地址,怎么能讀取28個(gè)按鍵呢? 問(wèn)了代理,說(shuō)是晚上回復(fù)。 |
| 對(duì)比新舊版本規(guī)格書(shū),發(fā)現(xiàn)舊版本TM1650的讀按鍵命令是0x49,而新版本的命令則是0x4F。新版本不能讀按鍵的可以修改一下試試(舊版本批號(hào)首位位是1,新版本批號(hào)首位是2). |
haide1998 發(fā)表于 2022-8-30 15:29 如果我沒(méi)有理解錯(cuò),這個(gè)玩意用的是串行信號(hào),對(duì)應(yīng)地址的存儲(chǔ)單元位,對(duì)應(yīng)著一個(gè)LED.對(duì)應(yīng)關(guān)系IC說(shuō)明書(shū)可查。唯一要弄明白的就是,串行信號(hào)的傳輸規(guī)則。 |
| 哪位高手把四位數(shù)碼管分離成28個(gè)LED,用于分別指示28個(gè)按鍵的執(zhí)行情況可好 |
| 學(xué)習(xí)一下!不錯(cuò)的例程 |
| 挺好的資料,學(xué)習(xí)了,謝謝樓主 |
本帖最后由 什么都不懂啊 于 2021-11-11 19:07 編輯 shupeiyu 發(fā)表于 2021-8-6 10:32 sbit CY = PSW^7; |
DIO = CY; cy是什么![]() |
| 這個(gè)程序不錯(cuò),參考下 |
雪城 發(fā)表于 2020-10-11 11:24 TRI_DAT = 1; //數(shù)據(jù)端口位輸入模式 TRI_DAT = 0; //數(shù)據(jù)端口位輸出模式 這個(gè)數(shù)據(jù)端口位,在嗎定義的? |
liuzhengduo16 發(fā)表于 2018-10-22 15:02 ASK錯(cuò)了 |
fox1357 發(fā)表于 2020-8-1 16:42 ASK 是錯(cuò)的 試試我改的 /****************************************************************************** * 函 數(shù) 名: Ask1650(void) * 函數(shù)功能: ACK信號(hào) * 入口函數(shù): 無(wú) * 返 回: 無(wú) *******************************************************************************/ void Ask1650(void)//ACK信號(hào) { int timeout = 1; TRI_DAT = 1; //數(shù)據(jù)端口位輸入模式 Delay_us(5); while((DIO)&&(timeout<=300)) //延時(shí)等待反饋信號(hào) { timeout++; } CLK = 1; Delay_us(5); CLK = 0; TRI_DAT = 0; //數(shù)據(jù)端口位輸出模式 } |
|
程序 ACK 是錯(cuò)的 試了好久鍵盤(pán)讀不出鍵值 最后發(fā)現(xiàn)詢(xún)問(wèn)SDA下拉提前了一個(gè)脈沖 uchar BL = 2; //亮度等級(jí) uchar CODE[11] = { 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0xff}; //0~9顯示代碼 // 0 1 2 3 4 5 6 7 8 9 a void TM1650(uchar B1,uchar B2, uchar B3 ,uchar B4) { uchar temp[5],temp1[5]; uchar i; temp[1] = B1; temp[2] = B2; temp[3] = B3; temp[4] = B4; temp1[1]=temp[1] ; temp1[2]=temp[2] ; temp1[3]=temp[3] ; temp1[4]=temp[4] ; for( i=1 ; i < 5 ; i++ ) { if (temp[i] == 97) { temp1[i] = 10; } } Set1650(0x48,(BL*16+0x01)); //打開(kāi)顯示 調(diào)節(jié)灰度 Set1650(0x68, CODE[temp1[1]]);//數(shù)碼管顯示 Set1650(0x6a, CODE[temp1[2]]);//數(shù)碼管顯示 Set1650(0x6c, CODE[temp1[3]]);//數(shù)碼管顯示 Set1650(0x6e, CODE[temp1[4]]);//數(shù)碼管顯示 } /****************************************************************************** * 函 數(shù) 名: InitTM1650(void) * 函數(shù)功能: 初始化TM1650 * 入口函數(shù): 無(wú) * 返 回: 無(wú) *******************************************************************************/ void InitTM1650(void) { TRI_CLK = 0; //設(shè)置端口位輸出模式 TRI_DAT = 0; //設(shè)置端口位輸出模式 WPUA |= 0x20; //設(shè)置 RA5 RA4弱上拉 Set1650(0x48,(BL*16+0x01));//設(shè)定亮度,開(kāi)顯示八段顯示方式,后一個(gè)字節(jié)中高位用于亮度,低位用于七段或八段顯示方式和開(kāi)關(guān)顯 //如:0x71為七級(jí)亮度,八段顯示方式,開(kāi)顯示;0x79為為七級(jí)亮度,七段顯示方式,開(kāi)顯示 } /****************************************************************************** * 函 數(shù) 名: Set1650(uchar add,uchar dat) * 函數(shù)功能: 按鍵掃描 寫(xiě)顯存必須從高地址開(kāi)始寫(xiě) * 入口函數(shù): add 地址 dat 數(shù)據(jù) * 返 回: 無(wú) *******************************************************************************/ void Set1650(uchar add,uchar dat)//數(shù)碼管顯示 { Start1650(); //開(kāi)始 WrByte1650(add); //第一個(gè)顯存地址 Ask1650(); WrByte1650(dat); //第一個(gè)顯示數(shù)據(jù) Ask1650(); Stop1650(); //停止 } /****************************************************************************** * 函 數(shù) 名: Scan_Key(void) * 函數(shù)功能: 按鍵掃描 * 入口函數(shù): 無(wú) * 返 回: rekey 按鍵掃描結(jié)果 *******************************************************************************/ uchar Scan_Key(void) // 按鍵掃描 { uchar i; uchar rekey; Start1650(); //開(kāi)始 WrByte1650(0x49); //讀按鍵命令 Ask1650(); //ASK //DIO = 1 ; TRI_DAT = 1; //數(shù)據(jù)端口位輸入模式 Delay_us(1); for(i=0;i<8;i++) { CLK = 1; rekey = rekey<<1; if(DIO) { rekey++; } Delay_us(5); CLK = 0; Delay_us(1); } TRI_DAT = 0; //數(shù)據(jù)端口位輸出模式 Ask1650(); //ASK Stop1650(); //停止 return(rekey); } /****************************************************************************** * 函 數(shù) 名: WrByte1650(uchar oneByte) * 函數(shù)功能: 寫(xiě)一個(gè)字節(jié) * 入口函數(shù): oneByte 要寫(xiě)入的字節(jié) * 返 回: 無(wú) *******************************************************************************/ void WrByte1650(uchar oneByte)//寫(xiě)一個(gè)字節(jié) 高位在前,低位在后 { uchar i; CLK = 0; Delay_us(5); for(i=0;i<8;i++) { oneByte = oneByte<<1; DIO = nC ; //進(jìn)位標(biāo)志 溢出1 空位0 CLK = 0; Delay_us(5); CLK = 1; Delay_us(5); CLK = 0; } } /****************************************************************************** * 函 數(shù) 名: Stop1650(void) * 函數(shù)功能: 停止信號(hào) * 入口函數(shù): 無(wú) * 返 回: 無(wú) *******************************************************************************/ void Stop1650(void)//停止信號(hào) { CLK = 1; DIO = 0; Delay_us(5); DIO = 1; } /****************************************************************************** * 函 數(shù) 名: Ask1650(void) * 函數(shù)功能: ACK信號(hào) * 入口函數(shù): 無(wú) * 返 回: 無(wú) *******************************************************************************/ void Ask1650(void)//ACK信號(hào) { int timeout = 1; TRI_DAT = 1; //數(shù)據(jù)端口位輸入模式 Delay_us(5); while((DIO)&&(timeout<=300)) //延時(shí)等待反饋信號(hào) { timeout++; } CLK = 1; Delay_us(5); CLK = 0; TRI_DAT = 0; //數(shù)據(jù)端口位輸出模式 } /****************************************************************************** * 函 數(shù) 名: Start1650(void) * 函數(shù)功能: 開(kāi)始信號(hào) * 入口函數(shù): 無(wú) * 返 回: 無(wú) *******************************************************************************/ void Start1650(void)//開(kāi)始信號(hào) { CLK = 1; DIO = 1; Delay_us(5); DIO = 0; } /****************************************************************************** * 函 數(shù) 名: Delay_us(uint i) * 函數(shù)功能: us延時(shí) * 入口函數(shù): i 延時(shí)長(zhǎng)度 * 返 回: 無(wú) *******************************************************************************/ void Delay_us(uint i)//us延時(shí) { for(;i>0;i--) { NOP(); NOP(); NOP(); NOP(); NOP(); } } |
fox1357 發(fā)表于 2020-8-1 16:42 我大概明白了,這個(gè)芯片無(wú)法判斷兩個(gè)按鍵,0-255只需要返回一個(gè)值,就代表某一個(gè)具體按鍵。 |
| 正在找這個(gè)內(nèi)容,多謝樓主; |
| 請(qǐng)問(wèn)這款蕊片需要用戶(hù)主動(dòng)掃描嗎?還是寫(xiě)入數(shù)據(jù)后,蕊片自動(dòng)刷新? |
liuzhengduo16 發(fā)表于 2018-10-22 15:02 你的問(wèn)題解決了嗎,我也要碰上SC的單片機(jī),不能讀按鍵 |
| 謝謝了 |
| 謝樓主分享了。學(xué)習(xí)學(xué)習(xí) |
| !好東西 |
| 很好,但是沒(méi)有黑幣了、、、 |
| 謝謝了 |
安靜的麻瓜 發(fā)表于 2019-1-4 14:50 51的升級(jí)版 也屬于51 |
| 主函數(shù)部分沒(méi)有嗎 主要是按鍵掃描判斷 有點(diǎn)搞不懂 |
| 謝了! |
| 請(qǐng)問(wèn),這個(gè)是pic的還是51的,我是個(gè)新手 求指教呀 |
|
下來(lái)看看是否適合 |
| 謝謝了 |
| 我想問(wèn)一下,我用賽元的MCU驅(qū)動(dòng)的這個(gè)芯片,為什么按鍵掃描的時(shí)候按鍵沒(méi)有任何反應(yīng)呢 |
| 這個(gè)程序不錯(cuò),找了好久總算找到合適的方案了 |
Powered by 單片機(jī)教程網(wǎng)