找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 20962|回復: 30
打印 上一主題 下一主題
收起左側(cè)

TM1650模塊單片機源程序(子函數(shù))

  [復制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:23844 發(fā)表于 2018-3-25 08:08 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
TM1650模塊子函數(shù),歡迎下載測試應用. 取之于網(wǎng)絡,分享給大家

單片機源程序如下:
  1. #include<STC12C5A.h>
  2. #include"tm1650.h"
  3. void Delay_us(uint i) //us延時
  4. {
  5.         for(;i>0;i--)
  6.         {
  7.         _nop_();
  8. //        _nop_();
  9. //        _nop_();
  10.         }
  11. }
  12. void I2CStart(void)        //開始信號
  13. {
  14.         CLK_H;
  15.         DIO_H;
  16.         Delay_us(5);
  17.         DIO_L;
  18.         
  19. }

  20. void I2Cask(void) //ACK信號
  21. {
  22.         uchar timeout = 1;
  23.         CLK_H;
  24.         Delay_us(5);
  25.         CLK_L;
  26.         while((DIO)&&(timeout<=100))
  27.         {
  28.           timeout++;        
  29.         }
  30.         Delay_us(5);
  31.         CLK_L;
  32. }

  33. void I2CStop(void) //停止信號
  34. {
  35.         CLK_H;
  36.         DIO_L;
  37.         Delay_us(5);
  38.         DIO_H;
  39. }

  40. void I2CWrByte(uchar oneByte) //寫一個字節(jié)高位在前,低位在后
  41. {
  42.         uchar i;
  43.         CLK_L;
  44.         Delay_us(1);
  45.         for(i=0;i<8;i++)
  46.         {        
  47.                 oneByte = oneByte<<1;
  48.                 DIO = CY;
  49.                 CLK_L;
  50.                 Delay_us(5);
  51.                 CLK_H;
  52.                 Delay_us(5);
  53.                 CLK_L;
  54.         }
  55. }

  56. uchar Scan_Key(void)          // 按鍵掃描
  57. {
  58.         uchar i;
  59.         uchar rekey;
  60.         I2CStart();
  61.         I2CWrByte(0x49);//讀按鍵命令
  62.         I2Cask();
  63.         //DIO_H;
  64.         for(i=0;i<8;i++)
  65.         {
  66.            CLK_H;
  67.            rekey = rekey<<1;
  68.            if(DIO)
  69.            {
  70.                    rekey++;
  71.            }
  72.            Delay_us(5);
  73.            CLK_L;        
  74.         }
  75.         I2Cask();
  76.         I2CStop();
  77.         return(rekey);
  78. }


  79. void TM1650_Set(uchar add,uchar dat) //數(shù)碼管顯示
  80. {
  81.         //寫顯存必須從高地址開始寫
  82.         I2CStart();
  83.         I2CWrByte(add); //第一個顯存地址
  84.         I2Cask();
  85.         I2CWrByte(dat);
  86.         I2Cask();
  87.         I2CStop();
  88. }
復制代碼

所有資料51hei提供下載:
TM1650.rar (1.01 KB, 下載次數(shù): 597)


評分

參與人數(shù) 2黑幣 +55 收起 理由
supermcu8 + 5 共享資料的黑幣獎勵!
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏19 分享淘帖 頂3 踩
回復

使用道具 舉報

來自 2#
ID:386669 發(fā)表于 2020-8-1 16:42 | 只看該作者
正在看規(guī)格書寫1650的程序,還沒有拿到板子上面測試?戳藰永绦,對于有的師兄說按鍵掃描沒有反應,可能是有的單片機的端口輸入和輸出狀態(tài)要單獨設定,而樣例里面的單片機可能是不用設定的。
我這邊看規(guī)格書的時候也有個疑問,按鍵讀取的時候,只有一個字節(jié),又不區(qū)分地址,怎么能讀取28個按鍵呢?
問了代理,說是晚上回復。
回復

使用道具 舉報

板凳
ID:39626 發(fā)表于 2018-9-17 20:12 | 只看該作者
這個程序不錯,找了好久總算找到合適的方案了
回復

使用道具 舉報

地板
ID:289967 發(fā)表于 2018-10-22 15:02 | 只看該作者
我想問一下,我用賽元的MCU驅(qū)動的這個芯片,為什么按鍵掃描的時候按鍵沒有任何反應呢
回復

使用道具 舉報

5#
ID:106045 發(fā)表于 2018-11-28 16:35 | 只看該作者
謝謝了
回復

使用道具 舉報

6#
ID:310569 發(fā)表于 2018-12-21 21:17 | 只看該作者
下來看看是否適合
回復

使用道具 舉報

7#
ID:461792 發(fā)表于 2019-1-4 14:50 | 只看該作者
請問,這個是pic的還是51的,我是個新手  求指教呀
回復

使用道具 舉報

8#
ID:374174 發(fā)表于 2019-4-25 20:22 | 只看該作者
謝了!
回復

使用道具 舉報

9#
ID:314601 發(fā)表于 2019-4-30 13:06 | 只看該作者
主函數(shù)部分沒有嗎     主要是按鍵掃描判斷       有點搞不懂
回復

使用道具 舉報

10#
ID:314601 發(fā)表于 2019-4-30 13:06 | 只看該作者
安靜的麻瓜 發(fā)表于 2019-1-4 14:50
請問,這個是pic的還是51的,我是個新手  求指教呀

51的升級版   也屬于51
回復

使用道具 舉報

11#
ID:486481 發(fā)表于 2019-5-17 16:55 | 只看該作者
謝謝了
回復

使用道具 舉報

12#
ID:493236 發(fā)表于 2019-5-27 14:53 | 只看該作者
很好,但是沒有黑幣了、、、
回復

使用道具 舉報

13#
ID:479519 發(fā)表于 2019-7-3 13:12 | 只看該作者
!好東西
回復

使用道具 舉報

14#
ID:295805 發(fā)表于 2019-7-26 16:05 | 只看該作者
謝樓主分享了。學習學習
回復

使用道具 舉報

15#
ID:636445 發(fā)表于 2019-11-6 08:31 | 只看該作者
謝謝了
回復

使用道具 舉報

16#
ID:263951 發(fā)表于 2020-1-11 20:40 | 只看該作者
liuzhengduo16 發(fā)表于 2018-10-22 15:02
我想問一下,我用賽元的MCU驅(qū)動的這個芯片,為什么按鍵掃描的時候按鍵沒有任何反應呢

你的問題解決了嗎,我也要碰上SC的單片機,不能讀按鍵
回復

使用道具 舉報

17#
ID:242109 發(fā)表于 2020-5-18 10:31 | 只看該作者
請問這款蕊片需要用戶主動掃描嗎?還是寫入數(shù)據(jù)后,蕊片自動刷新?
回復

使用道具 舉報

18#
ID:791173 發(fā)表于 2020-6-27 22:30 | 只看該作者
正在找這個內(nèi)容,多謝樓主;
回復

使用道具 舉報

19#
ID:386669 發(fā)表于 2020-8-1 17:53 | 只看該作者
fox1357 發(fā)表于 2020-8-1 16:42
正在看規(guī)格書寫1650的程序,還沒有拿到板子上面測試。看了樣例程序,對于有的師兄說按鍵掃描沒有反應,可能 ...

我大概明白了,這個芯片無法判斷兩個按鍵,0-255只需要返回一個值,就代表某一個具體按鍵。
回復

使用道具 舉報

20#
ID:828202 發(fā)表于 2020-10-11 11:22 | 只看該作者
程序 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; //設置端口位輸出模式
    TRI_DAT = 0; //設置端口位輸出模式
    WPUA |= 0x20; //設置 RA5 RA4弱上拉
    Set1650(0x48,(BL*16+0x01));//設定亮度,開顯示八段顯示方式,后一個字節(jié)中高位用于亮度,低位用于七段或八段顯示方式和開關顯
                               //如: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();
    }
}
回復

使用道具 舉報

21#
ID:828202 發(fā)表于 2020-10-11 11:24 | 只看該作者
fox1357 發(fā)表于 2020-8-1 16:42
正在看規(guī)格書寫1650的程序,還沒有拿到板子上面測試?戳藰永绦,對于有的師兄說按鍵掃描沒有反應,可能 ...

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ù)端口位輸出模式

}
回復

使用道具 舉報

22#
ID:828202 發(fā)表于 2020-10-11 11:25 | 只看該作者
liuzhengduo16 發(fā)表于 2018-10-22 15:02
我想問一下,我用賽元的MCU驅(qū)動的這個芯片,為什么按鍵掃描的時候按鍵沒有任何反應呢

ASK錯了
回復

使用道具 舉報

23#
ID:316803 發(fā)表于 2020-11-10 17:12 | 只看該作者
雪城 發(fā)表于 2020-10-11 11:24
ASK 是錯的  試試我改的
/************************************************************************* ...

TRI_DAT = 1;              //數(shù)據(jù)端口位輸入模式
TRI_DAT = 0;              //數(shù)據(jù)端口位輸出模式

這個數(shù)據(jù)端口位,在嗎定義的?
回復

使用道具 舉報

24#
ID:217038 發(fā)表于 2020-11-15 14:58 | 只看該作者
這個程序不錯,參考下
回復

使用道具 舉報

25#
ID:951099 發(fā)表于 2021-8-6 10:32 | 只看該作者
DIO = CY;  cy是什么
回復

使用道具 舉報

26#
ID:818864 發(fā)表于 2021-11-11 16:03 | 只看該作者
本帖最后由 什么都不懂啊 于 2021-11-11 19:07 編輯
這是單片機頭文件里面定義的一個數(shù)
sbit  CY                 =     PSW^7;
回復

使用道具 舉報

27#
ID:412814 發(fā)表于 2022-1-15 08:58 | 只看該作者
挺好的資料,學習了,謝謝樓主
回復

使用道具 舉報

28#
ID:101990 發(fā)表于 2022-1-18 21:12 | 只看該作者
學習一下!不錯的例程
回復

使用道具 舉報

29#
ID:884711 發(fā)表于 2022-8-30 15:29 | 只看該作者
哪位高手把四位數(shù)碼管分離成28個LED,用于分別指示28個按鍵的執(zhí)行情況可好
回復

使用道具 舉報

30#
ID:59884 發(fā)表于 2023-8-18 10:02 | 只看該作者
haide1998 發(fā)表于 2022-8-30 15:29
哪位高手把四位數(shù)碼管分離成28個LED,用于分別指示28個按鍵的執(zhí)行情況可好

如果我沒有理解錯,這個玩意用的是串行信號,對應地址的存儲單元位,對應著一個LED.對應關系IC說明書可查。唯一要弄明白的就是,串行信號的傳輸規(guī)則。
回復

使用道具 舉報

31#
ID:427868 發(fā)表于 2023-8-26 21:33 | 只看該作者
對比新舊版本規(guī)格書,發(fā)現(xiàn)舊版本TM1650的讀按鍵命令是0x49,而新版本的命令則是0x4F。新版本不能讀按鍵的可以修改一下試試(舊版本批號首位位是1,新版本批號首位是2).
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表