久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 33646|回復: 31
收起左側

STC15W404S單片機TM1650芯片驅動4位共陰數碼管驅動程序

  [復制鏈接]
ID:104287 發表于 2016-1-29 19:42 | 顯示全部樓層 |閱讀模式
//使用STC15W404S單片機測試成功驅動TM1650芯片的4位共陰數碼管顯示電路

//陳永飛于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級亮度,開顯示八段顯示方式,后一個字節中高位用于亮度,低位用于七段或八段顯示方式和開關顯示
                                   //如:0x71為七級亮度,八段顯示方式,開顯示;0x79為為七級亮度,七段顯示方式,開顯示
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();
//第一個按鍵按下
if(key == 0x44)  //此鍵值和數據手冊上對應
{
TM1650_Set(0x6E,CODE[1]);//顯示1
}
//第二個按鍵按下
if(key == 0x4c)
{
TM1650_Set(0x6E,CODE[2]);
}
//第三個按鍵按下

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

}
}
void Delay_us(uint i) //us延時
{
for(;i>0;i--)
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
}
void I2CStart(void)//開始信號
{
CLK_H;
DIO_H;
Delay_us(5);
DIO_L;

}

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

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

void I2CWrByte(uchar oneByte) //寫一個字節高位在前,低位在后
{
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) //數碼管顯示
{
//寫顯存必須從高地址開始寫
I2CStart();
I2CWrByte(add); //第一個顯存地址
I2Cask();
I2CWrByte(dat);
I2Cask();
I2CStop();
}




回復

使用道具 舉報

ID:664169 發表于 2022-1-2 16:52 | 顯示全部樓層


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

評分

參與人數 1黑幣 +40 收起 理由
admin + 40 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

ID:16255 發表于 2018-5-5 19:07 | 顯示全部樓層
非常好!!!一點就亮!!!
稍后調試一下程序,打算做一個小時鐘。
IMG_20180505_190309.jpg

評分

參與人數 1黑幣 +60 收起 理由
admin + 60 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

ID:16255 發表于 2018-5-6 10:16 | 顯示全部樓層
本帖最后由 mengsiu 于 2022-9-20 11:24 編輯

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


  1. /*--------------------------------------------------------------------------
  2. TM1650.H
  3. 四位數碼管驅動 TM1650 讀寫程序
  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;          //亮度等級
  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));//設定亮度,開顯示八段顯示方式,后一個字節中高位用于亮度,低位用于七段或八段顯示方式和開關顯
  16.                                                                 //如:0x71為七級亮度,八段顯示方式,開顯示;0x79為為七級亮度,七段顯示方式,開顯示
  17. }

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

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

  33. void Ask1650(void){ //ACK信號
  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){ //停止信號
  45.         CLK = 1;
  46.         DIO = 0;
  47.         Delay_us(5);
  48.         DIO = 1;
  49. }

  50. void WrByte1650(uchar oneByte){//寫一個字節高位在前,低位在后
  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){ //數碼管顯示
  85.                                                                 //寫顯存必須從高地址開始寫
  86.         Start1650();
  87.         WrByte1650(add); //第一個顯存地址
  88.         Ask1650();
  89.         WrByte1650(dat);
  90.         Ask1650();
  91.         Stop1650();
  92. }

  93. #endif
復制代碼



回復

使用道具 舉報

ID:611724 發表于 2019-9-15 17:19 | 顯示全部樓層
這個好
回復

使用道具 舉報

ID:97647 發表于 2019-12-2 16:09 | 顯示全部樓層
main函數的while(1)后面有個分號
回復

使用道具 舉報

ID:201314 發表于 2019-12-8 09:52 來自手機 | 顯示全部樓層
您好,能給一份STC15W404S外圍器件電路圖嗎,我不知道怎么選擇外圍器件
回復

使用道具 舉報

ID:201314 發表于 2019-12-8 09:54 來自手機 | 顯示全部樓層
您好,能給一份STC15W404S電路圖嗎,郵箱1904382840@qq.com,謝謝
回復

使用道具 舉報

ID:255919 發表于 2020-4-18 15:18 | 顯示全部樓層
正在學習,先謝謝了
回復

使用道具 舉報

ID:255919 發表于 2020-4-18 15:20 | 顯示全部樓層
很好,正在學習
回復

使用道具 舉報

ID:387856 發表于 2020-5-28 17:08 | 顯示全部樓層
一點就亮,感謝樓主,省了我好多時間
回復

使用道具 舉報

ID:763616 發表于 2020-5-28 18:03 | 顯示全部樓層
正在學習,先謝謝了
回復

使用道具 舉報

ID:791173 發表于 2020-6-28 20:24 | 顯示全部樓層
感謝樓主,感謝2樓,正在學習這個;
回復

使用道具 舉報

ID:791173 發表于 2020-6-28 21:54 | 顯示全部樓層
mengsiu 發表于 2018-5-6 10:16
對樓主的程序作了點小修改,實際是方便我自己使用而已,修改內容如下:
  • 簡單封裝了一下,日后直接調 ...

  • 您好,我是剛開始學習單片機,您寫這部分文件,整個定義成頭文件即可,是吧?
    回復

    使用道具 舉報

    ID:145411 發表于 2020-8-19 10:13 | 顯示全部樓層
    DIO = CY;沒有理解什么意思,并在其他位置沒有找到CY定義
    回復

    使用道具 舉報

    ID:748096 發表于 2021-3-23 15:48 | 顯示全部樓層
    lipengxu 發表于 2020-8-19 10:13
    DIO = CY;沒有理解什么意思,并在其他位置沒有找到CY定義

    CY在頭文件里。特殊功能寄存器PSW里面的CY進位借位標志位。
    回復

    使用道具 舉報

    ID:147434 發表于 2021-3-24 21:34 | 顯示全部樓層
    受益匪淺
    回復

    使用道具 舉報

    ID:833875 發表于 2021-7-9 10:27 | 顯示全部樓層
    ack信號最后一行CLK_L是不是應該改成CLK_H???
    回復

    使用道具 舉報

    ID:934353 發表于 2021-7-12 15:04 | 顯示全部樓層
    wb731464015 發表于 2021-7-9 10:27
    ack信號最后一行CLK_L是不是應該改成CLK_H???

    就是CLK_L吧,看時序圖,CLK最后是拉低的
    回復

    使用道具 舉報

    ID:935976 發表于 2021-8-26 10:28 | 顯示全部樓層
    mengsiu 發表于 2018-5-6 10:16
    對樓主的程序作了點小修改,實際是方便我自己使用而已,修改內容如下:
  • 簡單封裝了一下,日后直接調 ...

  • 非常感謝
    回復

    使用道具 舉報

    ID:970326 發表于 2021-10-8 09:31 | 顯示全部樓層
    大神。用stc 15w408as驅動tm1640怎么寫啊
    回復

    使用道具 舉報

    ID:974015 發表于 2021-10-29 19:52 | 顯示全部樓層
    mengsiu 發表于 2018-5-6 10:16
    對樓主的程序作了點小修改,實際是方便我自己使用而已,修改內容如下:
  • 簡單封裝了一下,日后直接調 ...

  • 這是真的牛,看了老哥的代碼,井井有條,封裝的還好,只要稍稍閱讀說明書就可以對數碼管進行準確的調用。
    回復

    使用道具 舉報

    ID:970681 發表于 2021-12-16 16:22 | 顯示全部樓層
    STC15W404S單片機TM1650芯片驅動4位共陰數碼管驅動程序 ,詳細的備注有嗎
    回復

    使用道具 舉報

    ID:646520 發表于 2022-7-13 13:14 | 顯示全部樓層

    你好,我對這個I2Cask()函數有疑問,tm1650的官方手冊是傳輸完成后的第一個時鐘周期即應答ACK,而該函數進入后,延遲了一個時鐘周期應答。并且在DIO拉低后,clk應該給一個上升沿,而該函數在DIO拉低后沒有產生上升沿。




    屏幕截圖 2022-07-13 130928.png
    回復

    使用道具 舉報

    ID:59884 發表于 2023-9-13 11:53 | 顯示全部樓層
    受益匪淺!謝謝樓主分享!
    回復

    使用道具 舉報

    ID:1064915 發表于 2023-10-24 10:46 | 顯示全部樓層
    將“I2C”字眼替換掉,更嚴謹
    回復

    使用道具 舉報

    ID:639666 發表于 2023-12-23 10:36 | 顯示全部樓層
    joyb 發表于 2023-10-24 10:46
    將“I2C”字眼替換掉,更嚴謹

    不一定用Ⅰ2C的專用管肺腳來驅動的,普通腳就可以驅動了,對吧?
    回復

    使用道具 舉報

    ID:727062 發表于 2024-2-3 11:01 | 顯示全部樓層
    非常感謝。已經下載。測試很好用
    回復

    使用道具 舉報

    ID:1091450 發表于 2024-2-23 11:34 | 顯示全部樓層
    滄興電子 發表于 2021-3-23 15:48
    CY在頭文件里。特殊功能寄存器PSW里面的CY進位借位標志位。

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

    使用道具 舉報

    ID:727062 發表于 2024-2-23 19:50 | 顯示全部樓層
    BL*16+0x01這句沒看懂
    回復

    使用道具 舉報

    ID:727062 發表于 2024-2-23 19:59 | 顯示全部樓層
    最后一個夏天1 發表于 2022-7-13 13:14
    你好,我對這個I2Cask()函數有疑問,tm1650的官方手冊是傳輸完成后的第一個時鐘周期即應答ACK,而該函數進 ...

    同問
    回復

    使用道具 舉報

    ID:996773 發表于 2024-2-26 09:05 | 顯示全部樓層
    剛剛寫出1650的代碼,第9位ack完全可以不予理睬,單片機只要象征性的把時鐘端在8位數據

    傳送完后做一個上升沿再下降的波形就行了
    回復

    使用道具 舉報

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

    本版積分規則

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

    Powered by 單片機教程網

    快速回復 返回頂部 返回列表
    主站蜘蛛池模板: 欧美一区二区小视频 | 久久人人国产 | 最近免费日本视频在线 | 国产毛片久久久久久久久春天 | 国产区久久 | 一区二区在线免费观看 | 欧美日韩在线不卡 | 9久久婷婷国产综合精品性色 | 精品国产乱码久久久久久蜜臀 | chinese中国真实乱对白 | 黄色片免费在线观看 | 亚洲一区二区三区乱码aⅴ 四虎在线视频 | 亚洲三级在线 | 91在线一区 | 国产一区二区三区在线 | 欧美亚洲日本 | 黄网站涩免费蜜桃网站 | 二区在线视频 | 国产精品区二区三区日本 | 日韩a视频 | 成人激情视频网 | 国产三级 | 久久精品二区 | 国内精品伊人久久久久网站 | 在线视频一区二区 | 日本xx视频免费观看 | 成人av片在线观看 | 天天躁日日躁aaaa视频 | 亚洲精品丝袜日韩 | 夜夜夜操 | www.久久影视| 日韩中文字幕在线视频 | 伊人久久综合影院 | 福利网址 | 精品视频一区二区 | 亚洲精品888| av一二三区| 精品欧美一区二区三区精品久久 | 日韩国产欧美一区 | 超碰97免费在线 | 国产97碰免费视频 |