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