找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

TM1650驅(qū)動數(shù)碼管的STM32F103單片機(jī)程序

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:1115064 發(fā)表于 2024-4-5 20:14 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
最近用TM1650驅(qū)動的數(shù)碼管做了一個萬年歷,特地把TM1650的STM32驅(qū)動程序分享出來以供大家使用,親測可以用。。!
接線:
1.SCL接PB10;
2.SDA接PB11;
源程序如下:
tm1650.c:
  1. #include "stm32f10x.h"
  2. #include "sys_conf.h"
  3. #include <stdio.h>

  4. void DelayXms(unsigned int count)
  5. {
  6.         unsigned int i,j;
  7.          for(i=0; i<count; i++)
  8.          {
  9.                  //WatchDOG();
  10.                   for(j=0; j<7968; j++)
  11.                  {
  12.                          __NOP();
  13.       
  14.                  }
  15.                   
  16.          }         
  17. }


  18. void DelayXus(unsigned int count)
  19. {
  20.         unsigned int i,j;
  21.          for(i=0; i<count; i++)
  22.          {
  23.                   for(j=0; j<8; j++)
  24.                  {
  25.                          __NOP();
  26.                      
  27.                  }
  28.                   
  29.          }         
  30. }
  31. void IIC_Init(void)
  32. {
  33.         GPIO_InitTypeDef GPIO_InitStructure;

  34.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);


  35.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10|GPIO_Pin_11;
  36.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  37.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  38.         GPIO_Init(GPIOB, &GPIO_InitStructure);   
  39.   
  40.        
  41. }

  42. void SDA_IN(void)
  43. {
  44.         GPIO_InitTypeDef GPIO_InitStructure;       
  45.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);       
  46.         GPIO_InitStructure.GPIO_Pin = IIC_SDA_PIN;
  47.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
  48.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  49.         GPIO_Init(IIC_SDA_PORT,&GPIO_InitStructure);
  50. }

  51. void SDA_OUT(void)
  52. {
  53.         GPIO_InitTypeDef GPIO_InitStructure;       
  54.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);       
  55.         GPIO_InitStructure.GPIO_Pin = IIC_SDA_PIN;
  56.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  57.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  58.         GPIO_Init(IIC_SDA_PORT,&GPIO_InitStructure);
  59. }



  60. /***************************************************************************
  61.     - 功能描述:STM32f103 模擬IIC起始信號函數(shù)
  62.     - 隸屬模塊:STM32 IIC操作
  63.         - 函數(shù)屬性:外部,使用戶使用
  64.         - 參數(shù)說明:無
  65.         - 返回說明:無
  66.     - 函數(shù)實現(xiàn)步驟:
  67.                 (1)首先將SDA配置為輸出
  68.                 (2)在SCL為高電平期間,SDA有下降沿的變化
  69. ***************************************************************************/
  70. void IIC_Start(void)
  71. {
  72.         SDA_OUT();     //sda線輸出
  73.         Set_IIC_SDA;                    
  74.         Set_IIC_SCL;
  75.         DelayXus(4);
  76.         Clr_IIC_SDA;//START:when CLK is high,DATA change form high to low
  77.         DelayXus(4);
  78.         Clr_IIC_SCL;//鉗住I2C總線,準(zhǔn)備發(fā)送或接收數(shù)據(jù)
  79. }          
  80. /***************************************************************************
  81.     - 功能描述:STM32f103 模擬IIC終止信號函數(shù)
  82.     - 隸屬模塊:STM32 IIC操作
  83.         - 函數(shù)屬性:外部,使用戶使用
  84.         - 參數(shù)說明:無
  85.         - 返回說明:無
  86.     - 函數(shù)實現(xiàn)步驟:
  87.                 (1)首先將SDA配置為輸出
  88.                 (2)在SCL為高電平期間,SDA有上升沿的變化
  89. ***************************************************************************/
  90. void IIC_Stop(void)
  91. {
  92.         SDA_OUT();//sda線輸出
  93.         Clr_IIC_SCL;
  94.         Clr_IIC_SDA;//STOP:when CLK is high DATA change form low to high
  95.         DelayXus(4);
  96.         Set_IIC_SCL;
  97.         Set_IIC_SDA;//發(fā)送I2C總線結(jié)束信號
  98.         DelayXus(4);                                                                  
  99. }

  100. /***************************************************************************
  101.     - 功能描述:STM32f103 模擬IIC等待應(yīng)答函數(shù)
  102.     - 隸屬模塊:STM32 IIC操作
  103.         - 函數(shù)屬性:外部,使用戶使用
  104.         - 參數(shù)說明:無               
  105.         - 返回說明:返回值:1,接收應(yīng)答失敗;0,接收應(yīng)答成功
  106.     - 函數(shù)說明:
  107.                 (1)首先將SDA配置為輸入
  108.                 (2)如果返回0,表示接收應(yīng)答成功;如果為1,接收應(yīng)答失敗
  109.                 (3)注意在IIC_STOP()中        ,將SDA置為了輸出,所以再滿足250條件后,產(chǎn)中IIC停止線號,
  110.                          對輸出線SDA讀SDA輸入值是為0的,所以才退出循環(huán)。
  111. ***************************************************************************/
  112. u8 IIC_Wait_Ack(void)
  113. {
  114.         u8 ucErrTime=0;
  115.         SDA_IN();      //SDA設(shè)置為輸入  
  116.         Set_IIC_SDA;
  117.         DelayXus(1);          
  118.         Set_IIC_SCL;
  119.         DelayXus(1);         
  120.         while(READ_SDA)
  121.         {
  122.                 ucErrTime++;
  123.                 if(ucErrTime>250)
  124.                 {
  125.                         IIC_Stop();
  126.                         return 1;
  127.                 }
  128.         }
  129.         Clr_IIC_SCL;//時鐘輸出0           
  130.         return 0;  
  131. }
  132. /***************************************************************************
  133.     - 功能描述:STM32f103 模擬IIC應(yīng)答信號函數(shù)
  134.     - 隸屬模塊:STM32 IIC操作
  135.         - 函數(shù)屬性:外部,使用戶使用
  136.         - 參數(shù)說明:無
  137.         - 返回說明:無
  138.     - 函數(shù)實現(xiàn)步驟:
  139.                 (1)首先將SDA配置為輸出
  140.                 (2)在SCL的一個時鐘周期期間,SDA為低
  141. ***************************************************************************/
  142. //產(chǎn)生ACK應(yīng)答
  143. void IIC_Ack(void)
  144. {
  145.         Clr_IIC_SCL;
  146.         SDA_OUT();
  147.         Clr_IIC_SDA;
  148.         DelayXus(2);
  149.         Set_IIC_SCL;
  150.         DelayXus(2);
  151.         Clr_IIC_SCL;
  152. }
  153. /***************************************************************************
  154.     - 功能描述:STM32f103 模擬IIC不應(yīng)答信號函數(shù)
  155.     - 隸屬模塊:STM32 IIC操作
  156.         - 函數(shù)屬性:外部,使用戶使用
  157.         - 參數(shù)說明:無
  158.         - 返回說明:無
  159.     - 函數(shù)實現(xiàn)步驟:
  160.                 (1)首先將SDA配置為輸出
  161.                 (2)在SCL的一個時鐘周期期間,SDA為高電平
  162. ***************************************************************************/            
  163. void IIC_NAck(void)
  164. {
  165.         Clr_IIC_SCL;
  166.         SDA_OUT();
  167.         Set_IIC_SDA;
  168.         DelayXus(2);
  169.         Set_IIC_SCL;
  170.         DelayXus(2);
  171.         Clr_IIC_SCL;
  172. }                                                                              
  173. /***************************************************************************
  174.     - 功能描述:STM32f103 模擬IIC 發(fā)送一個字節(jié)函數(shù)
  175.     - 隸屬模塊:STM32 IIC操作
  176.         - 函數(shù)屬性:外部,使用戶使用
  177.         - 參數(shù)說明:無
  178.         - 返回說明:無
  179.     - 函數(shù)實現(xiàn)步驟:
  180.                 (1)首先將SDA配置為輸出
  181.                 (2)在SCL為低電平期間,置位SDA的數(shù)據(jù)為0或者1,延時后拉高SCL,取走數(shù)據(jù),循環(huán)8次
  182. ***************************************************************************/                  
  183. void IIC_Send_Byte(u8 txd)
  184. {                        
  185.     u8 t;   
  186.           SDA_OUT();             
  187.     Clr_IIC_SCL;//拉低時鐘開始數(shù)據(jù)傳輸
  188.     for(t=0;t<8;t++)
  189.     {              
  190.         //IIC_SDA=(txd&0x80)>>7;
  191.                 if ((txd&0x80)>>7)        
  192.                         Set_IIC_SDA;
  193.                 else Clr_IIC_SDA;
  194.                 txd<<=1;           
  195.                 DelayXus(2);   //對TEA5767這三個延時都是必須的
  196.                 Set_IIC_SCL;
  197.                 DelayXus(2);
  198.                 Clr_IIC_SCL;       
  199.                 DelayXus(2);
  200.     }         
  201. }

  202. /***************************************************************************
  203.     - 功能描述:STM32f103 模擬IIC 發(fā)送一個字節(jié)函數(shù)
  204.     - 隸屬模塊:STM32 IIC操作
  205.         - 函數(shù)屬性:外部,使用戶使用
  206.         - 參數(shù)說明:ack 用于決定是是否回應(yīng)ACK
  207.         - 返回說明:無
  208.     - 函數(shù)實現(xiàn)步驟:
  209.                 (1)首先將SDA配置為輸入
  210.                 (2)在SCL的一個時鐘周期后,讀SDA的數(shù)據(jù),保存在receive中
  211.                 (3)讀1個字節(jié),ack=1時,發(fā)送ACK,ack=0,發(fā)送nACK  

  212. ***************************************************************************/             
  213. u8 IIC_Read_Byte(unsigned char ack)
  214. {
  215.         unsigned char i,receive=0;
  216.         SDA_IN();//SDA設(shè)置為輸入
  217.             for(i=0;i<8;i++ )
  218.         {
  219.                 Clr_IIC_SCL;
  220.                 DelayXus(2);
  221.                             Set_IIC_SCL;
  222.                 receive<<=1;
  223.                 if(READ_SDA)receive++;   
  224.                         DelayXus(1);
  225.         }                                         
  226.         if (!ack)
  227.                 IIC_NAck();//發(fā)送nACK
  228.         else
  229.                 IIC_Ack(); //發(fā)送ACK   
  230.         return receive;
  231. }



  232. void TM1650_Set(unsigned char add,unsigned char dat) //數(shù)碼管顯示
  233. {
  234.    
  235.                 IIC_Start();       
  236.                 IIC_Send_Byte(add);       
  237.                 IIC_Ack();
  238.                 IIC_Send_Byte(dat);
  239.                 IIC_Ack();
  240.                 IIC_Stop();
  241. }

  242. void LCD_Init(void)
  243. {
  244.    IIC_Init();
  245.          TM1650_Set(0x48,0x01);  
  246. }
  247.        
  248. void LCD_Display(unsigned char state,unsigned int NUM)
  249. {
  250.   unsigned char CODE[20]  = {0xdd,0x05,0xb9,0xad,0x65,0xec,0xfc,0x85,0xfd,0xed,0xf5,0xfd,0xd8,0xdd,0xf8,0xf0,0x00}; //0~9  dot: +2
  251.                             //  0   1    2    3   4    5    6     7   8    9    A    B    C     D    E    F
  252.   unsigned char CODE1[20]  = {0x00,0x05,0xb9,0xad,0x65,0xec,0xfc,0x85,0xfd,0xed,0xf5,0xfd,0xd8,0xdd,0xf8,0xf0,0x00}; //0~9  dot: +2
  253.        
  254.         TM1650_Set(0x48,0x01);  
  255.         switch(state)
  256.   {
  257.     case led_normal:
  258.           TM1650_Set(0x68,CODE1[NUM/100]);
  259.                                         TM1650_Set(0x6A,CODE[NUM%100/10]+2);
  260.           TM1650_Set(0x6C,CODE[NUM%100%10]);
  261.     break;
  262.     case led_set1:
  263.                             if(timer_count < TIME_500MS)
  264.              TM1650_Set(0x68,CODE[1]+2);
  265.                                         else
  266.                                                  TM1650_Set(0x68,CODE[16]);
  267.                                                  
  268.           TM1650_Set(0x6A,CODE1[NUM/10]);
  269.           TM1650_Set(0x6C,CODE[NUM%10]+2);
  270.     break;
  271.     case led_set2:
  272.           if(timer_count < TIME_500MS)
  273.              TM1650_Set(0x68,CODE[2]+2);
  274.                                         else
  275.                                                  TM1650_Set(0x68,CODE[16]);
  276.           TM1650_Set(0x6A,CODE1[NUM/10]);
  277.           TM1650_Set(0x6C,CODE[NUM%10]+2);
  278.     break;
  279.     case led_error:
  280.           TM1650_Set(0x68,CODE[14]+2);
  281.           TM1650_Set(0x6A,CODE[NUM/10]);
  282.           TM1650_Set(0x6C,CODE[NUM%10]);
  283.     break;
  284.                 case led_no_dis:
  285.           TM1650_Set(0x68,CODE[11]);
  286.           TM1650_Set(0x6A,CODE[11]);
  287.           TM1650_Set(0x6C,CODE[11]);
  288.     break;
  289.     default:
  290.                             TM1650_Set(0x68,CODE1[8]+2);
  291.           TM1650_Set(0x6A,CODE1[8]+2);
  292.           TM1650_Set(0x6C,CODE1[8]+2);
  293.                         break;
  294.   }
  295. }



復(fù)制代碼

tm1650.h
  1. #ifndef _I2C_H  //宏定義,定義文件名稱
  2. #define _I2C_H

  3. /*---------------------------頭文件引用--------------------------------------*/
  4. #include "stm32f10x.h"
  5. #include "sys_conf.h"
  6. #include <stdio.h>

  7. #define IIC_SCL_PIN                       GPIO_Pin_10
  8. #define IIC_SCL_PORT                             GPIOB
  9. #define IIC_SCL_CLK                       RCC_APB2Periph_GPIOB

  10. #define IIC_SDA_PIN                       GPIO_Pin_11
  11. #define IIC_SDA_PORT                GPIOB
  12. #define IIC_SDA_CLK                 RCC_APB2Periph_GPIOB  



  13. /*********************************************************
  14.         - I2C宏定義:
  15.         - I2C時鐘操作:
  16.     - Set_IIC_SCL: 此處是將SCL拉為高電平
  17.         - Clr_IIC_SCL: 此處是將SCL拉為低電平
  18.         - 說明:通過這兩個宏定義就可以模擬IIC的時鐘電平SCL的高低變化了                          
  19. *********************************************************/
  20. #define Set_IIC_SCL  GPIO_SetBits(IIC_SCL_PORT,IIC_SCL_PIN)
  21. #define Clr_IIC_SCL  GPIO_ResetBits(IIC_SCL_PORT,IIC_SCL_PIN)


  22. /*********************************************************
  23.         - I2C宏定義:
  24.         - I2C數(shù)據(jù)線操作:
  25.     - Set_IIC_SDA: 此處是將SDA拉為高電平
  26.         - Clr_IIC_SDA: 此處是將SDA拉為低電平
  27.         - READ_SDA         : 此處是讀取SDA線上的位數(shù)據(jù)
  28.         - 說明:通過這兩個宏定義就可以模擬IIC的數(shù)據(jù)線SDA電平的高低變化了                          
  29. *********************************************************/
  30. #define Set_IIC_SDA  GPIO_SetBits(IIC_SDA_PORT,IIC_SDA_PIN)
  31. #define Clr_IIC_SDA  GPIO_ResetBits(IIC_SDA_PORT,IIC_SDA_PIN)
  32. #define READ_SDA     GPIO_ReadInputDataBit(IIC_SDA_PORT, IIC_SDA_PIN)









  33. /*********************************************************
  34.         - I2C模擬操作函數(shù)的聲明:          
  35. *********************************************************/
  36. //IIC所有操作函數(shù)
  37. void IIC_Init(void);                //初始化IIC的IO口                                 
  38. void IIC_Start(void);                                //發(fā)送IIC開始信號
  39. void IIC_Stop(void);                                  //發(fā)送IIC停止信號
  40. void IIC_Send_Byte(u8 txd);                        //IIC發(fā)送一個字節(jié)
  41. u8 IIC_Read_Byte(unsigned char ack);//IIC讀取一個字節(jié)
  42. u8 IIC_Wait_Ack(void);                                 //IIC等待ACK信號
  43. void IIC_Ack(void);                                        //IIC發(fā)送ACK信號
  44. void IIC_NAck(void);                                //IIC不發(fā)送ACK信號
  45. void LCD_Init(void);
  46. void SDA_IN(void);
  47. void SDA_OUT(void);
  48. void TM1650_Set(unsigned char add,unsigned char dat);//數(shù)碼管顯示
  49. void LCD_Display(unsigned char state,unsigned int NUM);
  50. #endif
復(fù)制代碼




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

使用道具 舉報

沙發(fā)
ID:302495 發(fā)表于 2025-1-12 20:28 | 只看該作者
學(xué)習(xí)了,真不錯
回復(fù)

使用道具 舉報

板凳
ID:163765 發(fā)表于 2025-1-19 18:35 | 只看該作者
謝謝樓主分享。
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

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