|
最近用TM1650驅(qū)動的數(shù)碼管做了一個萬年歷,特地把TM1650的STM32驅(qū)動程序分享出來以供大家使用,親測可以用。。!
接線:
1.SCL接PB10;
2.SDA接PB11;
源程序如下:
tm1650.c:
- #include "stm32f10x.h"
- #include "sys_conf.h"
- #include <stdio.h>
- void DelayXms(unsigned int count)
- {
- unsigned int i,j;
- for(i=0; i<count; i++)
- {
- //WatchDOG();
- for(j=0; j<7968; j++)
- {
- __NOP();
-
- }
-
- }
- }
- void DelayXus(unsigned int count)
- {
- unsigned int i,j;
- for(i=0; i<count; i++)
- {
- for(j=0; j<8; j++)
- {
- __NOP();
-
- }
-
- }
- }
- void IIC_Init(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
-
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10|GPIO_Pin_11;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(GPIOB, &GPIO_InitStructure);
-
-
- }
- void SDA_IN(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
- GPIO_InitStructure.GPIO_Pin = IIC_SDA_PIN;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(IIC_SDA_PORT,&GPIO_InitStructure);
- }
- void SDA_OUT(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
- GPIO_InitStructure.GPIO_Pin = IIC_SDA_PIN;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(IIC_SDA_PORT,&GPIO_InitStructure);
- }
- /***************************************************************************
- - 功能描述:STM32f103 模擬IIC起始信號函數(shù)
- - 隸屬模塊:STM32 IIC操作
- - 函數(shù)屬性:外部,使用戶使用
- - 參數(shù)說明:無
- - 返回說明:無
- - 函數(shù)實現(xiàn)步驟:
- (1)首先將SDA配置為輸出
- (2)在SCL為高電平期間,SDA有下降沿的變化
- ***************************************************************************/
- void IIC_Start(void)
- {
- SDA_OUT(); //sda線輸出
- Set_IIC_SDA;
- Set_IIC_SCL;
- DelayXus(4);
- Clr_IIC_SDA;//START:when CLK is high,DATA change form high to low
- DelayXus(4);
- Clr_IIC_SCL;//鉗住I2C總線,準(zhǔn)備發(fā)送或接收數(shù)據(jù)
- }
- /***************************************************************************
- - 功能描述:STM32f103 模擬IIC終止信號函數(shù)
- - 隸屬模塊:STM32 IIC操作
- - 函數(shù)屬性:外部,使用戶使用
- - 參數(shù)說明:無
- - 返回說明:無
- - 函數(shù)實現(xiàn)步驟:
- (1)首先將SDA配置為輸出
- (2)在SCL為高電平期間,SDA有上升沿的變化
- ***************************************************************************/
- void IIC_Stop(void)
- {
- SDA_OUT();//sda線輸出
- Clr_IIC_SCL;
- Clr_IIC_SDA;//STOP:when CLK is high DATA change form low to high
- DelayXus(4);
- Set_IIC_SCL;
- Set_IIC_SDA;//發(fā)送I2C總線結(jié)束信號
- DelayXus(4);
- }
- /***************************************************************************
- - 功能描述:STM32f103 模擬IIC等待應(yīng)答函數(shù)
- - 隸屬模塊:STM32 IIC操作
- - 函數(shù)屬性:外部,使用戶使用
- - 參數(shù)說明:無
- - 返回說明:返回值:1,接收應(yīng)答失敗;0,接收應(yīng)答成功
- - 函數(shù)說明:
- (1)首先將SDA配置為輸入
- (2)如果返回0,表示接收應(yīng)答成功;如果為1,接收應(yīng)答失敗
- (3)注意在IIC_STOP()中 ,將SDA置為了輸出,所以再滿足250條件后,產(chǎn)中IIC停止線號,
- 對輸出線SDA讀SDA輸入值是為0的,所以才退出循環(huán)。
- ***************************************************************************/
- u8 IIC_Wait_Ack(void)
- {
- u8 ucErrTime=0;
- SDA_IN(); //SDA設(shè)置為輸入
- Set_IIC_SDA;
- DelayXus(1);
- Set_IIC_SCL;
- DelayXus(1);
- while(READ_SDA)
- {
- ucErrTime++;
- if(ucErrTime>250)
- {
- IIC_Stop();
- return 1;
- }
- }
- Clr_IIC_SCL;//時鐘輸出0
- return 0;
- }
- /***************************************************************************
- - 功能描述:STM32f103 模擬IIC應(yīng)答信號函數(shù)
- - 隸屬模塊:STM32 IIC操作
- - 函數(shù)屬性:外部,使用戶使用
- - 參數(shù)說明:無
- - 返回說明:無
- - 函數(shù)實現(xiàn)步驟:
- (1)首先將SDA配置為輸出
- (2)在SCL的一個時鐘周期期間,SDA為低
- ***************************************************************************/
- //產(chǎn)生ACK應(yīng)答
- void IIC_Ack(void)
- {
- Clr_IIC_SCL;
- SDA_OUT();
- Clr_IIC_SDA;
- DelayXus(2);
- Set_IIC_SCL;
- DelayXus(2);
- Clr_IIC_SCL;
- }
- /***************************************************************************
- - 功能描述:STM32f103 模擬IIC不應(yīng)答信號函數(shù)
- - 隸屬模塊:STM32 IIC操作
- - 函數(shù)屬性:外部,使用戶使用
- - 參數(shù)說明:無
- - 返回說明:無
- - 函數(shù)實現(xiàn)步驟:
- (1)首先將SDA配置為輸出
- (2)在SCL的一個時鐘周期期間,SDA為高電平
- ***************************************************************************/
- void IIC_NAck(void)
- {
- Clr_IIC_SCL;
- SDA_OUT();
- Set_IIC_SDA;
- DelayXus(2);
- Set_IIC_SCL;
- DelayXus(2);
- Clr_IIC_SCL;
- }
- /***************************************************************************
- - 功能描述:STM32f103 模擬IIC 發(fā)送一個字節(jié)函數(shù)
- - 隸屬模塊:STM32 IIC操作
- - 函數(shù)屬性:外部,使用戶使用
- - 參數(shù)說明:無
- - 返回說明:無
- - 函數(shù)實現(xiàn)步驟:
- (1)首先將SDA配置為輸出
- (2)在SCL為低電平期間,置位SDA的數(shù)據(jù)為0或者1,延時后拉高SCL,取走數(shù)據(jù),循環(huán)8次
- ***************************************************************************/
- void IIC_Send_Byte(u8 txd)
- {
- u8 t;
- SDA_OUT();
- Clr_IIC_SCL;//拉低時鐘開始數(shù)據(jù)傳輸
- for(t=0;t<8;t++)
- {
- //IIC_SDA=(txd&0x80)>>7;
- if ((txd&0x80)>>7)
- Set_IIC_SDA;
- else Clr_IIC_SDA;
- txd<<=1;
- DelayXus(2); //對TEA5767這三個延時都是必須的
- Set_IIC_SCL;
- DelayXus(2);
- Clr_IIC_SCL;
- DelayXus(2);
- }
- }
- /***************************************************************************
- - 功能描述:STM32f103 模擬IIC 發(fā)送一個字節(jié)函數(shù)
- - 隸屬模塊:STM32 IIC操作
- - 函數(shù)屬性:外部,使用戶使用
- - 參數(shù)說明:ack 用于決定是是否回應(yīng)ACK
- - 返回說明:無
- - 函數(shù)實現(xiàn)步驟:
- (1)首先將SDA配置為輸入
- (2)在SCL的一個時鐘周期后,讀SDA的數(shù)據(jù),保存在receive中
- (3)讀1個字節(jié),ack=1時,發(fā)送ACK,ack=0,發(fā)送nACK
- ***************************************************************************/
- u8 IIC_Read_Byte(unsigned char ack)
- {
- unsigned char i,receive=0;
- SDA_IN();//SDA設(shè)置為輸入
- for(i=0;i<8;i++ )
- {
- Clr_IIC_SCL;
- DelayXus(2);
- Set_IIC_SCL;
- receive<<=1;
- if(READ_SDA)receive++;
- DelayXus(1);
- }
- if (!ack)
- IIC_NAck();//發(fā)送nACK
- else
- IIC_Ack(); //發(fā)送ACK
- return receive;
- }
- void TM1650_Set(unsigned char add,unsigned char dat) //數(shù)碼管顯示
- {
-
- IIC_Start();
- IIC_Send_Byte(add);
- IIC_Ack();
- IIC_Send_Byte(dat);
- IIC_Ack();
- IIC_Stop();
- }
- void LCD_Init(void)
- {
- IIC_Init();
- TM1650_Set(0x48,0x01);
- }
-
- void LCD_Display(unsigned char state,unsigned int NUM)
- {
- 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
- // 0 1 2 3 4 5 6 7 8 9 A B C D E F
- 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
-
- TM1650_Set(0x48,0x01);
- switch(state)
- {
- case led_normal:
- TM1650_Set(0x68,CODE1[NUM/100]);
- TM1650_Set(0x6A,CODE[NUM%100/10]+2);
- TM1650_Set(0x6C,CODE[NUM%100%10]);
- break;
- case led_set1:
- if(timer_count < TIME_500MS)
- TM1650_Set(0x68,CODE[1]+2);
- else
- TM1650_Set(0x68,CODE[16]);
-
- TM1650_Set(0x6A,CODE1[NUM/10]);
- TM1650_Set(0x6C,CODE[NUM%10]+2);
- break;
- case led_set2:
- if(timer_count < TIME_500MS)
- TM1650_Set(0x68,CODE[2]+2);
- else
- TM1650_Set(0x68,CODE[16]);
- TM1650_Set(0x6A,CODE1[NUM/10]);
- TM1650_Set(0x6C,CODE[NUM%10]+2);
- break;
- case led_error:
- TM1650_Set(0x68,CODE[14]+2);
- TM1650_Set(0x6A,CODE[NUM/10]);
- TM1650_Set(0x6C,CODE[NUM%10]);
- break;
- case led_no_dis:
- TM1650_Set(0x68,CODE[11]);
- TM1650_Set(0x6A,CODE[11]);
- TM1650_Set(0x6C,CODE[11]);
- break;
- default:
- TM1650_Set(0x68,CODE1[8]+2);
- TM1650_Set(0x6A,CODE1[8]+2);
- TM1650_Set(0x6C,CODE1[8]+2);
- break;
- }
- }
復(fù)制代碼
tm1650.h- #ifndef _I2C_H //宏定義,定義文件名稱
- #define _I2C_H
- /*---------------------------頭文件引用--------------------------------------*/
- #include "stm32f10x.h"
- #include "sys_conf.h"
- #include <stdio.h>
- #define IIC_SCL_PIN GPIO_Pin_10
- #define IIC_SCL_PORT GPIOB
- #define IIC_SCL_CLK RCC_APB2Periph_GPIOB
- #define IIC_SDA_PIN GPIO_Pin_11
- #define IIC_SDA_PORT GPIOB
- #define IIC_SDA_CLK RCC_APB2Periph_GPIOB
-
- /*********************************************************
- - I2C宏定義:
- - I2C時鐘操作:
- - Set_IIC_SCL: 此處是將SCL拉為高電平
- - Clr_IIC_SCL: 此處是將SCL拉為低電平
- - 說明:通過這兩個宏定義就可以模擬IIC的時鐘電平SCL的高低變化了
- *********************************************************/
- #define Set_IIC_SCL GPIO_SetBits(IIC_SCL_PORT,IIC_SCL_PIN)
- #define Clr_IIC_SCL GPIO_ResetBits(IIC_SCL_PORT,IIC_SCL_PIN)
- /*********************************************************
- - I2C宏定義:
- - I2C數(shù)據(jù)線操作:
- - Set_IIC_SDA: 此處是將SDA拉為高電平
- - Clr_IIC_SDA: 此處是將SDA拉為低電平
- - READ_SDA : 此處是讀取SDA線上的位數(shù)據(jù)
- - 說明:通過這兩個宏定義就可以模擬IIC的數(shù)據(jù)線SDA電平的高低變化了
- *********************************************************/
- #define Set_IIC_SDA GPIO_SetBits(IIC_SDA_PORT,IIC_SDA_PIN)
- #define Clr_IIC_SDA GPIO_ResetBits(IIC_SDA_PORT,IIC_SDA_PIN)
- #define READ_SDA GPIO_ReadInputDataBit(IIC_SDA_PORT, IIC_SDA_PIN)
- /*********************************************************
- - I2C模擬操作函數(shù)的聲明:
- *********************************************************/
- //IIC所有操作函數(shù)
- void IIC_Init(void); //初始化IIC的IO口
- void IIC_Start(void); //發(fā)送IIC開始信號
- void IIC_Stop(void); //發(fā)送IIC停止信號
- void IIC_Send_Byte(u8 txd); //IIC發(fā)送一個字節(jié)
- u8 IIC_Read_Byte(unsigned char ack);//IIC讀取一個字節(jié)
- u8 IIC_Wait_Ack(void); //IIC等待ACK信號
- void IIC_Ack(void); //IIC發(fā)送ACK信號
- void IIC_NAck(void); //IIC不發(fā)送ACK信號
- void LCD_Init(void);
- void SDA_IN(void);
- void SDA_OUT(void);
- void TM1650_Set(unsigned char add,unsigned char dat);//數(shù)碼管顯示
- void LCD_Display(unsigned char state,unsigned int NUM);
- #endif
復(fù)制代碼
|
|