找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 33738|回復(fù): 31
打印 上一主題 下一主題
收起左側(cè)

STC15W404S單片機(jī)TM1650芯片驅(qū)動(dòng)4位共陰數(shù)碼管驅(qū)動(dòng)程序

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
//使用STC15W404S單片機(jī)測(cè)試成功驅(qū)動(dòng)TM1650芯片的4位共陰數(shù)碼管顯示電路

//陳永飛于2016.1.18

#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint  unsigned int
sbit CLK = P3^2;
sbit DIO = P3^3;

#define CLK_H  CLK = 1
#define CLK_L  CLK = 0

#define DIO_H  DIO = 1
#define DIO_L  DIO = 0

void TM1650_Set(uchar add,uchar dat);
uchar Scan_Key(void);

uchar CODE[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //0~9顯示代碼

void main()
{
uchar key;
TM1650_Set(0x48,0x51);//為5級(jí)亮度,開(kāi)顯示八段顯示方式,后一個(gè)字節(jié)中高位用于亮度,低位用于七段或八段顯示方式和開(kāi)關(guān)顯示
                                   //如:0x71為七級(jí)亮度,八段顯示方式,開(kāi)顯示;0x79為為七級(jí)亮度,七段顯示方式,開(kāi)顯示
TM1650_Set(0x68,CODE[0]);
TM1650_Set(0x6A,CODE[5]);
TM1650_Set(0x6C,CODE[1]);
TM1650_Set(0x6E,CODE[4]);
while(1) ;
{
key = Scan_Key();
//第一個(gè)按鍵按下
if(key == 0x44)  //此鍵值和數(shù)據(jù)手冊(cè)上對(duì)應(yīng)
{
TM1650_Set(0x6E,CODE[1]);//顯示1
}
//第二個(gè)按鍵按下
if(key == 0x4c)
{
TM1650_Set(0x6E,CODE[2]);
}
//第三個(gè)按鍵按下

//TM1650_Set(0x6E,CODE[3]);

}
}
void Delay_us(uint i) //us延時(shí)
{
for(;i>0;i--)
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
}
void I2CStart(void)//開(kāi)始信號(hào)
{
CLK_H;
DIO_H;
Delay_us(5);
DIO_L;

}

void I2Cask(void) //ACK信號(hào)
{
uchar timeout = 1;
CLK_H;
Delay_us(5);
CLK_L;
while((DIO)&&(timeout<=100))
{
  timeout++;
}
Delay_us(5);
CLK_L;
}

void I2CStop(void) //停止信號(hào)
{
CLK_H;
DIO_L;
Delay_us(5);
DIO_H;
}

void I2CWrByte(uchar oneByte) //寫(xiě)一個(gè)字節(jié)高位在前,低位在后
{
uchar i;
CLK_L;
Delay_us(1);
for(i=0;i<8;i++)
{
oneByte = oneByte<<1;
DIO = CY;
CLK_L;
Delay_us(5);
CLK_H;
Delay_us(5);
CLK_L;
}
}

uchar Scan_Key(void)  // 按鍵掃描
{
uchar i;
uchar rekey;
I2CStart();
I2CWrByte(0x49);//讀按鍵命令
I2Cask();
//DIO_H;
for(i=0;i<8;i++)
{
   CLK_H;
   rekey = rekey<<1;
   if(DIO)
   {
   rekey++;
   }
   Delay_us(5);
   CLK_L;
}
I2Cask();
I2CStop();
return(rekey);
}


void TM1650_Set(uchar add,uchar dat) //數(shù)碼管顯示
{
//寫(xiě)顯存必須從高地址開(kāi)始寫(xiě)
I2CStart();
I2CWrByte(add); //第一個(gè)顯存地址
I2Cask();
I2CWrByte(dat);
I2Cask();
I2CStop();
}




分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏45 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

來(lái)自 2#
ID:664169 發(fā)表于 2022-1-2 16:52 | 只看該作者


TM1650_89s51_test.rar (44.46 KB, 下載次數(shù): 159)

感謝各位教導(dǎo),稍微再次修改了一下,做了一個(gè)計(jì)秒累加的動(dòng)態(tài)掃描顯示,稍微調(diào)整可以廣泛使用,以表回饋論壇壇友!

評(píng)分

參與人數(shù) 1黑幣 +40 收起 理由
admin + 40 回帖助人的獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

板凳
ID:16255 發(fā)表于 2018-5-5 19:07 | 只看該作者
非常好。!一點(diǎn)就亮。!
稍后調(diào)試一下程序,打算做一個(gè)小時(shí)鐘。

評(píng)分

參與人數(shù) 1黑幣 +60 收起 理由
admin + 60 回帖助人的獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

地板
ID:16255 發(fā)表于 2018-5-6 10:16 | 只看該作者
本帖最后由 mengsiu 于 2022-9-20 11:24 編輯

對(duì)樓主的程序作了點(diǎn)小修改,實(shí)際是方便我自己使用而已,修改內(nèi)容如下:
  • 簡(jiǎn)單封裝了一下,日后直接調(diào)用使用;
  • 簡(jiǎn)單排版了一下,方便閱讀;
  • 將“I2C”字眼替換掉,TM1650并不是完完全全的I2C器件,只是指令與I2C類同而已,也不能與I2C器件裝在同一線路上的;
  • 增加亮度參數(shù),可以修改亮度;(這次調(diào)試過(guò)程中,發(fā)現(xiàn)亮度1其實(shí)已經(jīng)很亮了)
  • …………


  1. /*--------------------------------------------------------------------------
  2. TM1650.H
  3. 四位數(shù)碼管驅(qū)動(dòng) TM1650 讀寫(xiě)程序
  4. --------------------------------------------------------------------------*/
  5. #ifndef __TM1650_H__
  6. #define __TM1650_H__

  7. sbit CLK = P3^7;
  8. sbit DIO = P3^6;

  9. void Set1650(uchar add,uchar dat);
  10. uchar Scan_Key(void);

  11. uchar BL = 1;          //亮度等級(jí)
  12. uchar CODE[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //0~9顯示代碼
  13.                                 // 0    1    2    3    4    5    6    7    8    9

  14. void Init1650(){
  15.         Set1650(0x48,(BL*16+0x01));//設(shè)定亮度,開(kāi)顯示八段顯示方式,后一個(gè)字節(jié)中高位用于亮度,低位用于七段或八段顯示方式和開(kāi)關(guān)顯
  16.                                                                 //如:0x71為七級(jí)亮度,八段顯示方式,開(kāi)顯示;0x79為為七級(jí)亮度,七段顯示方式,開(kāi)顯示
  17. }

  18. void Delay_us(uint i){ //us延時(shí)
  19.         for(;i>0;i--){
  20.                 _nop_();
  21.                 _nop_();
  22.                 _nop_();
  23.                 _nop_();
  24.                 _nop_();
  25.         }
  26. }

  27. void Start1650(void){//開(kāi)始信號(hào)
  28.         CLK = 1;
  29.         DIO = 1;
  30.         Delay_us(5);
  31.         DIO = 0;
  32. }

  33. void Ask1650(void){ //ACK信號(hào)
  34.         uchar timeout = 1;
  35.         CLK = 1;
  36.         Delay_us(5);
  37.         CLK = 0;
  38.         while((DIO)&&(timeout<=100)){
  39.                 timeout++;
  40.         }
  41.         Delay_us(5);
  42.         CLK = 0;
  43. }

  44. void Stop1650(void){ //停止信號(hào)
  45.         CLK = 1;
  46.         DIO = 0;
  47.         Delay_us(5);
  48.         DIO = 1;
  49. }

  50. void WrByte1650(uchar oneByte){//寫(xiě)一個(gè)字節(jié)高位在前,低位在后
  51.         uchar i;
  52.         CLK = 0;
  53.         Delay_us(1);
  54.         for(i=0;i<8;i++){
  55.                 oneByte = oneByte<<1;
  56.                 DIO = CY;
  57.                 CLK = 0;
  58.                 Delay_us(5);
  59.                 CLK = 1;
  60.                 Delay_us(5);
  61.                 CLK = 0;
  62.         }
  63. }

  64. uchar Scan_Key(void){  // 按鍵掃描
  65.         uchar i;
  66.         uchar rekey;
  67.         Start1650();
  68.         WrByte1650(0x49);//讀按鍵命令
  69.         Ask1650();
  70.         //DIO = 1;
  71.         for(i=0;i<8;i++){
  72.                 CLK = 1;
  73.                 rekey = rekey<<1;
  74.                 if(DIO){
  75.                 rekey++;
  76.                 }
  77.                 Delay_us(5);
  78.                 CLK = 0;
  79.         }
  80.         Ask1650();
  81.         Stop1650();
  82.         return(rekey);
  83. }

  84. void Set1650(uchar add,uchar dat){ //數(shù)碼管顯示
  85.                                                                 //寫(xiě)顯存必須從高地址開(kāi)始寫(xiě)
  86.         Start1650();
  87.         WrByte1650(add); //第一個(gè)顯存地址
  88.         Ask1650();
  89.         WrByte1650(dat);
  90.         Ask1650();
  91.         Stop1650();
  92. }

  93. #endif
復(fù)制代碼



回復(fù)

使用道具 舉報(bào)

5#
ID:611724 發(fā)表于 2019-9-15 17:19 | 只看該作者
這個(gè)好
回復(fù)

使用道具 舉報(bào)

6#
ID:97647 發(fā)表于 2019-12-2 16:09 | 只看該作者
main函數(shù)的while(1)后面有個(gè)分號(hào)
回復(fù)

使用道具 舉報(bào)

7#
ID:201314 發(fā)表于 2019-12-8 09:52 來(lái)自手機(jī) | 只看該作者
您好,能給一份STC15W404S外圍器件電路圖嗎,我不知道怎么選擇外圍器件
回復(fù)

使用道具 舉報(bào)

8#
ID:201314 發(fā)表于 2019-12-8 09:54 來(lái)自手機(jī) | 只看該作者
您好,能給一份STC15W404S電路圖嗎,郵箱1904382840@qq.com,謝謝
回復(fù)

使用道具 舉報(bào)

9#
ID:255919 發(fā)表于 2020-4-18 15:18 | 只看該作者
正在學(xué)習(xí),先謝謝了
回復(fù)

使用道具 舉報(bào)

10#
ID:255919 發(fā)表于 2020-4-18 15:20 | 只看該作者
很好,正在學(xué)習(xí)
回復(fù)

使用道具 舉報(bào)

11#
ID:387856 發(fā)表于 2020-5-28 17:08 | 只看該作者
一點(diǎn)就亮,感謝樓主,省了我好多時(shí)間
回復(fù)

使用道具 舉報(bào)

12#
ID:763616 發(fā)表于 2020-5-28 18:03 | 只看該作者
正在學(xué)習(xí),先謝謝了
回復(fù)

使用道具 舉報(bào)

13#
ID:791173 發(fā)表于 2020-6-28 20:24 | 只看該作者
感謝樓主,感謝2樓,正在學(xué)習(xí)這個(gè);
回復(fù)

使用道具 舉報(bào)

14#
ID:791173 發(fā)表于 2020-6-28 21:54 | 只看該作者
mengsiu 發(fā)表于 2018-5-6 10:16
對(duì)樓主的程序作了點(diǎn)小修改,實(shí)際是方便我自己使用而已,修改內(nèi)容如下:
  • 簡(jiǎn)單封裝了一下,日后直接調(diào) ...

  • 您好,我是剛開(kāi)始學(xué)習(xí)單片機(jī),您寫(xiě)這部分文件,整個(gè)定義成頭文件即可,是吧?
    回復(fù)

    使用道具 舉報(bào)

    15#
    ID:145411 發(fā)表于 2020-8-19 10:13 | 只看該作者
    DIO = CY;沒(méi)有理解什么意思,并在其他位置沒(méi)有找到CY定義
    回復(fù)

    使用道具 舉報(bào)

    16#
    ID:748096 發(fā)表于 2021-3-23 15:48 | 只看該作者
    lipengxu 發(fā)表于 2020-8-19 10:13
    DIO = CY;沒(méi)有理解什么意思,并在其他位置沒(méi)有找到CY定義

    CY在頭文件里。特殊功能寄存器PSW里面的CY進(jìn)位借位標(biāo)志位。
    回復(fù)

    使用道具 舉報(bào)

    17#
    ID:147434 發(fā)表于 2021-3-24 21:34 | 只看該作者
    受益匪淺
    回復(fù)

    使用道具 舉報(bào)

    18#
    ID:833875 發(fā)表于 2021-7-9 10:27 | 只看該作者
    ack信號(hào)最后一行CLK_L是不是應(yīng)該改成CLK_H???
    回復(fù)

    使用道具 舉報(bào)

    19#
    ID:934353 發(fā)表于 2021-7-12 15:04 | 只看該作者
    wb731464015 發(fā)表于 2021-7-9 10:27
    ack信號(hào)最后一行CLK_L是不是應(yīng)該改成CLK_H???

    就是CLK_L吧,看時(shí)序圖,CLK最后是拉低的
    回復(fù)

    使用道具 舉報(bào)

    20#
    ID:935976 發(fā)表于 2021-8-26 10:28 | 只看該作者
    mengsiu 發(fā)表于 2018-5-6 10:16
    對(duì)樓主的程序作了點(diǎn)小修改,實(shí)際是方便我自己使用而已,修改內(nèi)容如下:
  • 簡(jiǎn)單封裝了一下,日后直接調(diào) ...

  • 非常感謝
    回復(fù)

    使用道具 舉報(bào)

    21#
    ID:970326 發(fā)表于 2021-10-8 09:31 | 只看該作者
    大神。用stc 15w408as驅(qū)動(dòng)tm1640怎么寫(xiě)啊
    回復(fù)

    使用道具 舉報(bào)

    22#
    ID:974015 發(fā)表于 2021-10-29 19:52 | 只看該作者
    mengsiu 發(fā)表于 2018-5-6 10:16
    對(duì)樓主的程序作了點(diǎn)小修改,實(shí)際是方便我自己使用而已,修改內(nèi)容如下:
  • 簡(jiǎn)單封裝了一下,日后直接調(diào) ...

  • 這是真的牛,看了老哥的代碼,井井有條,封裝的還好,只要稍稍閱讀說(shuō)明書(shū)就可以對(duì)數(shù)碼管進(jìn)行準(zhǔn)確的調(diào)用。
    回復(fù)

    使用道具 舉報(bào)

    23#
    ID:970681 發(fā)表于 2021-12-16 16:22 | 只看該作者
    STC15W404S單片機(jī)TM1650芯片驅(qū)動(dòng)4位共陰數(shù)碼管驅(qū)動(dòng)程序 ,詳細(xì)的備注有嗎
    回復(fù)

    使用道具 舉報(bào)

    24#
    ID:646520 發(fā)表于 2022-7-13 13:14 | 只看該作者

    你好,我對(duì)這個(gè)I2Cask()函數(shù)有疑問(wèn),tm1650的官方手冊(cè)是傳輸完成后的第一個(gè)時(shí)鐘周期即應(yīng)答ACK,而該函數(shù)進(jìn)入后,延遲了一個(gè)時(shí)鐘周期應(yīng)答。并且在DIO拉低后,clk應(yīng)該給一個(gè)上升沿,而該函數(shù)在DIO拉低后沒(méi)有產(chǎn)生上升沿。




    屏幕截圖 2022-07-13 130928.png (53.27 KB, 下載次數(shù): 179)

    屏幕截圖 2022-07-13 130928.png
    回復(fù)

    使用道具 舉報(bào)

    25#
    ID:59884 發(fā)表于 2023-9-13 11:53 | 只看該作者
    受益匪淺!謝謝樓主分享!
    回復(fù)

    使用道具 舉報(bào)

    26#
    ID:1064915 發(fā)表于 2023-10-24 10:46 | 只看該作者
    將“I2C”字眼替換掉,更嚴(yán)謹(jǐn)
    回復(fù)

    使用道具 舉報(bào)

    27#
    ID:639666 發(fā)表于 2023-12-23 10:36 | 只看該作者
    joyb 發(fā)表于 2023-10-24 10:46
    將“I2C”字眼替換掉,更嚴(yán)謹(jǐn)

    不一定用Ⅰ2C的專用管肺腳來(lái)驅(qū)動(dòng)的,普通腳就可以驅(qū)動(dòng)了,對(duì)吧?
    回復(fù)

    使用道具 舉報(bào)

    28#
    ID:727062 發(fā)表于 2024-2-3 11:01 | 只看該作者
    非常感謝。已經(jīng)下載。測(cè)試很好用
    回復(fù)

    使用道具 舉報(bào)

    29#
    ID:1091450 發(fā)表于 2024-2-23 11:34 | 只看該作者
    滄興電子 發(fā)表于 2021-3-23 15:48
    CY在頭文件里。特殊功能寄存器PSW里面的CY進(jìn)位借位標(biāo)志位。

    你好,我想請(qǐng)教一下,如果使用的單片機(jī)中沒(méi)有這個(gè)寄存器怎么辦呢?,我想使用
    DIO = (oneByte & 0x80) ? 1 : 0;
    但是在使用中好像不可以...
    回復(fù)

    使用道具 舉報(bào)

    30#
    ID:727062 發(fā)表于 2024-2-23 19:50 | 只看該作者
    BL*16+0x01這句沒(méi)看懂
    回復(fù)

    使用道具 舉報(bào)

    31#
    ID:727062 發(fā)表于 2024-2-23 19:59 | 只看該作者
    最后一個(gè)夏天1 發(fā)表于 2022-7-13 13:14
    你好,我對(duì)這個(gè)I2Cask()函數(shù)有疑問(wèn),tm1650的官方手冊(cè)是傳輸完成后的第一個(gè)時(shí)鐘周期即應(yīng)答ACK,而該函數(shù)進(jìn) ...

    同問(wèn)
    回復(fù)

    使用道具 舉報(bào)

    32#
    ID:996773 發(fā)表于 2024-2-26 09:05 | 只看該作者
    剛剛寫(xiě)出1650的代碼,第9位ack完全可以不予理睬,單片機(jī)只要象征性的把時(shí)鐘端在8位數(shù)據(jù)

    傳送完后做一個(gè)上升沿再下降的波形就行了
    回復(fù)

    使用道具 舉報(bào)

    本版積分規(guī)則

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

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

    快速回復(fù) 返回頂部 返回列表