voidDelayXms(u" />

当前位置: 网站首页 > 技术应用 > 单片机应用 > 显示驱动

TM1650驱动数码管的STM32F103单片机程序

最近用TM1650驱动的数码管做了一个万年历,特地把TM1650的STM32驱动程序分享出来以供大家使用,亲测可以用!!!!
接线:
1.SCL接PB10;
2.SDA接PB11;
源程序如下:
tm1650.c:

 

  1. #include "stm32f10x.h"
  2. #include "sys_conf.h"
  3. #include
  4.  
  5. void DelayXms(unsigned int count)
  6. {
  7.         unsigned int i,j;
  8.          for(i=0; i
  9.          {
  10.                  //WatchDOG();
  11.                   for(j=0; j<7968; j++)
  12.                  {
  13.                          __NOP();
  14.       
  15.                  }
  16.                   
  17.          }         
  18. }
  19.  
  20.  
  21. void DelayXus(unsigned int count)
  22. {
  23.         unsigned int i,j;
  24.          for(i=0; i
  25.          {
  26.                   for(j=0; j<8; j++)
  27.                  {
  28.                          __NOP();
  29.                      
  30.                  }
  31.                   
  32.          }         
  33. }
  34. void IIC_Init(void)
  35. {
  36.         GPIO_InitTypeDef GPIO_InitStructure;
  37.  
  38.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
  39.  
  40.  
  41.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10|GPIO_Pin_11;
  42.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  43.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  44.         GPIO_Init(GPIOB, &GPIO_InitStructure);   
  45.   
  46.        
  47. }
  48.  
  49. void SDA_IN(void)
  50. {
  51.         GPIO_InitTypeDef GPIO_InitStructure;       
  52.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);       
  53.         GPIO_InitStructure.GPIO_Pin = IIC_SDA_PIN;
  54.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
  55.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  56.         GPIO_Init(IIC_SDA_PORT,&GPIO_InitStructure);
  57. }
  58.  
  59. void SDA_OUT(void)
  60. {
  61.         GPIO_InitTypeDef GPIO_InitStructure;       
  62.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);       
  63.         GPIO_InitStructure.GPIO_Pin = IIC_SDA_PIN;
  64.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  65.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  66.         GPIO_Init(IIC_SDA_PORT,&GPIO_InitStructure);
  67. }
  68.  
  69.  
  70.  
  71. /***************************************************************************
  72.     - 功能描述:STM32f103 模拟IIC起始信号函数
  73.     - 隶属模块:STM32 IIC操作
  74.         - 函数属性:外部,使用户使用
  75.         - 参数说明:无
  76.         - 返回说明:无
  77.     - 函数实现步骤:
  78.                 (1)首先将SDA配置为输出
  79.                 (2)在SCL为高电平期间,SDA有下降沿的变化
  80. ***************************************************************************/
  81. void IIC_Start(void)
  82. {
  83.         SDA_OUT();     //sda线输出
  84.         Set_IIC_SDA;                    
  85.         Set_IIC_SCL;
  86.         DelayXus(4);
  87.         Clr_IIC_SDA;//START:when CLK is high,DATA change form high to low
  88.         DelayXus(4);
  89.         Clr_IIC_SCL;//钳住I2C总线,准备发送或接收数据
  90. }          
  91. /***************************************************************************
  92.     - 功能描述:STM32f103 模拟IIC终止信号函数
  93.     - 隶属模块:STM32 IIC操作
  94.         - 函数属性:外部,使用户使用
  95.         - 参数说明:无
  96.         - 返回说明:无
  97.     - 函数实现步骤:
  98.                 (1)首先将SDA配置为输出
  99.                 (2)在SCL为高电平期间,SDA有上升沿的变化
  100. ***************************************************************************/
  101. void IIC_Stop(void)
  102. {
  103.         SDA_OUT();//sda线输出
  104.         Clr_IIC_SCL;
  105.         Clr_IIC_SDA;//STOP:when CLK is high DATA change form low to high
  106.         DelayXus(4);
  107.         Set_IIC_SCL;
  108.         Set_IIC_SDA;//发送I2C总线结束信号
  109.         DelayXus(4);                                                                  
  110. }
  111.  
  112. /***************************************************************************
  113.     - 功能描述:STM32f103 模拟IIC等待应答函数
  114.     - 隶属模块:STM32 IIC操作
  115.         - 函数属性:外部,使用户使用
  116.         - 参数说明:无               
  117.         - 返回说明:返回值:1,接收应答失败;0,接收应答成功
  118.     - 函数说明:
  119.                 (1)首先将SDA配置为输入
  120.                 (2)如果返回0,表示接收应答成功;如果为1,接收应答失败
  121.                 (3)注意在IIC_STOP()中        ,将SDA置为了输出,所以再满足250条件后,产中IIC停止线号,
  122.                          对输出线SDA读SDA输入值是为0的,所以才退出循环。
  123. ***************************************************************************/
  124. u8 IIC_Wait_Ack(void)
  125. {
  126.         u8 ucErrTime=0;
  127.         SDA_IN();      //SDA设置为输入  
  128.         Set_IIC_SDA;
  129.         DelayXus(1);          
  130.         Set_IIC_SCL;
  131.         DelayXus(1);         
  132.         while(READ_SDA)
  133.         {
  134.                 ucErrTime++;
  135.                 if(ucErrTime>250)
  136.                 {
  137.                         IIC_Stop();
  138.                         return 1;
  139.                 }
  140.         }
  141.         Clr_IIC_SCL;//时钟输出0           
  142.         return 0;  
  143. }
  144. /***************************************************************************
  145.     - 功能描述:STM32f103 模拟IIC应答信号函数
  146.     - 隶属模块:STM32 IIC操作
  147.         - 函数属性:外部,使用户使用
  148.         - 参数说明:无
  149.         - 返回说明:无
  150.     - 函数实现步骤:
  151.                 (1)首先将SDA配置为输出
  152.                 (2)在SCL的一个时钟周期期间,SDA为低
  153. ***************************************************************************/
  154. //产生ACK应答
  155. void IIC_Ack(void)
  156. {
  157.         Clr_IIC_SCL;
  158.         SDA_OUT();
  159.         Clr_IIC_SDA;
  160.         DelayXus(2);
  161.         Set_IIC_SCL;
  162.         DelayXus(2);
  163.         Clr_IIC_SCL;
  164. }
  165. /***************************************************************************
  166.     - 功能描述:STM32f103 模拟IIC不应答信号函数
  167.     - 隶属模块:STM32 IIC操作
  168.         - 函数属性:外部,使用户使用
  169.         - 参数说明:无
  170.         - 返回说明:无
  171.     - 函数实现步骤:
  172.                 (1)首先将SDA配置为输出
  173.                 (2)在SCL的一个时钟周期期间,SDA为高电平
  174. ***************************************************************************/            
  175. void IIC_NAck(void)
  176. {
  177.         Clr_IIC_SCL;
  178.         SDA_OUT();
  179.         Set_IIC_SDA;
  180.         DelayXus(2);
  181.         Set_IIC_SCL;
  182.         DelayXus(2);
  183.         Clr_IIC_SCL;
  184. }                                                                              
  185. /***************************************************************************
  186.     - 功能描述:STM32f103 模拟IIC 发送一个字节函数
  187.     - 隶属模块:STM32 IIC操作
  188.         - 函数属性:外部,使用户使用
  189.         - 参数说明:无
  190.         - 返回说明:无
  191.     - 函数实现步骤:
  192.                 (1)首先将SDA配置为输出
  193.                 (2)在SCL为低电平期间,置位SDA的数据为0或者1,延时后拉高SCL,取走数据,循环8次
  194. ***************************************************************************/                  
  195. void IIC_Send_Byte(u8 txd)
  196. {                        
  197.     u8 t;   
  198.           SDA_OUT();             
  199.     Clr_IIC_SCL;//拉低时钟开始数据传输
  200.     for(t=0;t<8;t++)
  201.     {              
  202.         //IIC_SDA=(txd&0x80)>>7;
  203.                 if ((txd&0x80)>>7)        
  204.                         Set_IIC_SDA;
  205.                 else Clr_IIC_SDA;
  206.                 txd<<=1;           
  207.                 DelayXus(2);   //对TEA5767这三个延时都是必须的
  208.                 Set_IIC_SCL;
  209.                 DelayXus(2);
  210.                 Clr_IIC_SCL;       
  211.                 DelayXus(2);
  212.     }         
  213. }
  214.  
  215. /***************************************************************************
  216.     - 功能描述:STM32f103 模拟IIC 发送一个字节函数
  217.     - 隶属模块:STM32 IIC操作
  218.         - 函数属性:外部,使用户使用
  219.         - 参数说明:ack 用于决定是是否回应ACK
  220.         - 返回说明:无
  221.     - 函数实现步骤:
  222.                 (1)首先将SDA配置为输入
  223.                 (2)在SCL的一个时钟周期后,读SDA的数据,保存在receive中
  224.                 (3)读1个字节,ack=1时,发送ACK,ack=0,发送nACK  
  225.  
  226. ***************************************************************************/             
  227. u8 IIC_Read_Byte(unsigned char ack)
  228. {
  229.         unsigned char i,receive=0;
  230.         SDA_IN();//SDA设置为输入
  231.             for(i=0;i<8;i++ )
  232.         {
  233.                 Clr_IIC_SCL;
  234.                 DelayXus(2);
  235.                             Set_IIC_SCL;
  236.                 receive<<=1;
  237.                 if(READ_SDA)receive++;   
  238.                         DelayXus(1);
  239.         }                                         
  240.         if (!ack)
  241.                 IIC_NAck();//发送nACK
  242.         else
  243.                 IIC_Ack(); //发送ACK   
  244.         return receive;
  245. }
  246.  
  247.  
  248.  
  249. void TM1650_Set(unsigned char add,unsigned char dat) //数码管显示
  250. {
  251.    
  252.                 IIC_Start();       
  253.                 IIC_Send_Byte(add);       
  254.                 IIC_Ack();
  255.                 IIC_Send_Byte(dat);
  256.                 IIC_Ack();
  257.                 IIC_Stop();
  258. }
  259.  
  260. void LCD_Init(void)
  261. {
  262.    IIC_Init();
  263.          TM1650_Set(0x48,0x01);  
  264. }
  265.        
  266. void LCD_Display(unsigned char state,unsigned int NUM)
  267. {
  268.   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
  269.                             //  0   1    2    3   4    5    6     7   8    9    A    B    C     D    E    F
  270.   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
  271.        
  272.         TM1650_Set(0x48,0x01);  
  273.         switch(state)
  274.   {
  275.     case led_normal:
  276.           TM1650_Set(0x68,CODE1[NUM/100]);
  277.                                         TM1650_Set(0x6A,CODE[NUM%100/10]+2);
  278.           TM1650_Set(0x6C,CODE[NUM%100%10]);
  279.     break;
  280.     case led_set1:
  281.                             if(timer_count < TIME_500MS)
  282.              TM1650_Set(0x68,CODE[1]+2);
  283.                                         else
  284.                                                  TM1650_Set(0x68,CODE[16]);
  285.                                                  
  286.           TM1650_Set(0x6A,CODE1[NUM/10]);
  287.           TM1650_Set(0x6C,CODE[NUM%10]+2);
  288.     break;
  289.     case led_set2:
  290.           if(timer_count < TIME_500MS)
  291.              TM1650_Set(0x68,CODE[2]+2);
  292.                                         else
  293.                                                  TM1650_Set(0x68,CODE[16]);
  294.           TM1650_Set(0x6A,CODE1[NUM/10]);
  295.           TM1650_Set(0x6C,CODE[NUM%10]+2);
  296.     break;
  297.     case led_error:
  298.           TM1650_Set(0x68,CODE[14]+2);
  299.           TM1650_Set(0x6A,CODE[NUM/10]);
  300.           TM1650_Set(0x6C,CODE[NUM%10]);
  301.     break;
  302.                 case led_no_dis:
  303.           TM1650_Set(0x68,CODE[11]);
  304.           TM1650_Set(0x6A,CODE[11]);
  305.           TM1650_Set(0x6C,CODE[11]);
  306.     break;
  307.     default:
  308.                             TM1650_Set(0x68,CODE1[8]+2);
  309.           TM1650_Set(0x6A,CODE1[8]+2);
  310.           TM1650_Set(0x6C,CODE1[8]+2);
  311.                         break;
  312.   }
  313. }
  314.  
  315.  

 

 

tm1650.h

 

  1. #ifndef _I2C_H  //宏定义,定义文件名称
  2. #define _I2C_H
  3.  
  4. /*---------------------------头文件引用--------------------------------------*/
  5. #include "stm32f10x.h"
  6. #include "sys_conf.h"
  7. #include
  8.  
  9. #define IIC_SCL_PIN                       GPIO_Pin_10
  10. #define IIC_SCL_PORT                             GPIOB
  11. #define IIC_SCL_CLK                       RCC_APB2Periph_GPIOB
  12.  
  13. #define IIC_SDA_PIN                       GPIO_Pin_11
  14. #define IIC_SDA_PORT                GPIOB
  15. #define IIC_SDA_CLK                 RCC_APB2Periph_GPIOB  
  16.  
  17.  
  18.  
  19. /*********************************************************
  20.         - I2C宏定义:
  21.         - I2C时钟操作:
  22.     - Set_IIC_SCL: 此处是将SCL拉为高电平
  23.         - Clr_IIC_SCL: 此处是将SCL拉为低电平
  24.         - 说明:通过这两个宏定义就可以模拟IIC的时钟电平SCL的高低变化了                          
  25. *********************************************************/
  26. #define Set_IIC_SCL  GPIO_SetBits(IIC_SCL_PORT,IIC_SCL_PIN)
  27. #define Clr_IIC_SCL  GPIO_ResetBits(IIC_SCL_PORT,IIC_SCL_PIN)
  28.  
  29.  
  30. /*********************************************************
  31.         - I2C宏定义:
  32.         - I2C数据线操作:
  33.     - Set_IIC_SDA: 此处是将SDA拉为高电平
  34.         - Clr_IIC_SDA: 此处是将SDA拉为低电平
  35.         - READ_SDA         : 此处是读取SDA线上的位数据
  36.         - 说明:通过这两个宏定义就可以模拟IIC的数据线SDA电平的高低变化了                          
  37. *********************************************************/
  38. #define Set_IIC_SDA  GPIO_SetBits(IIC_SDA_PORT,IIC_SDA_PIN)
  39. #define Clr_IIC_SDA  GPIO_ResetBits(IIC_SDA_PORT,IIC_SDA_PIN)
  40. #define READ_SDA     GPIO_ReadInputDataBit(IIC_SDA_PORT, IIC_SDA_PIN)
  41.  
  42.  
  43.  
  44.  
  45.  
  46.  
  47.  
  48.  
  49.  
  50. /*********************************************************
  51.         - I2C模拟操作函数的声明:          
  52. *********************************************************/
  53. //IIC所有操作函数
  54. void IIC_Init(void);                //初始化IIC的IO口                                 
  55. void IIC_Start(void);                                //发送IIC开始信号
  56. void IIC_Stop(void);                                  //发送IIC停止信号
  57. void IIC_Send_Byte(u8 txd);                        //IIC发送一个字节
  58. u8 IIC_Read_Byte(unsigned char ack);//IIC读取一个字节
  59. u8 IIC_Wait_Ack(void);                                 //IIC等待ACK信号
  60. void IIC_Ack(void);                                        //IIC发送ACK信号
  61. void IIC_NAck(void);                                //IIC不发送ACK信号
  62. void LCD_Init(void);
  63. void SDA_IN(void);
  64. void SDA_OUT(void);
  65. void TM1650_Set(unsigned char add,unsigned char dat);//数码管显示
  66. void LCD_Display(unsigned char state,unsigned int NUM);
  67. #endif
  68.  

 

点击次数:  【关闭
  • 壹零零单片机©版权所有 2008-2025 粤ICP备17151077号

Powered by  xinfuke  5.2.5 ©2008-2025  www.100mcu.com