標(biāo)題: TM1650模塊單片機源程序(子函數(shù)) [打印本頁]

作者: zkele    時間: 2018-3-25 08:08
標(biāo)題: TM1650模塊單片機源程序(子函數(shù))
TM1650模塊子函數(shù),歡迎下載測試應(yīng)用. 取之于網(wǎng)絡(luò),分享給大家

單片機源程序如下:
  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. }
復(fù)制代碼

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



作者: liuminjun163    時間: 2018-9-17 20:12
這個程序不錯,找了好久總算找到合適的方案了
作者: liuzhengduo16    時間: 2018-10-22 15:02
我想問一下,我用賽元的MCU驅(qū)動的這個芯片,為什么按鍵掃描的時候按鍵沒有任何反應(yīng)呢
作者: shaoyoujing    時間: 2018-11-28 16:35
謝謝了
作者: tyghbn    時間: 2018-12-21 21:17
下來看看是否適合

作者: 安靜的麻瓜    時間: 2019-1-4 14:50
請問,這個是pic的還是51的,我是個新手  求指教呀
作者: zhp8363    時間: 2019-4-25 20:22
謝了!
作者: 11111114pl    時間: 2019-4-30 13:06
主函數(shù)部分沒有嗎     主要是按鍵掃描判斷       有點搞不懂
作者: 11111114pl    時間: 2019-4-30 13:06
安靜的麻瓜 發(fā)表于 2019-1-4 14:50
請問,這個是pic的還是51的,我是個新手  求指教呀

51的升級版   也屬于51
作者: xyqkos    時間: 2019-5-17 16:55
謝謝了
作者: Villain334    時間: 2019-5-27 14:53
很好,但是沒有黑幣了、、、
作者: yueqi    時間: 2019-7-3 13:12
!好東西
作者: 302976867    時間: 2019-7-26 16:05
謝樓主分享了。學(xué)習(xí)學(xué)習(xí)
作者: Erigo    時間: 2019-11-6 08:31
謝謝了
作者: 張寶寶    時間: 2020-1-11 20:40
liuzhengduo16 發(fā)表于 2018-10-22 15:02
我想問一下,我用賽元的MCU驅(qū)動的這個芯片,為什么按鍵掃描的時候按鍵沒有任何反應(yīng)呢

你的問題解決了嗎,我也要碰上SC的單片機,不能讀按鍵
作者: wzyin51_hei    時間: 2020-5-18 10:31
請問這款蕊片需要用戶主動掃描嗎?還是寫入數(shù)據(jù)后,蕊片自動刷新?
作者: xdb2724678    時間: 2020-6-27 22:30
正在找這個內(nèi)容,多謝樓主;
作者: fox1357    時間: 2020-8-1 16:42
正在看規(guī)格書寫1650的程序,還沒有拿到板子上面測試�?戳藰永绦�,對于有的師兄說按鍵掃描沒有反應(yīng),可能是有的單片機的端口輸入和輸出狀態(tài)要單獨設(shè)定,而樣例里面的單片機可能是不用設(shè)定的。
我這邊看規(guī)格書的時候也有個疑問,按鍵讀取的時候,只有一個字節(jié),又不區(qū)分地址,怎么能讀取28個按鍵呢?
問了代理,說是晚上回復(fù)。
作者: fox1357    時間: 2020-8-1 17:53
fox1357 發(fā)表于 2020-8-1 16:42
正在看規(guī)格書寫1650的程序,還沒有拿到板子上面測試�?戳藰永绦颍瑢τ谟械膸熜终f按鍵掃描沒有反應(yīng),可能 ...

我大概明白了,這個芯片無法判斷兩個按鍵,0-255只需要返回一個值,就代表某一個具體按鍵。
作者: 雪城    時間: 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; //設(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 ;                      //進(jìn)位標(biāo)志 溢出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();
    }
}
作者: 雪城    時間: 2020-10-11 11:24
fox1357 發(fā)表于 2020-8-1 16:42
正在看規(guī)格書寫1650的程序,還沒有拿到板子上面測試�?戳藰永绦�,對于有的師兄說按鍵掃描沒有反應(yīng),可能 ...

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

}
作者: 雪城    時間: 2020-10-11 11:25
liuzhengduo16 發(fā)表于 2018-10-22 15:02
我想問一下,我用賽元的MCU驅(qū)動的這個芯片,為什么按鍵掃描的時候按鍵沒有任何反應(yīng)呢

ASK錯了

作者: 287392351    時間: 2020-11-10 17:12
雪城 發(fā)表于 2020-10-11 11:24
ASK 是錯的  試試我改的
/************************************************************************* ...

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

這個數(shù)據(jù)端口位,在嗎定義的?
作者: 開蝸牛賽寶馬    時間: 2020-11-15 14:58
這個程序不錯,參考下
作者: shupeiyu    時間: 2021-8-6 10:32
DIO = CY;  cy是什么
作者: 什么都不懂啊    時間: 2021-11-11 16:03
本帖最后由 什么都不懂啊 于 2021-11-11 19:07 編輯
shupeiyu 發(fā)表于 2021-8-6 10:32
DIO = CY;  cy是什么
這是單片機頭文件里面定義的一個數(shù)
sbit  CY                 =     PSW^7;
作者: jifengjianwu    時間: 2022-1-15 08:58
挺好的資料,學(xué)習(xí)了,謝謝樓主
作者: li96261    時間: 2022-1-18 21:12
學(xué)習(xí)一下!不錯的例程
作者: haide1998    時間: 2022-8-30 15:29
哪位高手把四位數(shù)碼管分離成28個LED,用于分別指示28個按鍵的執(zhí)行情況可好
作者: 盛世游龍    時間: 2023-8-18 10:02
haide1998 發(fā)表于 2022-8-30 15:29
哪位高手把四位數(shù)碼管分離成28個LED,用于分別指示28個按鍵的執(zhí)行情況可好

如果我沒有理解錯,這個玩意用的是串行信號,對應(yīng)地址的存儲單元位,對應(yīng)著一個LED.對應(yīng)關(guān)系IC說明書可查。唯一要弄明白的就是,串行信號的傳輸規(guī)則。
作者: 劉佑紅    時間: 2023-8-26 21:33
對比新舊版本規(guī)格書,發(fā)現(xiàn)舊版本TM1650的讀按鍵命令是0x49,而新版本的命令則是0x4F。新版本不能讀按鍵的可以修改一下試試(舊版本批號首位位是1,新版本批號首位是2).




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1